1
1
//! Functions dealing with attributes and meta items.
2
2
3
3
use std:: fmt:: Debug ;
4
- use std:: iter;
5
4
use std:: sync:: atomic:: { AtomicU32 , Ordering } ;
6
5
7
6
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
@@ -365,22 +366,19 @@ impl MetaItem {
365
366
}
366
367
}
367
368
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 > {
372
370
// 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) ) ;
374
372
let path = match tt. as_deref ( ) {
375
373
Some ( & TokenTree :: Token (
376
374
Token { kind : ref kind @ ( token:: Ident ( ..) | token:: PathSep ) , span } ,
377
375
_,
378
376
) ) => ' arm: {
379
377
let mut segments = if let & token:: Ident ( name, _) = kind {
380
378
if let Some ( TokenTree :: Token ( Token { kind : token:: PathSep , .. } , _) ) =
381
- tokens . peek ( )
379
+ iter . peek ( )
382
380
{
383
- tokens . next ( ) ;
381
+ iter . next ( ) ;
384
382
thin_vec ! [ PathSegment :: from_ident( Ident :: new( name, span) ) ]
385
383
} else {
386
384
break ' arm Path :: from_ident ( Ident :: new ( name, span) ) ;
@@ -390,16 +388,16 @@ impl MetaItem {
390
388
} ;
391
389
loop {
392
390
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 ( )
394
392
{
395
393
segments. push ( PathSegment :: from_ident ( Ident :: new ( name, span) ) ) ;
396
394
} else {
397
395
return None ;
398
396
}
399
397
if let Some ( TokenTree :: Token ( Token { kind : token:: PathSep , .. } , _) ) =
400
- tokens . peek ( )
398
+ iter . peek ( )
401
399
{
402
- tokens . next ( ) ;
400
+ iter . next ( ) ;
403
401
} else {
404
402
break ;
405
403
}
@@ -420,8 +418,8 @@ impl MetaItem {
420
418
}
421
419
_ => return None ,
422
420
} ;
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 ) ?;
425
423
let hi = match & kind {
426
424
MetaItemKind :: NameValue ( lit) => lit. span . hi ( ) ,
427
425
MetaItemKind :: List ( ..) => list_closing_paren_pos. unwrap_or ( path. span . hi ( ) ) ,
@@ -438,25 +436,23 @@ impl MetaItem {
438
436
impl MetaItemKind {
439
437
// public because it can be called in the hir
440
438
pub fn list_from_tokens ( tokens : TokenStream ) -> Option < ThinVec < MetaItemInner > > {
441
- let mut tokens = tokens. trees ( ) . peekable ( ) ;
439
+ let mut iter = tokens. iter ( ) ;
442
440
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 ) ?;
445
443
result. push ( item) ;
446
- match tokens . next ( ) {
444
+ match iter . next ( ) {
447
445
None | Some ( TokenTree :: Token ( Token { kind : token:: Comma , .. } , _) ) => { }
448
446
_ => return None ,
449
447
}
450
448
}
451
449
Some ( result)
452
450
}
453
451
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 ( ) {
458
454
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 ( ) )
460
456
}
461
457
Some ( TokenTree :: Token ( token, _) ) => {
462
458
MetaItemLit :: from_token ( token) . map ( MetaItemKind :: NameValue )
@@ -465,19 +461,17 @@ impl MetaItemKind {
465
461
}
466
462
}
467
463
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 ( ) {
472
466
Some ( TokenTree :: Delimited ( .., Delimiter :: Parenthesis , inner_tokens) ) => {
473
467
let inner_tokens = inner_tokens. clone ( ) ;
474
- tokens . next ( ) ;
468
+ iter . next ( ) ;
475
469
MetaItemKind :: list_from_tokens ( inner_tokens) . map ( MetaItemKind :: List )
476
470
}
477
471
Some ( TokenTree :: Delimited ( ..) ) => None ,
478
472
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 )
481
475
}
482
476
_ => Some ( MetaItemKind :: Word ) ,
483
477
}
@@ -593,22 +587,19 @@ impl MetaItemInner {
593
587
self . meta_item ( ) . is_some ( )
594
588
}
595
589
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 ( ) {
601
592
Some ( TokenTree :: Token ( token, _) ) if let Some ( lit) = MetaItemLit :: from_token ( token) => {
602
- tokens . next ( ) ;
593
+ iter . next ( ) ;
603
594
return Some ( MetaItemInner :: Lit ( lit) ) ;
604
595
}
605
596
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 ( ) ) ;
608
599
}
609
600
_ => { }
610
601
}
611
- MetaItem :: from_tokens ( tokens ) . map ( MetaItemInner :: MetaItem )
602
+ MetaItem :: from_tokens ( iter ) . map ( MetaItemInner :: MetaItem )
612
603
}
613
604
}
614
605
0 commit comments