diff --git a/derive/src/lib.rs b/derive/src/lib.rs index 7ba60a7e..f7cae75b 100644 --- a/derive/src/lib.rs +++ b/derive/src/lib.rs @@ -74,18 +74,14 @@ fn generate(input: TokenStream2) -> Result { } fn generate_type(input: TokenStream2) -> Result { - let mut ast: DeriveInput = syn::parse2(input.clone())?; + let ast: DeriveInput = syn::parse2(input.clone())?; let scale_info = crate_name_ident("scale-info")?; let parity_scale_codec = crate_name_ident("parity-scale-codec")?; let ident = &ast.ident; - ast.generics - .lifetimes_mut() - .for_each(|l| *l = parse_quote!('static)); - - let (_, ty_generics, _) = ast.generics.split_for_impl(); + let (impl_generics, ty_generics, _) = ast.generics.split_for_impl(); let where_clause = trait_bounds::make_where_clause( ident, &ast.generics, @@ -101,15 +97,13 @@ fn generate_type(input: TokenStream2) -> Result { } }); - let ast: DeriveInput = syn::parse2(input.clone())?; let build_type = match &ast.data { Data::Struct(ref s) => generate_composite_type(s, &scale_info), Data::Enum(ref e) => generate_variant_type(e, &scale_info), Data::Union(_) => return Err(Error::new_spanned(input, "Unions not supported")), }; - let generic_types = ast.generics.type_params(); let type_info_impl = quote! { - impl <#( #generic_types ),*> :: #scale_info ::TypeInfo for #ident #ty_generics #where_clause { + impl #impl_generics :: #scale_info ::TypeInfo for #ident #ty_generics #where_clause { type Identity = Self; fn type_info() -> :: #scale_info ::Type { :: #scale_info ::Type::builder() diff --git a/derive/src/trait_bounds.rs b/derive/src/trait_bounds.rs index 8a64dd85..e988c450 100644 --- a/derive/src/trait_bounds.rs +++ b/derive/src/trait_bounds.rs @@ -41,6 +41,11 @@ pub fn make_where_clause<'a>( predicates: Punctuated::new(), } }); + for lifetime in generics.lifetimes() { + where_clause + .predicates + .push(parse_quote!(#lifetime: 'static)) + } let type_params = generics.type_params(); let ty_params_ids = type_params diff --git a/test_suite/tests/derive.rs b/test_suite/tests/derive.rs index 55676c12..b6a1bdb0 100644 --- a/test_suite/tests/derive.rs +++ b/test_suite/tests/derive.rs @@ -280,6 +280,31 @@ fn scale_compact_types_work_in_enums() { assert_type!(MutilatedMultiAddress, ty); } +#[test] +fn type_parameters_with_default_bound_works() { + trait Formy { + type Tip; + } + #[derive(TypeInfo)] + pub enum MetaFormy {} + impl Formy for MetaFormy { + type Tip = u8; + } + + #[allow(unused)] + #[derive(TypeInfo)] + struct Bat { + one: TTT, + } + + let ty = Type::builder() + .path(Path::new("Bat", "derive")) + .type_params(tuple_meta_type!(MetaFormy)) + .composite(Fields::named().field_of::("one", "TTT")); + + assert_type!(Bat, ty); +} + #[test] fn whitespace_scrubbing_works() { #[allow(unused)]