1
1
use 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
+ } ;
3
5
use rustc_ast:: HasTokens ;
4
6
use rustc_ast_pretty:: pprust;
5
7
use rustc_errors:: PResult ;
@@ -18,7 +20,30 @@ impl<'a> Parser<'a> {
18
20
#[ inline]
19
21
pub fn nonterminal_may_begin_with ( kind : NonterminalKind , token : & Token ) -> bool {
20
22
/// 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 {
22
47
match nt {
23
48
NtStmt ( _)
24
49
| NtPat ( _)
@@ -48,8 +73,11 @@ impl<'a> Parser<'a> {
48
73
NonterminalKind :: Ident => get_macro_ident ( token) . is_some ( ) ,
49
74
NonterminalKind :: Literal => token. can_begin_literal_maybe_minus ( ) ,
50
75
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 ,
53
81
_ => token. can_begin_type ( ) ,
54
82
} ,
55
83
NonterminalKind :: Block => match & token. kind {
@@ -59,11 +87,30 @@ impl<'a> Parser<'a> {
59
87
NtItem ( _) | NtPat ( _) | NtTy ( _) | NtIdent ( ..) | NtMeta ( _) | NtPath ( _)
60
88
| NtVis ( _) => false ,
61
89
} ,
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
+ } ,
62
106
_ => false ,
63
107
} ,
64
108
NonterminalKind :: Path | NonterminalKind :: Meta => match & token. kind {
65
109
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
+ }
67
114
_ => false ,
68
115
} ,
69
116
NonterminalKind :: PatParam { .. } | NonterminalKind :: PatWithOr => match & token. kind {
@@ -81,14 +128,20 @@ impl<'a> Parser<'a> {
81
128
token:: BinOp ( token:: Shl ) => true , // path (double UFCS)
82
129
// leading vert `|` or-pattern
83
130
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
+ }
85
135
_ => false ,
86
136
} ,
87
137
NonterminalKind :: Lifetime => match & token. kind {
88
138
token:: Lifetime ( _) => true ,
89
139
token:: Interpolated ( nt) => {
90
140
matches ! ( & nt. 0 , NtLifetime ( _) )
91
141
}
142
+ token:: OpenDelim ( Delimiter :: Invisible ( InvisibleOrigin :: MetaVar (
143
+ NonterminalKind :: Lifetime ,
144
+ ) ) ) => true ,
92
145
_ => false ,
93
146
} ,
94
147
NonterminalKind :: TT | NonterminalKind :: Item | NonterminalKind :: Stmt => {
0 commit comments