diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/codegen/mod.rs | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 4b51d216..7ae202bf 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -3806,7 +3806,7 @@ fn objc_method_codegen( } } else { let fn_args = fn_args.clone(); - let args = iter::once(quote! { self }).chain(fn_args.into_iter()); + let args = iter::once(quote! { &self }).chain(fn_args.into_iter()); quote! { ( #( #args ),* ) #fn_ret } @@ -3825,7 +3825,7 @@ fn objc_method_codegen( } } else { quote! { - msg_send!(self, #methods_and_args) + msg_send!(*self, #methods_and_args) } }; @@ -3901,7 +3901,7 @@ impl CodeGenerator for ObjCInterface { if !self.is_category() && !self.is_protocol() { let struct_block = quote! { #[repr(transparent)] - #[derive(Clone, Copy)] + #[derive(Clone)] pub struct #class_name(pub id); impl std::ops::Deref for #class_name { type Target = objc::runtime::Object; @@ -3962,6 +3962,17 @@ impl CodeGenerator for ObjCInterface { } }; result.push(impl_trait); + if !parent.is_template() { + let parent_struct_name = ctx.rust_ident(parent.name()); + let from_block = quote! { + impl From<#class_name> for #parent_struct_name { + fn from(child: #class_name) -> #parent_struct_name { + #parent_struct_name(child.0) + } + } + }; + result.push(from_block); + } parent.parent_class } else { None |