11use rustc_ast:: ptr:: P ;
2- use rustc_ast:: token:: { self , Delimiter , Nonterminal , Nonterminal :: * , NonterminalKind , Token } ;
2+ use rustc_ast:: token:: {
3+ self , Delimiter , InvisibleOrigin , Nonterminal , Nonterminal :: * , NonterminalKind , Token ,
4+ } ;
35use rustc_ast:: HasTokens ;
46use rustc_ast_pretty:: pprust;
57use rustc_errors:: PResult ;
@@ -18,7 +20,30 @@ impl<'a> Parser<'a> {
1820 #[ inline]
1921 pub fn nonterminal_may_begin_with ( kind : NonterminalKind , token : & Token ) -> bool {
2022 /// Checks whether the non-terminal may contain a single (non-keyword) identifier.
21- fn may_be_ident ( nt : & token:: Nonterminal ) -> bool {
23+ fn may_be_ident ( kind : NonterminalKind ) -> bool {
24+ use NonterminalKind :: * ;
25+ match kind {
26+ Stmt
27+ | PatParam { .. }
28+ | PatWithOr
29+ | Expr
30+ | Ty
31+ | Ident
32+ | Literal // `true`, `false`
33+ | Meta
34+ | Path => true ,
35+
36+ Item
37+ | Block
38+ | Vis
39+ | Lifetime => false ,
40+
41+ TT => unreachable ! ( ) ,
42+ }
43+ }
44+
45+ /// Old variant of `may_be_ident`. Being phased out.
46+ fn nt_may_be_ident ( nt : & token:: Nonterminal ) -> bool {
2247 match nt {
2348 NtStmt ( _)
2449 | NtPat ( _)
@@ -48,8 +73,11 @@ impl<'a> Parser<'a> {
4873 NonterminalKind :: Ident => get_macro_ident ( token) . is_some ( ) ,
4974 NonterminalKind :: Literal => token. can_begin_literal_maybe_minus ( ) ,
5075 NonterminalKind :: Vis => match token. kind {
51- // The follow-set of :vis + "priv" keyword + interpolated
52- token:: Comma | token:: Ident ( ..) | token:: Interpolated ( _) => true ,
76+ // The follow-set of :vis + "priv" keyword + interpolated/metavar-expansion
77+ token:: Comma
78+ | token:: Ident ( ..)
79+ | token:: Interpolated ( ..)
80+ | token:: OpenDelim ( Delimiter :: Invisible ( InvisibleOrigin :: MetaVar ( _) ) ) => true ,
5381 _ => token. can_begin_type ( ) ,
5482 } ,
5583 NonterminalKind :: Block => match & token. kind {
@@ -59,11 +87,30 @@ impl<'a> Parser<'a> {
5987 NtItem ( _) | NtPat ( _) | NtTy ( _) | NtIdent ( ..) | NtMeta ( _) | NtPath ( _)
6088 | NtVis ( _) => false ,
6189 } ,
90+ token:: OpenDelim ( Delimiter :: Invisible ( InvisibleOrigin :: MetaVar ( k) ) ) => match k {
91+ NonterminalKind :: Block
92+ | NonterminalKind :: Lifetime
93+ | NonterminalKind :: Stmt
94+ | NonterminalKind :: Expr
95+ | NonterminalKind :: Literal => true ,
96+ NonterminalKind :: Item
97+ | NonterminalKind :: PatParam { .. }
98+ | NonterminalKind :: PatWithOr
99+ | NonterminalKind :: Ty
100+ | NonterminalKind :: Ident
101+ | NonterminalKind :: Meta
102+ | NonterminalKind :: Path
103+ | NonterminalKind :: Vis => false ,
104+ NonterminalKind :: TT => unreachable ! ( ) ,
105+ } ,
62106 _ => false ,
63107 } ,
64108 NonterminalKind :: Path | NonterminalKind :: Meta => match & token. kind {
65109 token:: PathSep | token:: Ident ( ..) => true ,
66- token:: Interpolated ( nt) => may_be_ident ( & nt. 0 ) ,
110+ token:: Interpolated ( nt) => nt_may_be_ident ( & nt. 0 ) ,
111+ token:: OpenDelim ( Delimiter :: Invisible ( InvisibleOrigin :: MetaVar ( kind) ) ) => {
112+ may_be_ident ( * kind)
113+ }
67114 _ => false ,
68115 } ,
69116 NonterminalKind :: PatParam { .. } | NonterminalKind :: PatWithOr => match & token. kind {
@@ -81,14 +128,20 @@ impl<'a> Parser<'a> {
81128 token:: BinOp ( token:: Shl ) => true , // path (double UFCS)
82129 // leading vert `|` or-pattern
83130 token:: BinOp ( token:: Or ) => matches ! ( kind, NonterminalKind :: PatWithOr ) ,
84- token:: Interpolated ( nt) => may_be_ident ( & nt. 0 ) ,
131+ token:: Interpolated ( nt) => nt_may_be_ident ( & nt. 0 ) ,
132+ token:: OpenDelim ( Delimiter :: Invisible ( InvisibleOrigin :: MetaVar ( kind) ) ) => {
133+ may_be_ident ( * kind)
134+ }
85135 _ => false ,
86136 } ,
87137 NonterminalKind :: Lifetime => match & token. kind {
88138 token:: Lifetime ( _) => true ,
89139 token:: Interpolated ( nt) => {
90140 matches ! ( & nt. 0 , NtLifetime ( _) )
91141 }
142+ token:: OpenDelim ( Delimiter :: Invisible ( InvisibleOrigin :: MetaVar (
143+ NonterminalKind :: Lifetime ,
144+ ) ) ) => true ,
92145 _ => false ,
93146 } ,
94147 NonterminalKind :: TT | NonterminalKind :: Item | NonterminalKind :: Stmt => {
0 commit comments