11//! Functions dealing with attributes and meta items.
22
33use std:: fmt:: Debug ;
4- use std:: iter;
54use std:: sync:: atomic:: { AtomicU32 , Ordering } ;
65
76use rustc_index:: bit_set:: GrowableBitSet ;
@@ -16,7 +15,9 @@ use crate::ast::{
1615} ;
1716use crate :: ptr:: P ;
1817use crate :: token:: { self , CommentKind , Delimiter , Token } ;
19- use crate :: tokenstream:: { DelimSpan , LazyAttrTokenStream , Spacing , TokenStream , TokenTree } ;
18+ use crate :: tokenstream:: {
19+ DelimSpan , LazyAttrTokenStream , Spacing , TokenStream , TokenStreamIter , TokenTree ,
20+ } ;
2021use crate :: util:: comments;
2122use crate :: util:: literal:: escape_string_symbol;
2223
@@ -365,22 +366,19 @@ impl MetaItem {
365366 }
366367 }
367368
368- fn from_tokens < ' a , I > ( tokens : & mut iter:: Peekable < I > ) -> Option < MetaItem >
369- where
370- I : Iterator < Item = & ' a TokenTree > ,
371- {
369+ fn from_tokens ( iter : & mut TokenStreamIter < ' _ > ) -> Option < MetaItem > {
372370 // FIXME: Share code with `parse_path`.
373- let tt = tokens . next ( ) . map ( |tt| TokenTree :: uninterpolate ( tt) ) ;
371+ let tt = iter . next ( ) . map ( |tt| TokenTree :: uninterpolate ( tt) ) ;
374372 let path = match tt. as_deref ( ) {
375373 Some ( & TokenTree :: Token (
376374 Token { kind : ref kind @ ( token:: Ident ( ..) | token:: PathSep ) , span } ,
377375 _,
378376 ) ) => ' arm: {
379377 let mut segments = if let & token:: Ident ( name, _) = kind {
380378 if let Some ( TokenTree :: Token ( Token { kind : token:: PathSep , .. } , _) ) =
381- tokens . peek ( )
379+ iter . peek ( )
382380 {
383- tokens . next ( ) ;
381+ iter . next ( ) ;
384382 thin_vec ! [ PathSegment :: from_ident( Ident :: new( name, span) ) ]
385383 } else {
386384 break ' arm Path :: from_ident ( Ident :: new ( name, span) ) ;
@@ -390,16 +388,16 @@ impl MetaItem {
390388 } ;
391389 loop {
392390 if let Some ( & TokenTree :: Token ( Token { kind : token:: Ident ( name, _) , span } , _) ) =
393- tokens . next ( ) . map ( |tt| TokenTree :: uninterpolate ( tt) ) . as_deref ( )
391+ iter . next ( ) . map ( |tt| TokenTree :: uninterpolate ( tt) ) . as_deref ( )
394392 {
395393 segments. push ( PathSegment :: from_ident ( Ident :: new ( name, span) ) ) ;
396394 } else {
397395 return None ;
398396 }
399397 if let Some ( TokenTree :: Token ( Token { kind : token:: PathSep , .. } , _) ) =
400- tokens . peek ( )
398+ iter . peek ( )
401399 {
402- tokens . next ( ) ;
400+ iter . next ( ) ;
403401 } else {
404402 break ;
405403 }
@@ -420,8 +418,8 @@ impl MetaItem {
420418 }
421419 _ => return None ,
422420 } ;
423- let list_closing_paren_pos = tokens . peek ( ) . map ( |tt| tt. span ( ) . hi ( ) ) ;
424- let kind = MetaItemKind :: from_tokens ( tokens ) ?;
421+ let list_closing_paren_pos = iter . peek ( ) . map ( |tt| tt. span ( ) . hi ( ) ) ;
422+ let kind = MetaItemKind :: from_tokens ( iter ) ?;
425423 let hi = match & kind {
426424 MetaItemKind :: NameValue ( lit) => lit. span . hi ( ) ,
427425 MetaItemKind :: List ( ..) => list_closing_paren_pos. unwrap_or ( path. span . hi ( ) ) ,
@@ -438,25 +436,23 @@ impl MetaItem {
438436impl MetaItemKind {
439437 // public because it can be called in the hir
440438 pub fn list_from_tokens ( tokens : TokenStream ) -> Option < ThinVec < MetaItemInner > > {
441- let mut tokens = tokens. trees ( ) . peekable ( ) ;
439+ let mut iter = tokens. iter ( ) ;
442440 let mut result = ThinVec :: new ( ) ;
443- while tokens . peek ( ) . is_some ( ) {
444- let item = MetaItemInner :: from_tokens ( & mut tokens ) ?;
441+ while iter . peek ( ) . is_some ( ) {
442+ let item = MetaItemInner :: from_tokens ( & mut iter ) ?;
445443 result. push ( item) ;
446- match tokens . next ( ) {
444+ match iter . next ( ) {
447445 None | Some ( TokenTree :: Token ( Token { kind : token:: Comma , .. } , _) ) => { }
448446 _ => return None ,
449447 }
450448 }
451449 Some ( result)
452450 }
453451
454- fn name_value_from_tokens < ' a > (
455- tokens : & mut impl Iterator < Item = & ' a TokenTree > ,
456- ) -> Option < MetaItemKind > {
457- match tokens. next ( ) {
452+ fn name_value_from_tokens ( iter : & mut TokenStreamIter < ' _ > ) -> Option < MetaItemKind > {
453+ match iter. next ( ) {
458454 Some ( TokenTree :: Delimited ( .., Delimiter :: Invisible ( _) , inner_tokens) ) => {
459- MetaItemKind :: name_value_from_tokens ( & mut inner_tokens. trees ( ) )
455+ MetaItemKind :: name_value_from_tokens ( & mut inner_tokens. iter ( ) )
460456 }
461457 Some ( TokenTree :: Token ( token, _) ) => {
462458 MetaItemLit :: from_token ( token) . map ( MetaItemKind :: NameValue )
@@ -465,19 +461,17 @@ impl MetaItemKind {
465461 }
466462 }
467463
468- fn from_tokens < ' a > (
469- tokens : & mut iter:: Peekable < impl Iterator < Item = & ' a TokenTree > > ,
470- ) -> Option < MetaItemKind > {
471- match tokens. peek ( ) {
464+ fn from_tokens ( iter : & mut TokenStreamIter < ' _ > ) -> Option < MetaItemKind > {
465+ match iter. peek ( ) {
472466 Some ( TokenTree :: Delimited ( .., Delimiter :: Parenthesis , inner_tokens) ) => {
473467 let inner_tokens = inner_tokens. clone ( ) ;
474- tokens . next ( ) ;
468+ iter . next ( ) ;
475469 MetaItemKind :: list_from_tokens ( inner_tokens) . map ( MetaItemKind :: List )
476470 }
477471 Some ( TokenTree :: Delimited ( ..) ) => None ,
478472 Some ( TokenTree :: Token ( Token { kind : token:: Eq , .. } , _) ) => {
479- tokens . next ( ) ;
480- MetaItemKind :: name_value_from_tokens ( tokens )
473+ iter . next ( ) ;
474+ MetaItemKind :: name_value_from_tokens ( iter )
481475 }
482476 _ => Some ( MetaItemKind :: Word ) ,
483477 }
@@ -593,22 +587,19 @@ impl MetaItemInner {
593587 self . meta_item ( ) . is_some ( )
594588 }
595589
596- fn from_tokens < ' a , I > ( tokens : & mut iter:: Peekable < I > ) -> Option < MetaItemInner >
597- where
598- I : Iterator < Item = & ' a TokenTree > ,
599- {
600- match tokens. peek ( ) {
590+ fn from_tokens ( iter : & mut TokenStreamIter < ' _ > ) -> Option < MetaItemInner > {
591+ match iter. peek ( ) {
601592 Some ( TokenTree :: Token ( token, _) ) if let Some ( lit) = MetaItemLit :: from_token ( token) => {
602- tokens . next ( ) ;
593+ iter . next ( ) ;
603594 return Some ( MetaItemInner :: Lit ( lit) ) ;
604595 }
605596 Some ( TokenTree :: Delimited ( .., Delimiter :: Invisible ( _) , inner_tokens) ) => {
606- tokens . next ( ) ;
607- return MetaItemInner :: from_tokens ( & mut inner_tokens. trees ( ) . peekable ( ) ) ;
597+ iter . next ( ) ;
598+ return MetaItemInner :: from_tokens ( & mut inner_tokens. iter ( ) ) ;
608599 }
609600 _ => { }
610601 }
611- MetaItem :: from_tokens ( tokens ) . map ( MetaItemInner :: MetaItem )
602+ MetaItem :: from_tokens ( iter ) . map ( MetaItemInner :: MetaItem )
612603 }
613604}
614605
0 commit comments