Skip to content

Commit 195dfa8

Browse files
committed
hdf5-derive: migrate to syn 2.0
1 parent 4e14080 commit 195dfa8

File tree

1 file changed

+25
-38
lines changed

1 file changed

+25
-38
lines changed

hdf5-derive/src/lib.rs

Lines changed: 25 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ use proc_macro2::{Ident, Span, TokenStream};
88
use proc_macro_error::{abort, proc_macro_error};
99
use quote::{quote, ToTokens};
1010
use syn::{
11-
parse_macro_input, AttrStyle, Attribute, Data, DeriveInput, Expr, Fields, Index, Lit, Meta,
12-
NestedMeta, Type, TypeGenerics, TypePath,
11+
parse_macro_input, AttrStyle, Attribute, Data, DeriveInput, Expr, Fields, Index, LitStr, Type,
12+
TypeGenerics, TypePath,
1313
};
1414

1515
#[proc_macro_derive(H5Type, attributes(hdf5))]
@@ -107,55 +107,42 @@ fn is_phantom_data(ty: &Type) -> bool {
107107
}
108108

109109
fn find_repr(attrs: &[Attribute], expected: &[&str]) -> Option<Ident> {
110+
let mut repr = None;
110111
for attr in attrs.iter() {
111112
if attr.style != AttrStyle::Outer {
112113
continue;
113114
}
114-
let list = match attr.parse_meta() {
115-
Ok(Meta::List(list)) => list,
116-
_ => continue,
117-
};
118-
if !list.path.get_ident().map_or(false, |ident| ident == "repr") {
115+
if !attr.path().is_ident("repr") {
119116
continue;
120117
}
121-
for item in list.nested.iter() {
122-
let path = match item {
123-
NestedMeta::Meta(Meta::Path(ref path)) => path,
124-
_ => continue,
125-
};
126-
let ident = match path.get_ident() {
127-
Some(ident) => ident,
128-
_ => continue,
129-
};
130-
if expected.iter().any(|&s| ident == s) {
131-
return Some(Ident::new(&ident.to_string(), Span::call_site()));
118+
attr.parse_nested_meta(|meta| {
119+
if expected.iter().any(|s| meta.path.is_ident(s)) {
120+
if repr.is_some() {
121+
abort!(meta.path, "ambiguous repr attribute");
122+
} else {
123+
repr = meta.path.get_ident().cloned();
124+
}
132125
}
133-
}
126+
Ok(())
127+
})
128+
.ok()?;
134129
}
135-
136-
None
130+
repr
137131
}
138132

139133
fn find_hdf5_rename(attrs: &[Attribute]) -> Option<String> {
140-
if let Some(attr) = attrs.iter().find(|a| a.path.is_ident("hdf5")) {
141-
if let Ok(Meta::List(meta_list)) = attr.parse_meta() {
142-
let rename_literal = meta_list.nested.iter().find_map(|n| {
143-
if let NestedMeta::Meta(Meta::NameValue(name_value)) = n {
144-
if name_value.path.is_ident("rename") {
145-
return Some(&name_value.lit);
146-
}
147-
}
148-
149-
None
150-
});
151-
152-
if let Some(Lit::Str(renamed)) = rename_literal {
153-
return Some(renamed.value());
134+
let mut rename = None;
135+
let attr = attrs.iter().find(|a| a.path().is_ident("hdf5"))?;
136+
attr.parse_nested_meta(|meta| {
137+
if meta.path.is_ident("rename") {
138+
if rename.is_none() {
139+
rename = Some(meta.value()?.parse::<LitStr>()?.value());
154140
}
155141
}
156-
}
157-
158-
None
142+
Ok(())
143+
})
144+
.ok()?;
145+
rename
159146
}
160147

161148
fn pluck<'a, I, F, T, S>(iter: I, func: F) -> Vec<S>

0 commit comments

Comments
 (0)