@@ -17,7 +17,7 @@ use quote::quote;
17
17
use rand:: Rng ;
18
18
use rand_xoshiro:: rand_core:: SeedableRng ;
19
19
use syn:: {
20
- parse, parse_macro_input, punctuated:: Punctuated , spanned:: Spanned , ArgCaptured , FnArg , Ident ,
20
+ parse, parse_macro_input, punctuated:: Punctuated , spanned:: Spanned , FnArg , Ident ,
21
21
Item , ItemFn , ItemStatic , Pat , PatIdent , PathArguments , PathSegment , ReturnType , Stmt , Token ,
22
22
Type , TypePath , Visibility ,
23
23
} ;
@@ -84,22 +84,22 @@ pub fn entry(args: TokenStream, input: TokenStream) -> TokenStream {
84
84
let f = parse_macro_input ! ( input as ItemFn ) ;
85
85
86
86
// check the function signature
87
- let valid_signature = f. constness . is_none ( )
87
+ let valid_signature = f. sig . constness . is_none ( )
88
88
&& f. vis == Visibility :: Inherited
89
- && f. abi . is_none ( )
90
- && f. decl . generics . params . is_empty ( )
91
- && f. decl . generics . where_clause . is_none ( )
92
- && f. decl . variadic . is_none ( )
93
- && match f. decl . output {
89
+ && f. sig . abi . is_none ( )
90
+ && f. sig . generics . params . is_empty ( )
91
+ && f. sig . generics . where_clause . is_none ( )
92
+ && f. sig . variadic . is_none ( )
93
+ && match f. sig . output {
94
94
ReturnType :: Default => false ,
95
95
ReturnType :: Type ( _, ref ty) => matches ! ( * * ty, Type :: Never ( _) ) ,
96
96
} ;
97
- let cs_decl = extract_critical_section_arg ( & f. decl . inputs ) ;
97
+ let cs_decl = extract_critical_section_arg ( & f. sig . inputs ) ;
98
98
99
99
if let ( true , Ok ( ( cs_param, cs_arg) ) ) = ( valid_signature, cs_decl) {
100
100
// XXX should we blacklist other attributes?
101
101
let attrs = f. attrs ;
102
- let unsafety = f. unsafety ;
102
+ let unsafety = f. sig . unsafety ;
103
103
let hash = random_ident ( ) ;
104
104
let ( statics, stmts) = match extract_static_muts ( f. block . stmts ) {
105
105
Err ( e) => return e. to_compile_error ( ) . into ( ) ,
@@ -228,7 +228,7 @@ pub fn interrupt(args: TokenStream, input: TokenStream) -> TokenStream {
228
228
}
229
229
230
230
let fspan = f. span ( ) ;
231
- let ident = f. ident ;
231
+ let ident = f. sig . ident ;
232
232
let ident_s = ident. to_string ( ) ;
233
233
234
234
let check = if ident == "DefaultHandler" {
@@ -248,23 +248,23 @@ pub fn interrupt(args: TokenStream, input: TokenStream) -> TokenStream {
248
248
let attrs = f. attrs ;
249
249
let block = f. block ;
250
250
let stmts = block. stmts ;
251
- let unsafety = f. unsafety ;
251
+ let unsafety = f. sig . unsafety ;
252
252
253
- let valid_signature = f. constness . is_none ( )
253
+ let valid_signature = f. sig . constness . is_none ( )
254
254
&& f. vis == Visibility :: Inherited
255
- && f. abi . is_none ( )
256
- && f. decl . generics . params . is_empty ( )
257
- && f. decl . generics . where_clause . is_none ( )
258
- && f. decl . variadic . is_none ( )
259
- && match f. decl . output {
255
+ && f. sig . abi . is_none ( )
256
+ && f. sig . generics . params . is_empty ( )
257
+ && f. sig . generics . where_clause . is_none ( )
258
+ && f. sig . variadic . is_none ( )
259
+ && match f. sig . output {
260
260
ReturnType :: Default => true ,
261
261
ReturnType :: Type ( _, ref ty) => match * * ty {
262
262
Type :: Tuple ( ref tuple) => tuple. elems . is_empty ( ) ,
263
263
Type :: Never ( ..) => true ,
264
264
_ => false ,
265
265
} ,
266
266
} ;
267
- let cs_decl = extract_critical_section_arg ( & f. decl . inputs ) ;
267
+ let cs_decl = extract_critical_section_arg ( & f. sig . inputs ) ;
268
268
269
269
if let ( true , Ok ( ( cs_param, cs_arg) ) ) = ( valid_signature, cs_decl) {
270
270
let ( statics, stmts) = match extract_static_muts ( stmts) {
@@ -292,7 +292,7 @@ pub fn interrupt(args: TokenStream, input: TokenStream) -> TokenStream {
292
292
} )
293
293
. collect :: < Vec < _ > > ( ) ;
294
294
295
- let output = f. decl . output ;
295
+ let output = f. sig . output ;
296
296
let hash = random_ident ( ) ;
297
297
quote ! (
298
298
#[ export_name = #ident_s]
@@ -343,15 +343,15 @@ pub fn pre_init(args: TokenStream, input: TokenStream) -> TokenStream {
343
343
let f = parse_macro_input ! ( input as ItemFn ) ;
344
344
345
345
// check the function signature
346
- let valid_signature = f. constness . is_none ( )
346
+ let valid_signature = f. sig . constness . is_none ( )
347
347
&& f. vis == Visibility :: Inherited
348
- && f. unsafety . is_some ( )
349
- && f. abi . is_none ( )
350
- && f. decl . inputs . is_empty ( )
351
- && f. decl . generics . params . is_empty ( )
352
- && f. decl . generics . where_clause . is_none ( )
353
- && f. decl . variadic . is_none ( )
354
- && match f. decl . output {
348
+ && f. sig . unsafety . is_some ( )
349
+ && f. sig . abi . is_none ( )
350
+ && f. sig . inputs . is_empty ( )
351
+ && f. sig . generics . params . is_empty ( )
352
+ && f. sig . generics . where_clause . is_none ( )
353
+ && f. sig . variadic . is_none ( )
354
+ && match f. sig . output {
355
355
ReturnType :: Default => true ,
356
356
ReturnType :: Type ( _, ref ty) => match * * ty {
357
357
Type :: Tuple ( ref tuple) => tuple. elems . is_empty ( ) ,
@@ -376,7 +376,7 @@ pub fn pre_init(args: TokenStream, input: TokenStream) -> TokenStream {
376
376
377
377
// XXX should we blacklist other attributes?
378
378
let attrs = f. attrs ;
379
- let ident = f. ident ;
379
+ let ident = f. sig . ident ;
380
380
let block = f. block ;
381
381
382
382
quote ! (
@@ -402,31 +402,36 @@ fn extract_critical_section_arg(
402
402
if num_args == 0 {
403
403
Ok ( ( None , None ) )
404
404
} else if num_args == 1 {
405
- match list. first ( ) . unwrap ( ) . into_value ( ) {
406
- FnArg :: Captured ( ArgCaptured {
407
- pat :
405
+ if let FnArg :: Typed ( pat_type ) = list. first ( ) . unwrap ( ) {
406
+ match ( & * pat_type . pat , & * pat_type . ty , pat_type . colon_token , & * pat_type . attrs ) {
407
+ (
408
408
Pat :: Ident ( PatIdent {
409
409
ident : name,
410
410
by_ref : None ,
411
411
mutability : None ,
412
412
subpat : None ,
413
+ attrs,
413
414
} ) ,
414
- ty : Type :: Path ( TypePath { qself : None , path } ) ,
415
- colon_token : _,
416
- } ) if path. segments . len ( ) == 1 => {
417
- let seg = path. segments . first ( ) . unwrap ( ) ;
418
- match seg. into_value ( ) {
419
- PathSegment {
420
- ident : tname,
421
- arguments : PathArguments :: None ,
422
- } if tname == "CriticalSection" => Ok ( (
423
- Some ( quote ! { #name: msp430:: interrupt:: CriticalSection <' a> } ) ,
424
- Some ( quote ! { unsafe { msp430:: interrupt:: CriticalSection :: new( ) } } ) ,
425
- ) ) ,
426
- _ => Err ( ( ) ) ,
415
+ Type :: Path ( TypePath { qself : None , path } ) ,
416
+ _,
417
+ [ ]
418
+ ) if path. segments . len ( ) == 1 && attrs. len ( ) == 0 => {
419
+ let seg = path. segments . first ( ) . unwrap ( ) ;
420
+ match seg {
421
+ PathSegment {
422
+ ident : tname,
423
+ arguments : PathArguments :: None ,
424
+ } if tname == "CriticalSection" => Ok ( (
425
+ Some ( quote ! { #name: msp430:: interrupt:: CriticalSection <' a> } ) ,
426
+ Some ( quote ! { unsafe { msp430:: interrupt:: CriticalSection :: new( ) } } ) ,
427
+ ) ) ,
428
+ _ => Err ( ( ) ) ,
429
+ }
427
430
}
431
+ _ => Err ( ( ) ) ,
428
432
}
429
- _ => Err ( ( ) ) ,
433
+ } else {
434
+ Err ( ( ) )
430
435
}
431
436
} else {
432
437
Err ( ( ) )
0 commit comments