summaryrefslogtreecommitdiff
path: root/engine-macros/src/reflection/field.rs
diff options
context:
space:
mode:
Diffstat (limited to 'engine-macros/src/reflection/field.rs')
-rw-r--r--engine-macros/src/reflection/field.rs16
1 files changed, 4 insertions, 12 deletions
diff --git a/engine-macros/src/reflection/field.rs b/engine-macros/src/reflection/field.rs
index 489d165..8572875 100644
--- a/engine-macros/src/reflection/field.rs
+++ b/engine-macros/src/reflection/field.rs
@@ -2,17 +2,17 @@ use quote::{quote, ToTokens};
use crate::reflection::visibility::generate as generate_visibility;
-pub struct ReflectionFieldGenOptions
+pub struct ReflectionFieldGenOptions<'a>
{
pub field_vis_override: Option<syn::Visibility>,
- pub include_byte_offset: bool,
+ pub gen_get_byte_offset: &'a dyn Fn(&syn::Field) -> proc_macro2::TokenStream,
}
pub fn generate(
field: &syn::Field,
field_index: usize,
engine_crate_path: &syn::Path,
- options: ReflectionFieldGenOptions,
+ options: ReflectionFieldGenOptions<'_>,
) -> proc_macro2::TokenStream
{
let field_ident = &field.ident;
@@ -27,15 +27,7 @@ pub fn generate(
quote! { None }
};
- let field_byte_offset = if options.include_byte_offset {
- if let Some(field_ident) = field_ident {
- quote! { Some(std::mem::offset_of!(Self, #field_ident)) }
- } else {
- quote! { Some(std::mem::offset_of!(Self, #field_index)) }
- }
- } else {
- quote! { None }
- };
+ let field_byte_offset = (options.gen_get_byte_offset)(field);
// since std::any::type_name as const is not stable yet
let field_type_name = field_type.to_token_stream().to_string();