@@ -278,17 +278,9 @@ impl MetaItem {
278278
279279impl AttrItem {
280280 pub fn meta ( & self , span : Span ) -> Option < MetaItem > {
281- let mut tokens = self . args . outer_tokens ( ) . trees ( ) . peekable ( ) ;
282281 Some ( MetaItem {
283282 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 ) ?,
292284 span,
293285 } )
294286 }
@@ -567,26 +559,8 @@ impl MetaItemKind {
567559 }
568560 }
569561
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 ( ) ;
590564 let mut result = Vec :: new ( ) ;
591565 while let Some ( ..) = tokens. peek ( ) {
592566 let item = NestedMetaItem :: from_tokens ( & mut tokens) ?;
@@ -598,6 +572,47 @@ impl MetaItemKind {
598572 }
599573 Some ( MetaItemKind :: List ( result) )
600574 }
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+ }
601616}
602617
603618impl NestedMetaItem {
0 commit comments