Skip to content

Commit 0d38c9a

Browse files
authored
Merge pull request #961 from ranfdev/props_infer
properties: correctly type check value returned by the getter fn
2 parents c5b05d7 + c8fb2a3 commit 0d38c9a

File tree

2 files changed

+10
-1
lines changed

2 files changed

+10
-1
lines changed

glib-macros/src/properties.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,7 @@ fn expand_property_fn(props: &[PropDesc]) -> TokenStream2 {
312312
field_ident,
313313
member,
314314
get,
315+
ty,
315316
..
316317
} = p;
317318

@@ -320,7 +321,10 @@ fn expand_property_fn(props: &[PropDesc]) -> TokenStream2 {
320321
get.as_ref().map(|get| {
321322
let body = match (member, get) {
322323
(_, MaybeCustomFn::Custom(expr)) => quote!(
323-
DerivedPropertiesEnum::#enum_ident => ::std::convert::From::from((#expr)(&self))
324+
DerivedPropertiesEnum::#enum_ident => {
325+
let value: <#ty as #crate_ident::Property>::Value = (#expr)(&self);
326+
::std::convert::From::from(value)
327+
}
324328
),
325329
(None, MaybeCustomFn::Default) => quote!(
326330
DerivedPropertiesEnum::#enum_ident =>

glib-macros/tests/properties.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ fn props() {
4545
bar: Mutex<String>,
4646
#[property(get, set)]
4747
double: RefCell<f64>,
48+
#[property(get = |_| 42.0, set)]
49+
infer_inline_type: RefCell<f64>,
4850
// The following property doesn't store any data. The value of the property is calculated
4951
// when the value is accessed.
5052
#[property(get = Self::hello_world)]
@@ -231,6 +233,9 @@ fn props() {
231233
myfoo.set_double(0.1);
232234
assert_eq!(myfoo.property::<f64>("double"), 0.1);
233235

236+
myfoo.set_infer_inline_type(42.0);
237+
assert_eq!(myfoo.property::<f64>("infer-inline-type"), 42.0);
238+
234239
// simple with various String types
235240
myfoo.set_bar(String::from("setter working"));
236241
myfoo.set_bar(glib::GString::from("setter working"));

0 commit comments

Comments
 (0)