1
1
//! Functions dealing with attributes and meta items.
2
2
3
- use std:: iter;
4
3
use std:: sync:: atomic:: { AtomicU32 , Ordering } ;
5
4
6
5
use rustc_index:: bit_set:: GrowableBitSet ;
@@ -16,7 +15,9 @@ use crate::ast::{
16
15
} ;
17
16
use crate :: ptr:: P ;
18
17
use 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
+ } ;
20
21
use crate :: util:: comments;
21
22
use crate :: util:: literal:: escape_string_symbol;
22
23
@@ -368,22 +369,19 @@ impl MetaItem {
368
369
}
369
370
}
370
371
371
- fn from_tokens < ' a , I > ( tokens : & mut iter:: Peekable < I > ) -> Option < MetaItem >
372
- where
373
- I : Iterator < Item = & ' a TokenTree > ,
374
- {
372
+ fn from_tokens ( iter : & mut TokenStreamIter < ' _ > ) -> Option < MetaItem > {
375
373
// FIXME: Share code with `parse_path`.
376
- let tt = tokens . next ( ) . map ( |tt| TokenTree :: uninterpolate ( tt) ) ;
374
+ let tt = iter . next ( ) . map ( |tt| TokenTree :: uninterpolate ( tt) ) ;
377
375
let path = match tt. as_deref ( ) {
378
376
Some ( & TokenTree :: Token (
379
377
Token { kind : ref kind @ ( token:: Ident ( ..) | token:: PathSep ) , span } ,
380
378
_,
381
379
) ) => ' arm: {
382
380
let mut segments = if let & token:: Ident ( name, _) = kind {
383
381
if let Some ( TokenTree :: Token ( Token { kind : token:: PathSep , .. } , _) ) =
384
- tokens . peek ( )
382
+ iter . peek ( )
385
383
{
386
- tokens . next ( ) ;
384
+ iter . next ( ) ;
387
385
thin_vec ! [ PathSegment :: from_ident( Ident :: new( name, span) ) ]
388
386
} else {
389
387
break ' arm Path :: from_ident ( Ident :: new ( name, span) ) ;
@@ -393,16 +391,16 @@ impl MetaItem {
393
391
} ;
394
392
loop {
395
393
if let Some ( & TokenTree :: Token ( Token { kind : token:: Ident ( name, _) , span } , _) ) =
396
- tokens . next ( ) . map ( |tt| TokenTree :: uninterpolate ( tt) ) . as_deref ( )
394
+ iter . next ( ) . map ( |tt| TokenTree :: uninterpolate ( tt) ) . as_deref ( )
397
395
{
398
396
segments. push ( PathSegment :: from_ident ( Ident :: new ( name, span) ) ) ;
399
397
} else {
400
398
return None ;
401
399
}
402
400
if let Some ( TokenTree :: Token ( Token { kind : token:: PathSep , .. } , _) ) =
403
- tokens . peek ( )
401
+ iter . peek ( )
404
402
{
405
- tokens . next ( ) ;
403
+ iter . next ( ) ;
406
404
} else {
407
405
break ;
408
406
}
@@ -423,8 +421,8 @@ impl MetaItem {
423
421
}
424
422
_ => return None ,
425
423
} ;
426
- let list_closing_paren_pos = tokens . peek ( ) . map ( |tt| tt. span ( ) . hi ( ) ) ;
427
- let kind = MetaItemKind :: from_tokens ( tokens ) ?;
424
+ let list_closing_paren_pos = iter . peek ( ) . map ( |tt| tt. span ( ) . hi ( ) ) ;
425
+ let kind = MetaItemKind :: from_tokens ( iter ) ?;
428
426
let hi = match & kind {
429
427
MetaItemKind :: NameValue ( lit) => lit. span . hi ( ) ,
430
428
MetaItemKind :: List ( ..) => list_closing_paren_pos. unwrap_or ( path. span . hi ( ) ) ,
@@ -440,25 +438,23 @@ impl MetaItem {
440
438
441
439
impl MetaItemKind {
442
440
fn list_from_tokens ( tokens : TokenStream ) -> Option < ThinVec < MetaItemInner > > {
443
- let mut tokens = tokens. trees ( ) . peekable ( ) ;
441
+ let mut iter = tokens. iter ( ) ;
444
442
let mut result = ThinVec :: new ( ) ;
445
- while tokens . peek ( ) . is_some ( ) {
446
- let item = MetaItemInner :: from_tokens ( & mut tokens ) ?;
443
+ while iter . peek ( ) . is_some ( ) {
444
+ let item = MetaItemInner :: from_tokens ( & mut iter ) ?;
447
445
result. push ( item) ;
448
- match tokens . next ( ) {
446
+ match iter . next ( ) {
449
447
None | Some ( TokenTree :: Token ( Token { kind : token:: Comma , .. } , _) ) => { }
450
448
_ => return None ,
451
449
}
452
450
}
453
451
Some ( result)
454
452
}
455
453
456
- fn name_value_from_tokens < ' a > (
457
- tokens : & mut impl Iterator < Item = & ' a TokenTree > ,
458
- ) -> Option < MetaItemKind > {
459
- match tokens. next ( ) {
454
+ fn name_value_from_tokens ( iter : & mut TokenStreamIter < ' _ > ) -> Option < MetaItemKind > {
455
+ match iter. next ( ) {
460
456
Some ( TokenTree :: Delimited ( .., Delimiter :: Invisible ( _) , inner_tokens) ) => {
461
- MetaItemKind :: name_value_from_tokens ( & mut inner_tokens. trees ( ) )
457
+ MetaItemKind :: name_value_from_tokens ( & mut inner_tokens. iter ( ) )
462
458
}
463
459
Some ( TokenTree :: Token ( token, _) ) => {
464
460
MetaItemLit :: from_token ( token) . map ( MetaItemKind :: NameValue )
@@ -467,19 +463,17 @@ impl MetaItemKind {
467
463
}
468
464
}
469
465
470
- fn from_tokens < ' a > (
471
- tokens : & mut iter:: Peekable < impl Iterator < Item = & ' a TokenTree > > ,
472
- ) -> Option < MetaItemKind > {
473
- match tokens. peek ( ) {
466
+ fn from_tokens ( iter : & mut TokenStreamIter < ' _ > ) -> Option < MetaItemKind > {
467
+ match iter. peek ( ) {
474
468
Some ( TokenTree :: Delimited ( .., Delimiter :: Parenthesis , inner_tokens) ) => {
475
469
let inner_tokens = inner_tokens. clone ( ) ;
476
- tokens . next ( ) ;
470
+ iter . next ( ) ;
477
471
MetaItemKind :: list_from_tokens ( inner_tokens) . map ( MetaItemKind :: List )
478
472
}
479
473
Some ( TokenTree :: Delimited ( ..) ) => None ,
480
474
Some ( TokenTree :: Token ( Token { kind : token:: Eq , .. } , _) ) => {
481
- tokens . next ( ) ;
482
- MetaItemKind :: name_value_from_tokens ( tokens )
475
+ iter . next ( ) ;
476
+ MetaItemKind :: name_value_from_tokens ( iter )
483
477
}
484
478
_ => Some ( MetaItemKind :: Word ) ,
485
479
}
@@ -598,22 +592,19 @@ impl MetaItemInner {
598
592
self . meta_item ( ) . is_some ( )
599
593
}
600
594
601
- fn from_tokens < ' a , I > ( tokens : & mut iter:: Peekable < I > ) -> Option < MetaItemInner >
602
- where
603
- I : Iterator < Item = & ' a TokenTree > ,
604
- {
605
- match tokens. peek ( ) {
595
+ fn from_tokens ( iter : & mut TokenStreamIter < ' _ > ) -> Option < MetaItemInner > {
596
+ match iter. peek ( ) {
606
597
Some ( TokenTree :: Token ( token, _) ) if let Some ( lit) = MetaItemLit :: from_token ( token) => {
607
- tokens . next ( ) ;
598
+ iter . next ( ) ;
608
599
return Some ( MetaItemInner :: Lit ( lit) ) ;
609
600
}
610
601
Some ( TokenTree :: Delimited ( .., Delimiter :: Invisible ( _) , inner_tokens) ) => {
611
- tokens . next ( ) ;
612
- return MetaItemInner :: from_tokens ( & mut inner_tokens. trees ( ) . peekable ( ) ) ;
602
+ iter . next ( ) ;
603
+ return MetaItemInner :: from_tokens ( & mut inner_tokens. iter ( ) ) ;
613
604
}
614
605
_ => { }
615
606
}
616
- MetaItem :: from_tokens ( tokens ) . map ( MetaItemInner :: MetaItem )
607
+ MetaItem :: from_tokens ( iter ) . map ( MetaItemInner :: MetaItem )
617
608
}
618
609
}
619
610
0 commit comments