4
4
5
5
#![ allow( clippy:: redundant_closure_call) ]
6
6
7
- use syn:: { ext:: IdentExt , parse :: Parser } ;
7
+ use syn:: ext:: IdentExt ;
8
8
9
9
pub trait IterHelpers : Iterator {
10
10
fn try_skip_map < F , T , E > ( & mut self , f : F ) -> Result < Vec < T > , E >
@@ -152,23 +152,24 @@ pub trait SynAttributeHelpers {
152
152
/// Example:
153
153
/// - `item.has_unsafe_attr_word("test")` => `#[unsafe(test)]`
154
154
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 ,
164
159
} ;
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
172
173
}
173
174
174
175
fn find_deprecated_note ( & self ) -> Option < String > {
@@ -192,14 +193,15 @@ pub trait SynAttributeHelpers {
192
193
}
193
194
} ) ?;
194
195
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
+ } ;
203
205
204
206
let arg = args. iter ( ) . find ( |arg| arg. path . is_ident ( "note" ) ) ?;
205
207
if let syn:: Expr :: Lit ( syn:: ExprLit {
@@ -256,32 +258,21 @@ pub trait SynAttributeHelpers {
256
258
self . attrs ( )
257
259
. iter ( )
258
260
. 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" ) {
260
263
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 ( ) ) ;
285
276
}
286
277
}
287
278
None
0 commit comments