@@ -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). 
202203pub  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). 
772767pub  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`)? 
884865pub  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