summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2026-06-13 18:32:07 +0200
committerHampusM <hampus@hampusmat.com>2026-06-13 18:32:07 +0200
commit5cdb4b0adb55cf2995e999135c5f3e9d6da70843 (patch)
tree9a0fa0fc2f01546ac812061febd377262d097204
parent6107d9b8f6c02f4a0dbca081d7e028ec77f1c84b (diff)
feat(engine): add discriminant & fields layouts to enum reflectionHEADmaster
-rw-r--r--engine-macros/src/reflection/enum_impl.rs24
-rw-r--r--engine-reflection/src/lib.rs3
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)]