diff options
| -rw-r--r-- | engine-macros/src/reflection/enum_impl.rs | 24 | ||||
| -rw-r--r-- | engine-reflection/src/lib.rs | 3 |
2 files changed, 26 insertions, 1 deletions
diff --git a/engine-macros/src/reflection/enum_impl.rs b/engine-macros/src/reflection/enum_impl.rs index a01ed8b..14142bf 100644 --- a/engine-macros/src/reflection/enum_impl.rs +++ b/engine-macros/src/reflection/enum_impl.rs @@ -218,6 +218,26 @@ pub fn generate(input: syn::ItemEnum) -> proc_macro2::TokenStream &engine_crate_path, ); + let discriminant_layout = if is_unit_only { + quote! { + std::alloc::Layout::new::<Self>() + } + } else { + quote! { + std::alloc::Layout::new::<#mod_name::Discriminant>() + } + }; + + let fields_layout = if is_unit_only { + quote! { + None + } + } else { + quote! { + Some(std::alloc::Layout::new::<#mod_name::Fields>()) + } + }; + quote! { #[doc(hidden)] mod #mod_name { @@ -232,7 +252,9 @@ pub fn generate(input: syn::ItemEnum) -> proc_macro2::TokenStream #engine_crate_path::reflection::Type::Enum( #engine_crate_path::reflection::Enum { variants: &[#(#variants),*], - is_unit_only: #is_unit_only + is_unit_only: #is_unit_only, + discriminant_layout: #discriminant_layout, + fields_layout: #fields_layout } ) }; diff --git a/engine-reflection/src/lib.rs b/engine-reflection/src/lib.rs index bad26df..c8b0004 100644 --- a/engine-reflection/src/lib.rs +++ b/engine-reflection/src/lib.rs @@ -80,6 +80,9 @@ pub struct Enum /// The enum only contains unit variants. pub is_unit_only: bool, + + pub discriminant_layout: Layout, + pub fields_layout: Option<Layout>, } #[derive(Debug, Clone)] |
