diff --git a/lua_typed_macro/src/lib.rs b/lua_typed_macro/src/lib.rs index dc1ce10..d1f8a0d 100644 --- a/lua_typed_macro/src/lib.rs +++ b/lua_typed_macro/src/lib.rs @@ -353,6 +353,8 @@ fn typed_inner(ast: DeriveInput) -> syn::Result { let name = ast.ident; let mut as_name = LitStr::new(&name.to_string(), name.span()); + let generics = &ast.generics; + let mut case = None; let mut tag = None; for attr in &ast.attrs { @@ -412,9 +414,19 @@ fn typed_inner(ast: DeriveInput) -> syn::Result { )); } + let generics_name: TokenStream2 = generics + .type_params() + .map(|ty| { + let ident = &ty.ident; + quote! { + + &#ident::type_name() + } + }) + .collect(); + let type_name_fn = quote! { fn type_name() -> ::std::string::String { - #as_name.to_string() + #as_name.to_string() #generics_name } }; @@ -432,8 +444,10 @@ fn typed_inner(ast: DeriveInput) -> syn::Result { } }; + let (impl_generics, ty_generics, where_clause) = generics.split_for_impl(); + Ok(quote! { - impl ::lua_typed::Typed for #name { + impl #impl_generics ::lua_typed::Typed for #name #ty_generics #where_clause { #type_name_fn #definitions