diff --git a/codegen/src/custom_type.rs b/codegen/src/custom_type.rs index fa182fa02..8b08af1fb 100644 --- a/codegen/src/custom_type.rs +++ b/codegen/src/custom_type.rs @@ -48,8 +48,8 @@ pub fn derive_custom_type_impl(input: DeriveInput) -> TokenStream { quote! { impl ::rhai::CustomType for #name { - fn build(builder: ::rhai::TypeBuilder<'_, Self>) { - #accessors + fn build(mut builder: ::rhai::TypeBuilder<'_, Self>) { + #accessors; } } } @@ -63,11 +63,11 @@ fn generate_accessor_fns( ) -> proc_macro2::TokenStream { let get = get .map(|func| quote! {#func}) - .unwrap_or_else(|| quote! {|obj| obj.#field.clone()}); + .unwrap_or_else(|| quote! {|obj: &mut Self| obj.#field.clone()}); let set = set .map(|func| quote! {#func}) - .unwrap_or_else(|| quote! {|obj, val| obj.#field = val}); + .unwrap_or_else(|| quote! {|obj: &mut Self, val| obj.#field = val}); if readonly { quote! { diff --git a/codegen/tests/test_derive.rs b/codegen/tests/test_derive.rs new file mode 100644 index 000000000..c24938284 --- /dev/null +++ b/codegen/tests/test_derive.rs @@ -0,0 +1,15 @@ +use rhai_codegen::CustomType; + +// Sanity check to make sure everything compiles +#[derive(Clone, CustomType)] +pub struct Foo { + #[get(get_bar)] + bar: i32, + #[readonly] + baz: String, + qux: Vec, +} + +fn get_bar(_this: &mut Foo) -> i32 { + 42 +}