Fix generated setter and getter of public property alias in globals

We need to skip the generation of the local property so it directly
forward to the alias in the public property

Fixes #5855
ChangeLog: Fixed generated getter and setter of alias properties in globals
This commit is contained in:
Olivier Goffart 2024-09-11 08:35:38 +02:00 committed by GitHub
parent 388b504683
commit 7d446c98a0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 93 additions and 0 deletions

View file

@ -709,6 +709,9 @@ fn lower_global(
let mut functions = vec![];
for (p, x) in &global.root_element.borrow().property_declarations {
if x.is_alias.is_some() {
continue;
}
let property_index = properties.len();
let nr = NamedReference::new(&global.root_element, p);

View file

@ -68,6 +68,15 @@ impl<'a> PrettyPrinter<'a> {
DisplayExpression(&f.code, &ctx)
)?;
}
for (p1, p2) in &sc.two_way_bindings {
self.indent()?;
writeln!(
self.writer,
"{} <=> {};",
DisplayPropertyRef(p1, &ctx),
DisplayPropertyRef(p2, &ctx)
)?
}
for (p, init) in &sc.property_init {
self.indent()?;
writeln!(

View file

@ -0,0 +1,81 @@
// Copyright © SixtyFPS GmbH <info@slint.dev>
// SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-2.0 OR LicenseRef-Slint-Software-3.0
export global G1 {
in-out property <int> data: 42;
}
export global G2 {
in-out property <int> data <=> G1.data;
}
export component TestCase inherits Window {
out property <int> d1: G1.data;
out property <int> d2: G2.data;
out property <bool> test: G2.data == 42;
}
/*
```rust
let instance = TestCase::new().unwrap();
assert!(instance.get_test());
assert_eq!(G1::get(&instance).get_data(), 42);
assert_eq!(G2::get(&instance).get_data(), 42);
assert_eq!(instance.get_d1(), 42);
assert_eq!(instance.get_d2(), 42);
instance.global::<G1<'_>>().set_data(100);
assert_eq!(G1::get(&instance).get_data(), 100);
assert_eq!(G2::get(&instance).get_data(), 100);
assert_eq!(instance.get_d1(), 100);
assert_eq!(instance.get_d2(), 100);
instance.global::<G2<'_>>().set_data(-1);
assert_eq!(G1::get(&instance).get_data(), -1);
assert_eq!(G2::get(&instance).get_data(), -1);
assert_eq!(instance.get_d1(), -1);
assert_eq!(instance.get_d2(), -1);
```
```cpp
auto handle = TestCase::create();
const TestCase &instance = *handle;
assert(instance.get_test());
assert_eq(instance.global<G1>().get_data(), 42);
assert_eq(instance.global<G2>().get_data(), 42);
assert_eq(instance.get_d1(), 42);
assert_eq(instance.get_d2(), 42);
instance.global<G1>().set_data(100);
assert_eq(instance.global<G1>().get_data(), 100);
assert_eq(instance.global<G2>().get_data(), 100);
assert_eq(instance.get_d1(), 100);
assert_eq(instance.get_d2(), 100);
instance.global<G2>().set_data(-1);
assert_eq(instance.global<G1>().get_data(), -1);
assert_eq(instance.global<G2>().get_data(), -1);
assert_eq(instance.get_d1(), -1);
assert_eq(instance.get_d2(), -1);
```
```js
let instance = new slint.TestCase({});
assert(instance.test);
assert.equal(instance.G1.data, 42);
assert.equal(instance.G2.data, 42);
assert.equal(instance.d1, 42);
assert.equal(instance.d2, 42);
instance.G1.data = 100;
assert.equal(instance.G1.data, 100);
assert.equal(instance.G2.data, 100);
assert.equal(instance.d1, 100);
assert.equal(instance.d2, 100);
instance.G2.data = -1;
assert.equal(instance.G1.data, -1);
assert.equal(instance.G2.data, -1);
assert.equal(instance.d1, -1);
assert.equal(instance.d2, -1);
```
*/