Skip to content

Commit 0520480

Browse files
committed
utilities: Minor clean-up.
1 parent 0ac0211 commit 0520480

File tree

1 file changed

+41
-50
lines changed

1 file changed

+41
-50
lines changed

src/bindgen/utilities.rs

Lines changed: 41 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
#![allow(clippy::redundant_closure_call)]
66

7-
use syn::{ext::IdentExt, parse::Parser};
7+
use syn::ext::IdentExt;
88

99
pub trait IterHelpers: Iterator {
1010
fn try_skip_map<F, T, E>(&mut self, f: F) -> Result<Vec<T>, E>
@@ -152,23 +152,24 @@ pub trait SynAttributeHelpers {
152152
/// Example:
153153
/// - `item.has_unsafe_attr_word("test")` => `#[unsafe(test)]`
154154
fn has_unsafe_attr_word(&self, name: &str) -> bool {
155-
self.attrs().iter().filter_map(|attr| {
156-
match &attr.meta {
157-
syn::Meta::List(list) if list.path.is_ident("unsafe") => Some(list.tokens.clone()),
158-
_ => None,
159-
}
160-
}).any(|tokens| {
161-
let parser = syn::punctuated::Punctuated::<proc_macro2::TokenStream, syn::Token![,]>::parse_terminated;
162-
let Ok(args) = parser.parse2(tokens) else {
163-
return false;
155+
for attr in self.attrs() {
156+
let unsafe_list = match &attr.meta {
157+
syn::Meta::List(list) if list.path.is_ident("unsafe") => list,
158+
_ => continue,
164159
};
165-
args.into_iter().any(|arg| {
166-
match syn::parse2::<syn::Path>(arg) {
167-
Ok(path) => path.is_ident(name),
168-
Err(_) => false,
169-
}
170-
})
171-
})
160+
let args: syn::punctuated::Punctuated<syn::Path, Token![,]> =
161+
match unsafe_list.parse_args_with(syn::punctuated::Punctuated::parse_terminated) {
162+
Ok(args) => args,
163+
Err(..) => {
164+
warn!("couldn't parse unsafe() attribute");
165+
continue;
166+
}
167+
};
168+
if args.iter().any(|a| a.is_ident(name)) {
169+
return true;
170+
}
171+
}
172+
false
172173
}
173174

174175
fn find_deprecated_note(&self) -> Option<String> {
@@ -192,14 +193,15 @@ pub trait SynAttributeHelpers {
192193
}
193194
})?;
194195

195-
let args: syn::punctuated::Punctuated<syn::MetaNameValue, Token![,]> =
196-
match attr.parse_args_with(syn::punctuated::Punctuated::parse_terminated) {
197-
Ok(args) => args,
198-
Err(_) => {
199-
warn!("couldn't parse deprecated attribute");
200-
return None;
201-
}
202-
};
196+
let parser =
197+
syn::punctuated::Punctuated::<syn::MetaNameValue, syn::Token![,]>::parse_terminated;
198+
let args = match attr.parse_args_with(parser) {
199+
Ok(args) => args,
200+
Err(_) => {
201+
warn!("couldn't parse deprecated attribute");
202+
return None;
203+
}
204+
};
203205

204206
let arg = args.iter().find(|arg| arg.path.is_ident("note"))?;
205207
if let syn::Expr::Lit(syn::ExprLit {
@@ -256,32 +258,21 @@ pub trait SynAttributeHelpers {
256258
self.attrs()
257259
.iter()
258260
.filter_map(|attr| {
259-
let syn::Meta::List(syn::MetaList { path, tokens, .. }) = &attr.meta else {
261+
let syn::Meta::List(list) = &attr.meta else { return None };
262+
if !list.path.is_ident("unsafe") {
260263
return None;
261-
};
262-
if path.is_ident("unsafe") {
263-
let parser = syn::punctuated::Punctuated::<
264-
proc_macro2::TokenStream,
265-
syn::Token![,],
266-
>::parse_terminated;
267-
let Ok(args) = parser.parse2(tokens.clone()) else {
268-
return None;
269-
};
270-
for arg in args {
271-
match syn::parse2::<syn::MetaNameValue>(arg) {
272-
Ok(syn::MetaNameValue {
273-
path,
274-
value:
275-
syn::Expr::Lit(syn::ExprLit {
276-
lit: syn::Lit::Str(lit),
277-
..
278-
}),
279-
..
280-
}) if path.is_ident(name) => {
281-
return Some(lit.value());
282-
}
283-
_ => {}
284-
}
264+
}
265+
let parser = syn::punctuated::Punctuated::<syn::MetaNameValue, syn::Token![,]>::parse_terminated;
266+
let Ok(args) = list.parse_args_with(parser) else { return None };
267+
for arg in args {
268+
if !arg.path.is_ident(name) {
269+
continue;
270+
}
271+
if let syn::Expr::Lit(syn::ExprLit {
272+
lit: syn::Lit::Str(lit),
273+
..
274+
}) = arg.value {
275+
return Some(lit.value());
285276
}
286277
}
287278
None

0 commit comments

Comments
 (0)