diff options
author | simlay <simlay@users.noreply.github.com> | 2020-01-05 05:04:15 -0800 |
---|---|---|
committer | Emilio Cobos Álvarez <emilio@crisal.io> | 2020-01-05 14:04:15 +0100 |
commit | f39c4a95cbb92a3df2f68765b7b4648a51bb4402 (patch) | |
tree | 56fba368764620d40793bc1ad2651309273159cd /src/codegen/mod.rs | |
parent | 899f5992c78e461c22e904f3ecb8aa2d6ab1c28b (diff) |
An initial implementation of objective-c generics for #1259 (#1702)
Diffstat (limited to 'src/codegen/mod.rs')
-rw-r--r-- | src/codegen/mod.rs | 38 |
1 files changed, 32 insertions, 6 deletions
diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index f5e898ad..5ac8dc11 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -3728,18 +3728,44 @@ impl CodeGenerator for ObjCInterface { let trait_name = ctx.rust_ident(self.rust_name()); - let trait_block = quote! { - pub trait #trait_name { - #( #trait_items )* + let trait_block = if self.is_template() { + let template_names: Vec<Ident> = self + .template_names + .iter() + .map(|g| ctx.rust_ident(g)) + .collect(); + quote! { + pub trait #trait_name <#(#template_names),*>{ + #( #trait_items )* + } + } + } else { + quote! { + pub trait #trait_name { + #( #trait_items )* + } } }; let ty_for_impl = quote! { id }; - let impl_block = quote! { - impl #trait_name for #ty_for_impl { - #( #impl_items )* + let impl_block = if self.is_template() { + let template_names: Vec<Ident> = self + .template_names + .iter() + .map(|g| ctx.rust_ident(g)) + .collect(); + quote! { + impl <#(#template_names :'static),*> #trait_name <#(#template_names),*> for #ty_for_impl { + #( #impl_items )* + } + } + } else { + quote! { + impl #trait_name for #ty_for_impl { + #( #impl_items )* + } } }; |