@@ -318,11 +318,20 @@ pub enum TokenKind {
318
318
/// It's recommended to use `Token::(ident,uninterpolate,uninterpolated_span)` to
319
319
/// treat regular and interpolated identifiers in the same way.
320
320
Ident ( Symbol , IdentIsRaw ) ,
321
+ /// This identifier (and its span) is the identifier passed to the
322
+ /// declarative macro. The span in the surrounding `Token` is the span of
323
+ /// the `ident` metavariable in the macro's RHS.
324
+ NtIdent ( Ident , IdentIsRaw ) ,
325
+
321
326
/// Lifetime identifier token.
322
327
/// Do not forget about `NtLifetime` when you want to match on lifetime identifiers.
323
328
/// It's recommended to use `Token::(lifetime,uninterpolate,uninterpolated_span)` to
324
329
/// treat regular and interpolated lifetime identifiers in the same way.
325
330
Lifetime ( Symbol ) ,
331
+ /// This identifier (and its span) is the lifetime passed to the
332
+ /// declarative macro. The span in the surrounding `Token` is the span of
333
+ /// the `lifetime` metavariable in the macro's RHS.
334
+ NtLifetime ( Ident ) ,
326
335
327
336
/// An embedded AST node, as produced by a macro. This only exists for
328
337
/// historical reasons. We'd like to get rid of it, for multiple reasons.
@@ -444,8 +453,9 @@ impl Token {
444
453
/// Note that keywords are also identifiers, so they should use this
445
454
/// if they keep spans or perform edition checks.
446
455
pub fn uninterpolated_span ( & self ) -> Span {
447
- match & self . kind {
448
- Interpolated ( nt) => nt. use_span ( ) ,
456
+ match self . kind {
457
+ NtIdent ( ident, _) | NtLifetime ( ident) => ident. span ,
458
+ Interpolated ( ref nt) => nt. use_span ( ) ,
449
459
_ => self . span ,
450
460
}
451
461
}
@@ -463,7 +473,7 @@ impl Token {
463
473
}
464
474
465
475
OpenDelim ( ..) | CloseDelim ( ..) | Literal ( ..) | DocComment ( ..) | Ident ( ..)
466
- | Lifetime ( ..) | Interpolated ( ..) | Eof => false ,
476
+ | NtIdent ( .. ) | Lifetime ( .. ) | NtLifetime ( ..) | Interpolated ( ..) | Eof => false ,
467
477
}
468
478
}
469
479
@@ -613,14 +623,9 @@ impl Token {
613
623
/// into the regular identifier or lifetime token it refers to,
614
624
/// otherwise returns the original token.
615
625
pub fn uninterpolate ( & self ) -> Cow < ' _ , Token > {
616
- match & self . kind {
617
- Interpolated ( nt) => match & * * nt {
618
- NtIdent ( ident, is_raw) => {
619
- Cow :: Owned ( Token :: new ( Ident ( ident. name , * is_raw) , ident. span ) )
620
- }
621
- NtLifetime ( ident) => Cow :: Owned ( Token :: new ( Lifetime ( ident. name ) , ident. span ) ) ,
622
- _ => Cow :: Borrowed ( self ) ,
623
- } ,
626
+ match self . kind {
627
+ NtIdent ( ident, is_raw) => Cow :: Owned ( Token :: new ( Ident ( ident. name , is_raw) , ident. span ) ) ,
628
+ NtLifetime ( ident) => Cow :: Owned ( Token :: new ( Lifetime ( ident. name ) , ident. span ) ) ,
624
629
_ => Cow :: Borrowed ( self ) ,
625
630
}
626
631
}
@@ -629,12 +634,9 @@ impl Token {
629
634
#[ inline]
630
635
pub fn ident ( & self ) -> Option < ( Ident , IdentIsRaw ) > {
631
636
// We avoid using `Token::uninterpolate` here because it's slow.
632
- match & self . kind {
633
- & Ident ( name, is_raw) => Some ( ( Ident :: new ( name, self . span ) , is_raw) ) ,
634
- Interpolated ( nt) => match & * * nt {
635
- NtIdent ( ident, is_raw) => Some ( ( * ident, * is_raw) ) ,
636
- _ => None ,
637
- } ,
637
+ match self . kind {
638
+ Ident ( name, is_raw) => Some ( ( Ident :: new ( name, self . span ) , is_raw) ) ,
639
+ NtIdent ( ident, is_raw) => Some ( ( ident, is_raw) ) ,
638
640
_ => None ,
639
641
}
640
642
}
@@ -643,12 +645,9 @@ impl Token {
643
645
#[ inline]
644
646
pub fn lifetime ( & self ) -> Option < Ident > {
645
647
// We avoid using `Token::uninterpolate` here because it's slow.
646
- match & self . kind {
647
- & Lifetime ( name) => Some ( Ident :: new ( name, self . span ) ) ,
648
- Interpolated ( nt) => match & * * nt {
649
- NtLifetime ( ident) => Some ( * ident) ,
650
- _ => None ,
651
- } ,
648
+ match self . kind {
649
+ Lifetime ( name) => Some ( Ident :: new ( name, self . span ) ) ,
650
+ NtLifetime ( ident) => Some ( ident) ,
652
651
_ => None ,
653
652
}
654
653
}
@@ -837,8 +836,10 @@ impl Token {
837
836
838
837
Le | EqEq | Ne | Ge | AndAnd | OrOr | Tilde | BinOpEq ( ..) | At | DotDotDot
839
838
| DotDotEq | Comma | Semi | PathSep | RArrow | LArrow | FatArrow | Pound | Dollar
840
- | Question | OpenDelim ( ..) | CloseDelim ( ..) | Literal ( ..) | Ident ( ..)
841
- | Lifetime ( ..) | Interpolated ( ..) | DocComment ( ..) | Eof => return None ,
839
+ | Question | OpenDelim ( ..) | CloseDelim ( ..) | Literal ( ..) | Ident ( ..) | NtIdent ( ..)
840
+ | Lifetime ( ..) | NtLifetime ( ..) | Interpolated ( ..) | DocComment ( ..) | Eof => {
841
+ return None ;
842
+ }
842
843
} ;
843
844
844
845
Some ( Token :: new ( kind, self . span . to ( joint. span ) ) )
@@ -861,9 +862,6 @@ pub enum Nonterminal {
861
862
NtPat ( P < ast:: Pat > ) ,
862
863
NtExpr ( P < ast:: Expr > ) ,
863
864
NtTy ( P < ast:: Ty > ) ,
864
- /// The span is for the identifier argument passed to the macro.
865
- NtIdent ( Ident , IdentIsRaw ) ,
866
- NtLifetime ( Ident ) ,
867
865
NtLiteral ( P < ast:: Expr > ) ,
868
866
/// Stuff inside brackets for attributes
869
867
NtMeta ( P < ast:: AttrItem > ) ,
@@ -958,7 +956,6 @@ impl Nonterminal {
958
956
NtPat ( pat) => pat. span ,
959
957
NtExpr ( expr) | NtLiteral ( expr) => expr. span ,
960
958
NtTy ( ty) => ty. span ,
961
- NtIdent ( ident, _) | NtLifetime ( ident) => ident. span ,
962
959
NtMeta ( attr_item) => attr_item. span ( ) ,
963
960
NtPath ( path) => path. span ,
964
961
NtVis ( vis) => vis. span ,
@@ -974,8 +971,6 @@ impl Nonterminal {
974
971
NtExpr ( ..) => "expression" ,
975
972
NtLiteral ( ..) => "literal" ,
976
973
NtTy ( ..) => "type" ,
977
- NtIdent ( ..) => "identifier" ,
978
- NtLifetime ( ..) => "lifetime" ,
979
974
NtMeta ( ..) => "attribute" ,
980
975
NtPath ( ..) => "path" ,
981
976
NtVis ( ..) => "visibility" ,
@@ -984,18 +979,12 @@ impl Nonterminal {
984
979
}
985
980
986
981
impl PartialEq for Nonterminal {
987
- fn eq ( & self , rhs : & Self ) -> bool {
988
- match ( self , rhs) {
989
- ( NtIdent ( ident_lhs, is_raw_lhs) , NtIdent ( ident_rhs, is_raw_rhs) ) => {
990
- ident_lhs == ident_rhs && is_raw_lhs == is_raw_rhs
991
- }
992
- ( NtLifetime ( ident_lhs) , NtLifetime ( ident_rhs) ) => ident_lhs == ident_rhs,
993
- // FIXME: Assume that all "complex" nonterminal are not equal, we can't compare them
994
- // correctly based on data from AST. This will prevent them from matching each other
995
- // in macros. The comparison will become possible only when each nonterminal has an
996
- // attached token stream from which it was parsed.
997
- _ => false ,
998
- }
982
+ fn eq ( & self , _rhs : & Self ) -> bool {
983
+ // FIXME: Assume that all nonterminals are not equal, we can't compare them
984
+ // correctly based on data from AST. This will prevent them from matching each other
985
+ // in macros. The comparison will become possible only when each nonterminal has an
986
+ // attached token stream from which it was parsed.
987
+ false
999
988
}
1000
989
}
1001
990
@@ -1008,12 +997,10 @@ impl fmt::Debug for Nonterminal {
1008
997
NtPat ( ..) => f. pad ( "NtPat(..)" ) ,
1009
998
NtExpr ( ..) => f. pad ( "NtExpr(..)" ) ,
1010
999
NtTy ( ..) => f. pad ( "NtTy(..)" ) ,
1011
- NtIdent ( ..) => f. pad ( "NtIdent(..)" ) ,
1012
1000
NtLiteral ( ..) => f. pad ( "NtLiteral(..)" ) ,
1013
1001
NtMeta ( ..) => f. pad ( "NtMeta(..)" ) ,
1014
1002
NtPath ( ..) => f. pad ( "NtPath(..)" ) ,
1015
1003
NtVis ( ..) => f. pad ( "NtVis(..)" ) ,
1016
- NtLifetime ( ..) => f. pad ( "NtLifetime(..)" ) ,
1017
1004
}
1018
1005
}
1019
1006
}
0 commit comments