@@ -278,17 +278,9 @@ impl MetaItem {
278
278
279
279
impl AttrItem {
280
280
pub fn meta ( & self , span : Span ) -> Option < MetaItem > {
281
- let mut tokens = self . args . outer_tokens ( ) . trees ( ) . peekable ( ) ;
282
281
Some ( MetaItem {
283
282
path : self . path . clone ( ) ,
284
- kind : if let Some ( kind) = MetaItemKind :: from_tokens ( & mut tokens) {
285
- if tokens. peek ( ) . is_some ( ) {
286
- return None ;
287
- }
288
- kind
289
- } else {
290
- return None ;
291
- } ,
283
+ kind : MetaItemKind :: from_mac_args ( & self . args ) ?,
292
284
span,
293
285
} )
294
286
}
@@ -567,26 +559,8 @@ impl MetaItemKind {
567
559
}
568
560
}
569
561
570
- fn from_tokens < I > ( tokens : & mut iter:: Peekable < I > ) -> Option < MetaItemKind >
571
- where I : Iterator < Item = TokenTree > ,
572
- {
573
- let delimited = match tokens. peek ( ) . cloned ( ) {
574
- Some ( TokenTree :: Token ( token) ) if token == token:: Eq => {
575
- tokens. next ( ) ;
576
- return if let Some ( TokenTree :: Token ( token) ) = tokens. next ( ) {
577
- Lit :: from_token ( & token) . ok ( ) . map ( MetaItemKind :: NameValue )
578
- } else {
579
- None
580
- } ;
581
- }
582
- Some ( TokenTree :: Delimited ( _, delim, ref tts) ) if delim == token:: Paren => {
583
- tokens. next ( ) ;
584
- tts. clone ( )
585
- }
586
- _ => return Some ( MetaItemKind :: Word ) ,
587
- } ;
588
-
589
- let mut tokens = delimited. into_trees ( ) . peekable ( ) ;
562
+ fn list_from_tokens ( tokens : TokenStream ) -> Option < MetaItemKind > {
563
+ let mut tokens = tokens. into_trees ( ) . peekable ( ) ;
590
564
let mut result = Vec :: new ( ) ;
591
565
while let Some ( ..) = tokens. peek ( ) {
592
566
let item = NestedMetaItem :: from_tokens ( & mut tokens) ?;
@@ -598,6 +572,47 @@ impl MetaItemKind {
598
572
}
599
573
Some ( MetaItemKind :: List ( result) )
600
574
}
575
+
576
+ fn name_value_from_tokens (
577
+ tokens : & mut impl Iterator < Item = TokenTree > ,
578
+ ) -> Option < MetaItemKind > {
579
+ match tokens. next ( ) {
580
+ Some ( TokenTree :: Token ( token) ) =>
581
+ Lit :: from_token ( & token) . ok ( ) . map ( MetaItemKind :: NameValue ) ,
582
+ _ => None ,
583
+ }
584
+ }
585
+
586
+ fn from_mac_args ( args : & MacArgs ) -> Option < MetaItemKind > {
587
+ match args {
588
+ MacArgs :: Delimited ( _, MacDelimiter :: Parenthesis , tokens) =>
589
+ MetaItemKind :: list_from_tokens ( tokens. clone ( ) ) ,
590
+ MacArgs :: Delimited ( ..) => None ,
591
+ MacArgs :: Eq ( _, tokens) => {
592
+ assert ! ( tokens. len( ) == 1 ) ;
593
+ MetaItemKind :: name_value_from_tokens ( & mut tokens. trees ( ) )
594
+ }
595
+ MacArgs :: Empty => Some ( MetaItemKind :: Word ) ,
596
+ }
597
+ }
598
+
599
+ fn from_tokens (
600
+ tokens : & mut iter:: Peekable < impl Iterator < Item = TokenTree > > ,
601
+ ) -> Option < MetaItemKind > {
602
+ match tokens. peek ( ) {
603
+ Some ( TokenTree :: Delimited ( _, token:: Paren , inner_tokens) ) => {
604
+ let inner_tokens = inner_tokens. clone ( ) ;
605
+ tokens. next ( ) ;
606
+ MetaItemKind :: list_from_tokens ( inner_tokens)
607
+ }
608
+ Some ( TokenTree :: Delimited ( ..) ) => None ,
609
+ Some ( TokenTree :: Token ( Token { kind : token:: Eq , .. } ) ) => {
610
+ tokens. next ( ) ;
611
+ MetaItemKind :: name_value_from_tokens ( tokens)
612
+ }
613
+ _ => Some ( MetaItemKind :: Word ) ,
614
+ }
615
+ }
601
616
}
602
617
603
618
impl NestedMetaItem {
0 commit comments