@@ -90,7 +90,10 @@ pub enum MetaVarKind {
9090 Ident ,
9191 Lifetime ,
9292 Literal ,
93- Meta ,
93+ Meta {
94+ /// Will `AttrItem::meta` succeed on this, if reparsed?
95+ has_meta_form : bool ,
96+ } ,
9497 Path ,
9598 Vis ,
9699 TT ,
@@ -110,7 +113,7 @@ impl fmt::Display for MetaVarKind {
110113 MetaVarKind :: Ident => sym:: ident,
111114 MetaVarKind :: Lifetime => sym:: lifetime,
112115 MetaVarKind :: Literal => sym:: literal,
113- MetaVarKind :: Meta => sym:: meta,
116+ MetaVarKind :: Meta { .. } => sym:: meta,
114117 MetaVarKind :: Path => sym:: path,
115118 MetaVarKind :: Vis => sym:: vis,
116119 MetaVarKind :: TT => sym:: tt,
@@ -621,8 +624,7 @@ impl Token {
621624 matches ! ( & * * nt,
622625 NtBlock ( ..) |
623626 NtExpr ( ..) |
624- NtLiteral ( ..) |
625- NtPath ( ..)
627+ NtLiteral ( ..)
626628 ) ,
627629 OpenDelim ( Delimiter :: Invisible ( InvisibleOrigin :: MetaVar (
628630 MetaVarKind :: Block |
@@ -658,14 +660,11 @@ impl Token {
658660 matches ! ( & * * nt,
659661 | NtExpr ( ..)
660662 | NtLiteral ( ..)
661- | NtMeta ( ..)
662- | NtPat ( ..)
663- | NtPath ( ..)
664663 ) ,
665664 OpenDelim ( Delimiter :: Invisible ( InvisibleOrigin :: MetaVar (
666665 MetaVarKind :: Expr { .. } |
667666 MetaVarKind :: Literal |
668- MetaVarKind :: Meta |
667+ MetaVarKind :: Meta { .. } |
669668 MetaVarKind :: Pat ( _) |
670669 MetaVarKind :: Path |
671670 MetaVarKind :: Ty { .. }
@@ -689,7 +688,6 @@ impl Token {
689688 Lifetime ( ..) | // lifetime bound in trait object
690689 Lt | BinOp ( Shl ) | // associated path
691690 PathSep => true , // global path
692- Interpolated ( ref nt) => matches ! ( & * * nt, NtPath ( ..) ) ,
693691 OpenDelim ( Delimiter :: Invisible ( InvisibleOrigin :: MetaVar (
694692 MetaVarKind :: Ty { .. } |
695693 MetaVarKind :: Path
@@ -848,27 +846,16 @@ impl Token {
848846 self . ident ( ) . is_some_and ( |( ident, _) | ident. name == name)
849847 }
850848
851- /// Returns `true` if the token is an interpolated path.
852- fn is_whole_path ( & self ) -> bool {
853- if let Interpolated ( nt) = & self . kind
854- && let NtPath ( ..) = & * * nt
855- {
856- return true ;
857- }
858-
859- false
860- }
861-
862849 /// Is this a pre-parsed expression dropped into the token stream
863850 /// (which happens while parsing the result of macro expansion)?
864851 pub fn is_whole_expr ( & self ) -> bool {
865852 if let Interpolated ( nt) = & self . kind
866- && let NtExpr ( _) | NtLiteral ( _) | NtPath ( _ ) | NtBlock ( _) = & * * nt
853+ && let NtExpr ( _) | NtLiteral ( _) | NtBlock ( _) = & * * nt
867854 {
868- return true ;
855+ true
856+ } else {
857+ matches ! ( self . is_metavar_seq( ) , Some ( MetaVarKind :: Path ) )
869858 }
870-
871- false
872859 }
873860
874861 /// Is the token an interpolated block (`$b:block`)?
@@ -894,7 +881,7 @@ impl Token {
894881 pub fn is_path_start ( & self ) -> bool {
895882 self == & PathSep
896883 || self . is_qpath_start ( )
897- || self . is_whole_path ( )
884+ || matches ! ( self . is_metavar_seq ( ) , Some ( MetaVarKind :: Path ) )
898885 || self . is_path_segment_keyword ( )
899886 || self . is_ident ( ) && !self . is_reserved_ident ( )
900887 }
@@ -1075,12 +1062,8 @@ pub enum Nonterminal {
10751062 NtItem ( P < ast:: Item > ) ,
10761063 NtBlock ( P < ast:: Block > ) ,
10771064 NtStmt ( P < ast:: Stmt > ) ,
1078- NtPat ( P < ast:: Pat > ) ,
10791065 NtExpr ( P < ast:: Expr > ) ,
10801066 NtLiteral ( P < ast:: Expr > ) ,
1081- /// Stuff inside brackets for attributes
1082- NtMeta ( P < ast:: AttrItem > ) ,
1083- NtPath ( P < ast:: Path > ) ,
10841067}
10851068
10861069#[ derive( Debug , Copy , Clone , PartialEq , Eq , Encodable , Decodable , Hash , HashStable_Generic ) ]
@@ -1172,10 +1155,7 @@ impl Nonterminal {
11721155 NtItem ( item) => item. span ,
11731156 NtBlock ( block) => block. span ,
11741157 NtStmt ( stmt) => stmt. span ,
1175- NtPat ( pat) => pat. span ,
11761158 NtExpr ( expr) | NtLiteral ( expr) => expr. span ,
1177- NtMeta ( attr_item) => attr_item. span ( ) ,
1178- NtPath ( path) => path. span ,
11791159 }
11801160 }
11811161
@@ -1184,11 +1164,8 @@ impl Nonterminal {
11841164 NtItem ( ..) => "item" ,
11851165 NtBlock ( ..) => "block" ,
11861166 NtStmt ( ..) => "statement" ,
1187- NtPat ( ..) => "pattern" ,
11881167 NtExpr ( ..) => "expression" ,
11891168 NtLiteral ( ..) => "literal" ,
1190- NtMeta ( ..) => "attribute" ,
1191- NtPath ( ..) => "path" ,
11921169 }
11931170 }
11941171}
@@ -1209,11 +1186,8 @@ impl fmt::Debug for Nonterminal {
12091186 NtItem ( ..) => f. pad ( "NtItem(..)" ) ,
12101187 NtBlock ( ..) => f. pad ( "NtBlock(..)" ) ,
12111188 NtStmt ( ..) => f. pad ( "NtStmt(..)" ) ,
1212- NtPat ( ..) => f. pad ( "NtPat(..)" ) ,
12131189 NtExpr ( ..) => f. pad ( "NtExpr(..)" ) ,
12141190 NtLiteral ( ..) => f. pad ( "NtLiteral(..)" ) ,
1215- NtMeta ( ..) => f. pad ( "NtMeta(..)" ) ,
1216- NtPath ( ..) => f. pad ( "NtPath(..)" ) ,
12171191 }
12181192 }
12191193}
0 commit comments