@@ -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 }
@@ -590,6 +591,9 @@ impl Token {
590591 /// for which spans affect name resolution and edition checks.
591592 /// Note that keywords are also identifiers, so they should use this
592593 /// if they keep spans or perform edition checks.
594+ //
595+ // Note: `Parser::uninterpolated_token_span` may give better information
596+ // than this method does.
593597 pub fn uninterpolated_span ( & self ) -> Span {
594598 match self . kind {
595599 NtIdent ( ident, _) | NtLifetime ( ident, _) => ident. span ,
@@ -642,12 +646,7 @@ impl Token {
642646 PathSep | // global path
643647 Lifetime ( ..) | // labeled loop
644648 Pound => true , // expression attributes
645- Interpolated ( ref nt) =>
646- matches ! ( & * * nt,
647- NtBlock ( ..) |
648- NtExpr ( ..) |
649- NtLiteral ( ..)
650- ) ,
649+ Interpolated ( ref nt) => matches ! ( & * * nt, NtBlock ( ..) ) ,
651650 OpenDelim ( Delimiter :: Invisible ( InvisibleOrigin :: MetaVar (
652651 MetaVarKind :: Block |
653652 MetaVarKind :: Expr { .. } |
@@ -677,11 +676,6 @@ impl Token {
677676 Lt | // path (UFCS constant)
678677 Shl => true , // path (double UFCS)
679678 Or => matches ! ( pat_kind, PatWithOr ) , // leading vert `|` or-pattern
680- Interpolated ( nt) =>
681- matches ! ( & * * nt,
682- | NtExpr ( ..)
683- | NtLiteral ( ..)
684- ) ,
685679 OpenDelim ( Delimiter :: Invisible ( InvisibleOrigin :: MetaVar (
686680 MetaVarKind :: Expr { .. } |
687681 MetaVarKind :: Literal |
@@ -724,7 +718,7 @@ impl Token {
724718 match self . kind {
725719 OpenDelim ( Delimiter :: Brace ) | Literal ( ..) | Minus => true ,
726720 Ident ( name, IdentIsRaw :: No ) if name. is_bool_lit ( ) => true ,
727- Interpolated ( ref nt) => matches ! ( & * * nt, NtExpr ( .. ) | NtBlock ( .. ) | NtLiteral ( ..) ) ,
721+ Interpolated ( ref nt) => matches ! ( & * * nt, NtBlock ( ..) ) ,
728722 OpenDelim ( Delimiter :: Invisible ( InvisibleOrigin :: MetaVar (
729723 MetaVarKind :: Expr { .. } | MetaVarKind :: Block | MetaVarKind :: Literal ,
730724 ) ) ) => true ,
@@ -768,22 +762,12 @@ impl Token {
768762 ///
769763 /// In other words, would this token be a valid start of `parse_literal_maybe_minus`?
770764 ///
771- /// Keep this in sync with and `Lit::from_token`, excluding unary negation.
765+ /// Keep this in sync with `Lit::from_token` and `Parser::eat_token_lit`
766+ /// (excluding unary negation).
772767 pub fn can_begin_literal_maybe_minus ( & self ) -> bool {
773768 match self . uninterpolate ( ) . kind {
774769 Literal ( ..) | Minus => true ,
775770 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- } ,
787771 OpenDelim ( Delimiter :: Invisible ( InvisibleOrigin :: MetaVar ( mv_kind) ) ) => match mv_kind {
788772 MetaVarKind :: Literal => true ,
789773 MetaVarKind :: Expr { can_begin_literal_maybe_minus, .. } => {
@@ -798,14 +782,6 @@ impl Token {
798782 pub fn can_begin_string_literal ( & self ) -> bool {
799783 match self . uninterpolate ( ) . kind {
800784 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- } ,
809785 OpenDelim ( Delimiter :: Invisible ( InvisibleOrigin :: MetaVar ( mv_kind) ) ) => match mv_kind {
810786 MetaVarKind :: Literal => true ,
811787 MetaVarKind :: Expr { can_begin_string_literal, .. } => can_begin_string_literal,
@@ -869,19 +845,25 @@ impl Token {
869845
870846 /// Is this a pre-parsed expression dropped into the token stream
871847 /// (which happens while parsing the result of macro expansion)?
872- pub fn is_whole_expr ( & self ) -> bool {
848+ pub fn is_metavar_expr ( & self ) -> bool {
873849 #[ allow( irrefutable_let_patterns) ] // FIXME: temporary
874850 if let Interpolated ( nt) = & self . kind
875- && let NtExpr ( _ ) | NtLiteral ( _ ) | NtBlock ( _) = & * * nt
851+ && let NtBlock ( _) = & * * nt
876852 {
877853 true
854+ } else if matches ! (
855+ self . is_metavar_seq( ) ,
856+ Some ( MetaVarKind :: Expr { .. } | MetaVarKind :: Literal | MetaVarKind :: Path )
857+ ) {
858+ true
878859 } else {
879860 matches ! ( self . is_metavar_seq( ) , Some ( MetaVarKind :: Path ) )
880861 }
881862 }
882863
883864 /// Is the token an interpolated block (`$b:block`)?
884865 pub fn is_whole_block ( & self ) -> bool {
866+ #[ allow( irrefutable_let_patterns) ] // FIXME: temporary
885867 if let Interpolated ( nt) = & self . kind
886868 && let NtBlock ( ..) = & * * nt
887869 {
@@ -1105,8 +1087,6 @@ pub enum NtExprKind {
11051087/// For interpolation during macro expansion.
11061088pub enum Nonterminal {
11071089 NtBlock ( P < ast:: Block > ) ,
1108- NtExpr ( P < ast:: Expr > ) ,
1109- NtLiteral ( P < ast:: Expr > ) ,
11101090}
11111091
11121092#[ derive( Debug , Copy , Clone , PartialEq , Eq , Encodable , Decodable , Hash , HashStable_Generic ) ]
@@ -1196,15 +1176,12 @@ impl Nonterminal {
11961176 pub fn use_span ( & self ) -> Span {
11971177 match self {
11981178 NtBlock ( block) => block. span ,
1199- NtExpr ( expr) | NtLiteral ( expr) => expr. span ,
12001179 }
12011180 }
12021181
12031182 pub fn descr ( & self ) -> & ' static str {
12041183 match self {
12051184 NtBlock ( ..) => "block" ,
1206- NtExpr ( ..) => "expression" ,
1207- NtLiteral ( ..) => "literal" ,
12081185 }
12091186 }
12101187}
@@ -1223,8 +1200,6 @@ impl fmt::Debug for Nonterminal {
12231200 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
12241201 match * self {
12251202 NtBlock ( ..) => f. pad ( "NtBlock(..)" ) ,
1226- NtExpr ( ..) => f. pad ( "NtExpr(..)" ) ,
1227- NtLiteral ( ..) => f. pad ( "NtLiteral(..)" ) ,
12281203 }
12291204 }
12301205}
@@ -1247,7 +1222,7 @@ mod size_asserts {
12471222 // tidy-alphabetical-start
12481223 static_assert_size ! ( Lit , 12 ) ;
12491224 static_assert_size ! ( LitKind , 2 ) ;
1250- static_assert_size ! ( Nonterminal , 16 ) ;
1225+ static_assert_size ! ( Nonterminal , 8 ) ;
12511226 static_assert_size ! ( Token , 24 ) ;
12521227 static_assert_size ! ( TokenKind , 16 ) ;
12531228 // tidy-alphabetical-end
0 commit comments