bevy_reflect: streamline generated FromReflect::from_reflect (#19906)
# Objective
Generated `from_reflect` methods use closures in a weird way, e.g.:
```rust
x: (|| {
<f32 as ::bevy::reflect::FromReflect>::from_reflect(
::bevy::reflect::Struct::field(__ref_struct, "x")?,
)
})()?,
```
The reason for this is because when `#[reflect(Default)]` is used, you
instead get stuff like this:
```rust
if let ::core::option::Option::Some(__field) = (|| {
<f32 as ::bevy::reflect::FromReflect>::from_reflect(
::bevy::reflect::Struct::field(__ref_struct, "x")?,
)
})() {
__this.x = __field;
}
```
and the closure is necessary to contain the scope of the `?`. But the
first case is more common.
Helps with #19873.
## Solution
Avoid the closure in the common case.
## Testing
I used cargo expand to confirm the closures are no longer produced in
the common case.
`-Zmacro-stats` output tells me this reduces the size of the `Reflect`
code produced for `bevy_ui` by 0.5%.
This commit is contained in:
parent
f95f42b44a
commit
1b4cf02fc8
@ -146,7 +146,8 @@ fn impl_struct_internal(
|
||||
quote! {
|
||||
let mut #__this = <#reflect_ty as #FQDefault>::default();
|
||||
#(
|
||||
if let #fqoption::Some(__field) = #active_values() {
|
||||
// The closure catches any failing `?` within `active_values`.
|
||||
if let #fqoption::Some(__field) = (|| #active_values)() {
|
||||
// Iff field exists -> use its value
|
||||
#__this.#active_members = __field;
|
||||
}
|
||||
@ -158,7 +159,7 @@ fn impl_struct_internal(
|
||||
|
||||
quote! {
|
||||
let #__this = #constructor {
|
||||
#(#active_members: #active_values()?,)*
|
||||
#(#active_members: #active_values?,)*
|
||||
#(#ignored_members: #ignored_values,)*
|
||||
};
|
||||
#FQOption::Some(#retval)
|
||||
@ -274,13 +275,11 @@ fn get_active_fields(
|
||||
<#ty as #bevy_reflect_path::FromReflect>::from_reflect(field)
|
||||
});
|
||||
quote! {
|
||||
(||
|
||||
if let #FQOption::Some(field) = #get_field {
|
||||
#value
|
||||
} else {
|
||||
#FQOption::Some(#path())
|
||||
}
|
||||
)
|
||||
if let #FQOption::Some(field) = #get_field {
|
||||
#value
|
||||
} else {
|
||||
#FQOption::Some(#path())
|
||||
}
|
||||
}
|
||||
}
|
||||
DefaultBehavior::Default => {
|
||||
@ -288,13 +287,11 @@ fn get_active_fields(
|
||||
<#ty as #bevy_reflect_path::FromReflect>::from_reflect(field)
|
||||
});
|
||||
quote! {
|
||||
(||
|
||||
if let #FQOption::Some(field) = #get_field {
|
||||
#value
|
||||
} else {
|
||||
#FQOption::Some(#FQDefault::default())
|
||||
}
|
||||
)
|
||||
if let #FQOption::Some(field) = #get_field {
|
||||
#value
|
||||
} else {
|
||||
#FQOption::Some(#FQDefault::default())
|
||||
}
|
||||
}
|
||||
}
|
||||
DefaultBehavior::Required => {
|
||||
@ -302,7 +299,7 @@ fn get_active_fields(
|
||||
<#ty as #bevy_reflect_path::FromReflect>::from_reflect(#get_field?)
|
||||
});
|
||||
quote! {
|
||||
(|| #value)
|
||||
#value
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Loading…
Reference in New Issue
Block a user