From 7ee48d392ef711643c5383d52db7ef87a7270825 Mon Sep 17 00:00:00 2001 From: "lucas.mendes" Date: Thu, 17 Nov 2022 12:03:56 -0300 Subject: [PATCH 1/3] fix appending attributes instead of inserting them This fixes a warning (`legacy_derive_helpers`) about outer struct attributes being used before being declared. This warning is slated to become a hard error in the future. --- src/imp.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/imp.rs b/src/imp.rs index 2c56e4d..2dff685 100644 --- a/src/imp.rs +++ b/src/imp.rs @@ -251,7 +251,8 @@ fn strike_through_attributes( true } }); - dec_attrs.extend_from_slice(&strike_attrs[..]); + + strike_attrs.iter().for_each(|attr| dec_attrs.insert(0, attr.clone())); } fn recurse_through_type_list( From 4812c6fc2474e41b91cd62f2ef83d7deac4ce32a Mon Sep 17 00:00:00 2001 From: luctins Date: Fri, 18 Nov 2022 16:02:16 -0300 Subject: [PATCH 2/3] strikethrough: always insert non derive attr's after existing ones update `strikethrough_derive` test to validade this behaviour --- src/imp.rs | 22 +++++++++++++++++++++- src/test.rs | 9 +++++++-- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/imp.rs b/src/imp.rs index 2dff685..a694518 100644 --- a/src/imp.rs +++ b/src/imp.rs @@ -252,7 +252,27 @@ fn strike_through_attributes( } }); - strike_attrs.iter().for_each(|attr| dec_attrs.insert(0, attr.clone())); + let (mut derive_attrs, rest_attrs) = + strike_attrs + .iter() + .fold((Vec::new(), Vec::new()), + | (mut der, mut rest), i| { + if matches!(&i.path[0], TokenTree::Ident(token) if token == "derive") { + der.push(i.clone()); + } else { + rest.push(i.clone()); + } + (der, rest) + }); + + // place other attrs after the existing ones + dec_attrs.extend_from_slice(&rest_attrs[..]); + + // insert derive attrs before attributes + derive_attrs + .drain(..) + .for_each(|attr| dec_attrs.insert(0, attr)); + } fn recurse_through_type_list( diff --git a/src/test.rs b/src/test.rs index 067c9f7..b7d2796 100644 --- a/src/test.rs +++ b/src/test.rs @@ -12,6 +12,7 @@ fn check(nested: proc_macro2::TokenStream, planexpected: proc_macro2::TokenStrea #[test] fn strikethrough_derive() { let from = quote! { + #[strikethrough[striked_attr]] #[strikethrough[derive(Debug, Default, PartialEq)]] #[gubbel] struct Parent { @@ -22,19 +23,23 @@ fn strikethrough_derive() { e: u32, } }; + let out = quote! { #[derive(Debug, Default, PartialEq)] + #[striked_attr] struct Shared { d: i32 } - #[gobbel] #[derive(Debug, Default, PartialEq)] + #[gobbel] + #[striked_attr] struct A { b: Shared, c: Shared, } - #[gubbel] #[derive(Debug, Default, PartialEq)] + #[gubbel] + #[striked_attr] struct Parent { a: A, e: u32, From 90d92312bcc01af0cff03b144ae3f090ba33d140 Mon Sep 17 00:00:00 2001 From: luctins Date: Fri, 18 Nov 2022 16:06:01 -0300 Subject: [PATCH 3/3] forgot to run cargo fmt --- src/imp.rs | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/imp.rs b/src/imp.rs index a694518..2833f8d 100644 --- a/src/imp.rs +++ b/src/imp.rs @@ -254,16 +254,15 @@ fn strike_through_attributes( let (mut derive_attrs, rest_attrs) = strike_attrs - .iter() - .fold((Vec::new(), Vec::new()), - | (mut der, mut rest), i| { - if matches!(&i.path[0], TokenTree::Ident(token) if token == "derive") { - der.push(i.clone()); - } else { - rest.push(i.clone()); - } - (der, rest) - }); + .iter() + .fold((Vec::new(), Vec::new()), |(mut der, mut rest), i| { + if matches!(&i.path[0], TokenTree::Ident(token) if token == "derive") { + der.push(i.clone()); + } else { + rest.push(i.clone()); + } + (der, rest) + }); // place other attrs after the existing ones dec_attrs.extend_from_slice(&rest_attrs[..]); @@ -272,7 +271,6 @@ fn strike_through_attributes( derive_attrs .drain(..) .for_each(|attr| dec_attrs.insert(0, attr)); - } fn recurse_through_type_list(