use quote::quote; use crate::reflection::field::{generate as generate_field, ReflectionFieldGenOptions}; use crate::util::find_engine_crate_path; pub fn generate(input: syn::ItemStruct) -> proc_macro2::TokenStream { let engine_crate_path = find_engine_crate_path().unwrap(); let input_ident = input.ident; let (impl_generics, type_generics, where_clause) = input.generics.split_for_impl(); let fields = input .fields .into_iter() .enumerate() .map(|(field_index, field)| { generate_field( &field, field_index, &engine_crate_path, ReflectionFieldGenOptions { field_vis_override: None, gen_get_byte_offset: &|field| { if let Some(field_ident) = &field.ident { quote! { std::mem::offset_of!(Self, #field_ident) } } else { quote! { std::mem::offset_of!(Self, #field_index) } } }, }, ) }); quote! { unsafe impl #impl_generics #engine_crate_path::reflection::Reflection for #input_ident #type_generics #where_clause { const TYPE_REFLECTION: &#engine_crate_path::reflection::Type = &const { #engine_crate_path::reflection::Type::Struct( #engine_crate_path::reflection::Struct { fields: &[ #(#fields),* ] } ) }; } } }