Simplify derive_from_world (#17534)

# Objective

simplify existing implementation

---------

Co-authored-by: Gino Valente <49806985+MrGVSV@users.noreply.github.com>
This commit is contained in:
Tim Overbeek 2025-01-26 23:25:29 +01:00 committed by GitHub
parent 1612d210fb
commit eb04f8a476
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 9 additions and 27 deletions

View File

@ -14,7 +14,6 @@ bevy_macro_utils = { path = "../../bevy_macro_utils", version = "0.16.0-dev" }
syn = { version = "2.0", features = ["full"] } syn = { version = "2.0", features = ["full"] }
quote = "1.0" quote = "1.0"
proc-macro2 = "1.0" proc-macro2 = "1.0"
[lints] [lints]
workspace = true workspace = true

View File

@ -16,7 +16,7 @@ use proc_macro2::{Span, TokenStream as TokenStream2};
use quote::{format_ident, quote}; use quote::{format_ident, quote};
use syn::{ use syn::{
parse_macro_input, parse_quote, punctuated::Punctuated, spanned::Spanned, token::Comma, parse_macro_input, parse_quote, punctuated::Punctuated, spanned::Spanned, token::Comma,
ConstParam, Data, DataStruct, DeriveInput, GenericParam, Index, Token, TypeParam, ConstParam, Data, DataStruct, DeriveInput, GenericParam, Index, TypeParam,
}; };
enum BundleFieldKind { enum BundleFieldKind {
@ -632,7 +632,7 @@ pub fn derive_from_world(input: TokenStream) -> TokenStream {
None => { None => {
return syn::Error::new( return syn::Error::new(
Span::call_site(), Span::call_site(),
"No #[from_world] attribute was found on any of this enum's variants.", "No variant found with the `#[from_world]` attribute",
) )
.into_compile_error() .into_compile_error()
.into(); .into();
@ -650,37 +650,20 @@ pub fn derive_from_world(input: TokenStream) -> TokenStream {
}; };
let field_init_expr = quote!(#bevy_ecs_path::world::FromWorld::from_world(world)); let field_init_expr = quote!(#bevy_ecs_path::world::FromWorld::from_world(world));
let members = fields.members();
let field_initializers: Punctuated<TokenStream2, Token![,]> = match fields {
syn::Fields::Named(fields_named) => fields_named
.named
.iter()
.map(|field| {
let ident = field.ident.clone().unwrap();
quote!(#ident: #field_init_expr)
})
.collect(),
syn::Fields::Unnamed(fields_unnamed) => (0..fields_unnamed.unnamed.len())
.map(|index| quote!(#index: #field_init_expr))
.collect(),
syn::Fields::Unit => Punctuated::new(),
};
let field_initializers: TokenStream2 = if !field_initializers.is_empty() {
quote!({ #field_initializers })
} else {
quote!(#field_initializers)
};
let field_initializers = match variant_ident { let field_initializers = match variant_ident {
Some(variant_ident) => quote!( Self::#variant_ident #field_initializers), Some(variant_ident) => quote!( Self::#variant_ident {
None => quote!( Self #field_initializers), #(#members: #field_init_expr),*
}),
None => quote!( Self {
#(#members: #field_init_expr),*
}),
}; };
TokenStream::from(quote! { TokenStream::from(quote! {
impl #impl_generics #bevy_ecs_path::world::FromWorld for #name #ty_generics #where_clauses { impl #impl_generics #bevy_ecs_path::world::FromWorld for #name #ty_generics #where_clauses {
fn from_world(world: &mut #bevy_ecs_path::world::World) -> Self { fn from_world(world: &mut #bevy_ecs_path::world::World) -> Self {
#[allow(clippy::init_numbered_fields)]
#field_initializers #field_initializers
} }
} }