From 16d80a97c86acdef535f8bfd09d689f8d545d993 Mon Sep 17 00:00:00 2001 From: David Palm Date: Tue, 2 Mar 2021 20:24:03 +0100 Subject: [PATCH 1/5] Remove type parameter defaults --- derive/src/lib.rs | 7 ++++++- test_suite/tests/derive.rs | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/derive/src/lib.rs b/derive/src/lib.rs index 7ba60a7e..82bebea0 100644 --- a/derive/src/lib.rs +++ b/derive/src/lib.rs @@ -101,12 +101,17 @@ fn generate_type(input: TokenStream2) -> Result { } }); - let ast: DeriveInput = syn::parse2(input.clone())?; + let mut 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")), }; + + // Remove any type parameter defaults, we don't want those. E.g. `impl` + ast.generics.type_params_mut().for_each(|type_param| { + type_param.default = None; + }); let generic_types = ast.generics.type_params(); let type_info_impl = quote! { impl <#( #generic_types ),*> :: #scale_info ::TypeInfo for #ident #ty_generics #where_clause { diff --git a/test_suite/tests/derive.rs b/test_suite/tests/derive.rs index 55676c12..6aa4f01f 100644 --- a/test_suite/tests/derive.rs +++ b/test_suite/tests/derive.rs @@ -280,6 +280,30 @@ 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)] From 76cea0751894815534e1068a6cb0bec912fa8cf2 Mon Sep 17 00:00:00 2001 From: David Palm Date: Tue, 2 Mar 2021 20:57:17 +0100 Subject: [PATCH 2/5] fmt --- test_suite/tests/derive.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test_suite/tests/derive.rs b/test_suite/tests/derive.rs index 6aa4f01f..45a6d1e5 100644 --- a/test_suite/tests/derive.rs +++ b/test_suite/tests/derive.rs @@ -287,20 +287,20 @@ fn type_parameters_with_default_bound_works() { } #[derive(TypeInfo)] pub enum MetaFormy {} - impl Formy for MetaFormy { type Tip = u8; } + impl Formy for MetaFormy { + type Tip = u8; + } #[allow(unused)] #[derive(TypeInfo)] struct Bat { - one: TTT + one: TTT, } let ty = Type::builder() .path(Path::new("Bat", "derive")) .type_params(tuple_meta_type!(MetaFormy)) - .composite( - Fields::named().field_of::("one", "TTT") - ); + .composite(Fields::named().field_of::("one", "TTT")); assert_type!(Bat, ty); } From 68d9a86ebcb8620b57a50b960712e453e7d01806 Mon Sep 17 00:00:00 2001 From: David Palm Date: Fri, 5 Mar 2021 12:54:38 +0100 Subject: [PATCH 3/5] Use the `ImplGeneric` from `split_for_impl` instead of custom munging Avoid cloning&parsing the ast --- derive/src/lib.rs | 19 ++++--------------- derive/src/trait_bounds.rs | 3 +++ test_suite/tests/derive.rs | 1 + 3 files changed, 8 insertions(+), 15 deletions(-) diff --git a/derive/src/lib.rs b/derive/src/lib.rs index 82bebea0..e831081c 100644 --- a/derive/src/lib.rs +++ b/derive/src/lib.rs @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#![cfg_attr(not(feature = "std"), no_std)] +// #![cfg_attr(not(feature = "std"), no_std)] extern crate alloc; extern crate proc_macro; @@ -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,20 +97,13 @@ fn generate_type(input: TokenStream2) -> Result { } }); - let mut 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")), }; - - // Remove any type parameter defaults, we don't want those. E.g. `impl` - ast.generics.type_params_mut().for_each(|type_param| { - type_param.default = None; - }); - 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..4bc17d65 100644 --- a/derive/src/trait_bounds.rs +++ b/derive/src/trait_bounds.rs @@ -41,6 +41,9 @@ 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 45a6d1e5..b6a1bdb0 100644 --- a/test_suite/tests/derive.rs +++ b/test_suite/tests/derive.rs @@ -301,6 +301,7 @@ fn type_parameters_with_default_bound_works() { .path(Path::new("Bat", "derive")) .type_params(tuple_meta_type!(MetaFormy)) .composite(Fields::named().field_of::("one", "TTT")); + assert_type!(Bat, ty); } From 16abfb0cd8c5e657893c738fe5a5c4153ea117e9 Mon Sep 17 00:00:00 2001 From: David Palm Date: Fri, 5 Mar 2021 12:59:29 +0100 Subject: [PATCH 4/5] fmt --- derive/src/trait_bounds.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/derive/src/trait_bounds.rs b/derive/src/trait_bounds.rs index 4bc17d65..e988c450 100644 --- a/derive/src/trait_bounds.rs +++ b/derive/src/trait_bounds.rs @@ -42,7 +42,9 @@ pub fn make_where_clause<'a>( } }); for lifetime in generics.lifetimes() { - where_clause.predicates.push(parse_quote!(#lifetime: 'static)) + where_clause + .predicates + .push(parse_quote!(#lifetime: 'static)) } let type_params = generics.type_params(); From d1264c9b7be85272df49f2d03857b8318fec5811 Mon Sep 17 00:00:00 2001 From: David Palm Date: Fri, 5 Mar 2021 13:20:04 +0100 Subject: [PATCH 5/5] undo unwanted change --- derive/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/derive/src/lib.rs b/derive/src/lib.rs index e831081c..f7cae75b 100644 --- a/derive/src/lib.rs +++ b/derive/src/lib.rs @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -// #![cfg_attr(not(feature = "std"), no_std)] +#![cfg_attr(not(feature = "std"), no_std)] extern crate alloc; extern crate proc_macro;