aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mingling_pathf/src/patterns/groupped_derive.rs53
-rw-r--r--mingling_pathf/test/src/lib.rs3
-rw-r--r--mingling_pathf/test/src/test_files/test_groupped_derive.rs17
3 files changed, 48 insertions, 25 deletions
diff --git a/mingling_pathf/src/patterns/groupped_derive.rs b/mingling_pathf/src/patterns/groupped_derive.rs
index 44e7731..8491121 100644
--- a/mingling_pathf/src/patterns/groupped_derive.rs
+++ b/mingling_pathf/src/patterns/groupped_derive.rs
@@ -24,27 +24,24 @@ impl AnalyzePattern for GrouppedDerivePattern {
for item in &syntax.items {
match item {
- Item::Struct(s)
- if has_groupped_derive(&s.attrs) => {
- items.push(AnalyzeItem {
- module: String::new(),
- item_name: s.ident.to_string(),
- });
- }
- Item::Enum(e)
- if has_groupped_derive(&e.attrs) => {
- items.push(AnalyzeItem {
- module: String::new(),
- item_name: e.ident.to_string(),
- });
- }
- Item::Union(u)
- if has_groupped_derive(&u.attrs) => {
- items.push(AnalyzeItem {
- module: String::new(),
- item_name: u.ident.to_string(),
- });
- }
+ Item::Struct(s) if has_groupped_derive(&s.attrs) => {
+ items.push(AnalyzeItem {
+ module: String::new(),
+ item_name: s.ident.to_string(),
+ });
+ }
+ Item::Enum(e) if has_groupped_derive(&e.attrs) => {
+ items.push(AnalyzeItem {
+ module: String::new(),
+ item_name: e.ident.to_string(),
+ });
+ }
+ Item::Union(u) if has_groupped_derive(&u.attrs) => {
+ items.push(AnalyzeItem {
+ module: String::new(),
+ item_name: u.ident.to_string(),
+ });
+ }
Item::Mod(item_mod) => {
if let Some((_, nested)) = &item_mod.content {
for n in nested {
@@ -77,12 +74,18 @@ impl AnalyzePattern for GrouppedDerivePattern {
fn has_groupped_derive(attrs: &[syn::Attribute]) -> bool {
attrs.iter().any(|attr| {
if attr.path().is_ident("derive") {
- attr.parse_args::<syn::MetaList>().ok().is_some_and(|meta| {
- meta.path.segments.iter().any(|seg| {
- let name = seg.ident.to_string();
+ // Correctly parse comma-separated paths in #[derive(Groupped, Debug, ...)]
+ attr.parse_args_with(|input: syn::parse::ParseStream| {
+ let paths =
+ syn::punctuated::Punctuated::<syn::Path, syn::Token![,]>::parse_terminated(
+ input,
+ )?;
+ Ok(paths.iter().any(|p| {
+ let name = p.segments.last().unwrap().ident.to_string();
name == "Groupped" || name == "GrouppedSerialize"
- })
+ }))
})
+ .unwrap_or(false)
} else {
false
}
diff --git a/mingling_pathf/test/src/lib.rs b/mingling_pathf/test/src/lib.rs
index f25b094..824cbbf 100644
--- a/mingling_pathf/test/src/lib.rs
+++ b/mingling_pathf/test/src/lib.rs
@@ -233,8 +233,11 @@ fn test_groupped_derive_analyze() {
"::Derived1",
"::Derived2",
"::Derived3",
+ "::EnumDerived1",
+ "::EnumDerived2",
"::sub::Derived1",
"::sub::Derived3",
+ "::sub::EnumDerived1",
];
assert_eq!(r.len(), required.len());
diff --git a/mingling_pathf/test/src/test_files/test_groupped_derive.rs b/mingling_pathf/test/src/test_files/test_groupped_derive.rs
index f6c6fa9..913587c 100644
--- a/mingling_pathf/test/src/test_files/test_groupped_derive.rs
+++ b/mingling_pathf/test/src/test_files/test_groupped_derive.rs
@@ -13,6 +13,18 @@ struct Derived3 {
value: bool,
}
+#[derive(Groupped)]
+enum EnumDerived1 {
+ A,
+ B,
+}
+
+#[derive(GrouppedSerialize)]
+enum EnumDerived2 {
+ X(String),
+ Y(i32),
+}
+
pub mod sub {
#[derive(Groupped)]
struct Derived1 {
@@ -23,4 +35,9 @@ pub mod sub {
struct Derived3 {
value: bool,
}
+
+ #[derive(Groupped)]
+ enum EnumDerived1 {
+ A,
+ }
}