@@ -198,16 +198,17 @@ impl Lit {
198198 }
199199 }
200200
201- /// Keep this in sync with `Token::can_begin_literal_maybe_minus` excluding unary negation.
201+ /// Keep this in sync with `Token::can_begin_literal_maybe_minus` and
202+ /// `Parser::eat_token_lit` (excluding unary negation).
202203 pub fn from_token ( token : & Token ) -> Option < Lit > {
203204 match token. uninterpolate ( ) . kind {
204205 Ident ( name, IdentIsRaw :: No ) if name. is_bool_lit ( ) => Some ( Lit :: new ( Bool , name, None ) ) ,
205206 Literal ( token_lit) => Some ( token_lit) ,
206- Interpolated ( ref nt )
207- if let NtExpr ( expr ) | NtLiteral ( expr ) = & * * nt
208- && let ast :: ExprKind :: Lit ( token_lit ) = expr . kind =>
209- {
210- Some ( token_lit )
207+ OpenDelim ( Delimiter :: Invisible ( InvisibleOrigin :: MetaVar (
208+ MetaVarKind :: Literal | MetaVarKind :: Expr { .. } ,
209+ ) ) ) => {
210+ // Unreachable with the current test suite.
211+ panic ! ( "from_token metavar" ) ;
211212 }
212213 _ => None ,
213214 }
@@ -447,8 +448,9 @@ pub enum TokenKind {
447448
448449 /// Identifier token.
449450 /// Do not forget about `NtIdent` when you want to match on identifiers.
450- /// It's recommended to use `Token::(ident,uninterpolate,uninterpolated_span)` to
451- /// treat regular and interpolated identifiers in the same way.
451+ /// It's recommended to use `Token::{ident,uninterpolate}` and
452+ /// `Parser::token_uninterpolated_span` to treat regular and interpolated
453+ /// identifiers in the same way.
452454 Ident ( Symbol , IdentIsRaw ) ,
453455 /// This identifier (and its span) is the identifier passed to the
454456 /// declarative macro. The span in the surrounding `Token` is the span of
@@ -457,8 +459,9 @@ pub enum TokenKind {
457459
458460 /// Lifetime identifier token.
459461 /// Do not forget about `NtLifetime` when you want to match on lifetime identifiers.
460- /// It's recommended to use `Token::(lifetime,uninterpolate,uninterpolated_span)` to
461- /// treat regular and interpolated lifetime identifiers in the same way.
462+ /// It's recommended to use `Token::{ident,uninterpolate}` and
463+ /// `Parser::token_uninterpolated_span` to treat regular and interpolated
464+ /// identifiers in the same way.
462465 Lifetime ( Symbol , IdentIsRaw ) ,
463466 /// This identifier (and its span) is the lifetime passed to the
464467 /// declarative macro. The span in the surrounding `Token` is the span of
@@ -584,20 +587,6 @@ impl Token {
584587 Token :: new ( Ident ( ident. name , ident. is_raw_guess ( ) . into ( ) ) , ident. span )
585588 }
586589
587- /// For interpolated tokens, returns a span of the fragment to which the interpolated
588- /// token refers. For all other tokens this is just a regular span.
589- /// It is particularly important to use this for identifiers and lifetimes
590- /// for which spans affect name resolution and edition checks.
591- /// Note that keywords are also identifiers, so they should use this
592- /// if they keep spans or perform edition checks.
593- pub fn uninterpolated_span ( & self ) -> Span {
594- match self . kind {
595- NtIdent ( ident, _) | NtLifetime ( ident, _) => ident. span ,
596- Interpolated ( ref nt) => nt. use_span ( ) ,
597- _ => self . span ,
598- }
599- }
600-
601590 pub fn is_range_separator ( & self ) -> bool {
602591 [ DotDot , DotDotDot , DotDotEq ] . contains ( & self . kind )
603592 }
@@ -642,12 +631,7 @@ impl Token {
642631 PathSep | // global path
643632 Lifetime ( ..) | // labeled loop
644633 Pound => true , // expression attributes
645- Interpolated ( ref nt) =>
646- matches ! ( & * * nt,
647- NtBlock ( ..) |
648- NtExpr ( ..) |
649- NtLiteral ( ..)
650- ) ,
634+ Interpolated ( ref nt) => matches ! ( & * * nt, NtBlock ( ..) ) ,
651635 OpenDelim ( Delimiter :: Invisible ( InvisibleOrigin :: MetaVar (
652636 MetaVarKind :: Block |
653637 MetaVarKind :: Expr { .. } |
@@ -677,11 +661,6 @@ impl Token {
677661 Lt | // path (UFCS constant)
678662 Shl => true , // path (double UFCS)
679663 Or => matches ! ( pat_kind, PatWithOr ) , // leading vert `|` or-pattern
680- Interpolated ( nt) =>
681- matches ! ( & * * nt,
682- | NtExpr ( ..)
683- | NtLiteral ( ..)
684- ) ,
685664 OpenDelim ( Delimiter :: Invisible ( InvisibleOrigin :: MetaVar (
686665 MetaVarKind :: Expr { .. } |
687666 MetaVarKind :: Literal |
@@ -724,7 +703,7 @@ impl Token {
724703 match self . kind {
725704 OpenDelim ( Delimiter :: Brace ) | Literal ( ..) | Minus => true ,
726705 Ident ( name, IdentIsRaw :: No ) if name. is_bool_lit ( ) => true ,
727- Interpolated ( ref nt) => matches ! ( & * * nt, NtExpr ( .. ) | NtBlock ( .. ) | NtLiteral ( ..) ) ,
706+ Interpolated ( ref nt) => matches ! ( & * * nt, NtBlock ( ..) ) ,
728707 OpenDelim ( Delimiter :: Invisible ( InvisibleOrigin :: MetaVar (
729708 MetaVarKind :: Expr { .. } | MetaVarKind :: Block | MetaVarKind :: Literal ,
730709 ) ) ) => true ,
@@ -768,22 +747,12 @@ impl Token {
768747 ///
769748 /// In other words, would this token be a valid start of `parse_literal_maybe_minus`?
770749 ///
771- /// Keep this in sync with and `Lit::from_token`, excluding unary negation.
750+ /// Keep this in sync with `Lit::from_token` and `Parser::eat_token_lit`
751+ /// (excluding unary negation).
772752 pub fn can_begin_literal_maybe_minus ( & self ) -> bool {
773753 match self . uninterpolate ( ) . kind {
774754 Literal ( ..) | Minus => true ,
775755 Ident ( name, IdentIsRaw :: No ) if name. is_bool_lit ( ) => true ,
776- Interpolated ( ref nt) => match & * * nt {
777- NtLiteral ( _) => true ,
778- NtExpr ( e) => match & e. kind {
779- ast:: ExprKind :: Lit ( _) => true ,
780- ast:: ExprKind :: Unary ( ast:: UnOp :: Neg , e) => {
781- matches ! ( & e. kind, ast:: ExprKind :: Lit ( _) )
782- }
783- _ => false ,
784- } ,
785- _ => false ,
786- } ,
787756 OpenDelim ( Delimiter :: Invisible ( InvisibleOrigin :: MetaVar ( mv_kind) ) ) => match mv_kind {
788757 MetaVarKind :: Literal => true ,
789758 MetaVarKind :: Expr { can_begin_literal_maybe_minus, .. } => {
@@ -798,14 +767,6 @@ impl Token {
798767 pub fn can_begin_string_literal ( & self ) -> bool {
799768 match self . uninterpolate ( ) . kind {
800769 Literal ( ..) => true ,
801- Interpolated ( ref nt) => match & * * nt {
802- NtLiteral ( _) => true ,
803- NtExpr ( e) => match & e. kind {
804- ast:: ExprKind :: Lit ( _) => true ,
805- _ => false ,
806- } ,
807- _ => false ,
808- } ,
809770 OpenDelim ( Delimiter :: Invisible ( InvisibleOrigin :: MetaVar ( mv_kind) ) ) => match mv_kind {
810771 MetaVarKind :: Literal => true ,
811772 MetaVarKind :: Expr { can_begin_string_literal, .. } => can_begin_string_literal,
@@ -869,19 +830,25 @@ impl Token {
869830
870831 /// Is this a pre-parsed expression dropped into the token stream
871832 /// (which happens while parsing the result of macro expansion)?
872- pub fn is_whole_expr ( & self ) -> bool {
833+ pub fn is_metavar_expr ( & self ) -> bool {
873834 #[ allow( irrefutable_let_patterns) ] // FIXME: temporary
874835 if let Interpolated ( nt) = & self . kind
875- && let NtExpr ( _ ) | NtLiteral ( _ ) | NtBlock ( _) = & * * nt
836+ && let NtBlock ( _) = & * * nt
876837 {
877838 true
839+ } else if matches ! (
840+ self . is_metavar_seq( ) ,
841+ Some ( MetaVarKind :: Expr { .. } | MetaVarKind :: Literal | MetaVarKind :: Path )
842+ ) {
843+ true
878844 } else {
879845 matches ! ( self . is_metavar_seq( ) , Some ( MetaVarKind :: Path ) )
880846 }
881847 }
882848
883849 /// Is the token an interpolated block (`$b:block`)?
884850 pub fn is_whole_block ( & self ) -> bool {
851+ #[ allow( irrefutable_let_patterns) ] // FIXME: temporary
885852 if let Interpolated ( nt) = & self . kind
886853 && let NtBlock ( ..) = & * * nt
887854 {
@@ -1100,8 +1067,6 @@ pub enum NtExprKind {
11001067/// For interpolation during macro expansion.
11011068pub enum Nonterminal {
11021069 NtBlock ( P < ast:: Block > ) ,
1103- NtExpr ( P < ast:: Expr > ) ,
1104- NtLiteral ( P < ast:: Expr > ) ,
11051070}
11061071
11071072#[ derive( Debug , Copy , Clone , PartialEq , Eq , Encodable , Decodable , Hash , HashStable_Generic ) ]
@@ -1191,15 +1156,12 @@ impl Nonterminal {
11911156 pub fn use_span ( & self ) -> Span {
11921157 match self {
11931158 NtBlock ( block) => block. span ,
1194- NtExpr ( expr) | NtLiteral ( expr) => expr. span ,
11951159 }
11961160 }
11971161
11981162 pub fn descr ( & self ) -> & ' static str {
11991163 match self {
12001164 NtBlock ( ..) => "block" ,
1201- NtExpr ( ..) => "expression" ,
1202- NtLiteral ( ..) => "literal" ,
12031165 }
12041166 }
12051167}
@@ -1218,8 +1180,6 @@ impl fmt::Debug for Nonterminal {
12181180 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
12191181 match * self {
12201182 NtBlock ( ..) => f. pad ( "NtBlock(..)" ) ,
1221- NtExpr ( ..) => f. pad ( "NtExpr(..)" ) ,
1222- NtLiteral ( ..) => f. pad ( "NtLiteral(..)" ) ,
12231183 }
12241184 }
12251185}
@@ -1242,7 +1202,7 @@ mod size_asserts {
12421202 // tidy-alphabetical-start
12431203 static_assert_size ! ( Lit , 12 ) ;
12441204 static_assert_size ! ( LitKind , 2 ) ;
1245- static_assert_size ! ( Nonterminal , 16 ) ;
1205+ static_assert_size ! ( Nonterminal , 8 ) ;
12461206 static_assert_size ! ( Token , 24 ) ;
12471207 static_assert_size ! ( TokenKind , 16 ) ;
12481208 // tidy-alphabetical-end
0 commit comments