@@ -37,8 +37,12 @@ pub(super) fn pattern_r(p: &mut Parser, recovery_set: TokenSet) {
37
37
if p. at ( T ! [ ...] ) || p. at ( T ! [ ..=] ) || p. at ( T ! [ ..] ) {
38
38
let m = lhs. precede ( p) ;
39
39
p. bump ( ) ;
40
- atom_pat ( p, recovery_set) ;
41
- m. complete ( p, RANGE_PAT ) ;
40
+ if let Some ( _) = atom_pat ( p, recovery_set) {
41
+ m. complete ( p, RANGE_PAT ) ;
42
+ } else {
43
+ m. abandon ( p) ;
44
+ p. err_recover ( "expected pattern" , recovery_set) ;
45
+ }
42
46
}
43
47
// test marco_pat
44
48
// fn main() {
@@ -145,7 +149,21 @@ fn path_pat(p: &mut Parser) -> CompletedMarker {
145
149
fn tuple_pat_fields ( p : & mut Parser ) {
146
150
assert ! ( p. at( T ![ '(' ] ) ) ;
147
151
p. bump ( ) ;
148
- pat_list ( p, T ! [ ')' ] ) ;
152
+ while !p. at ( EOF ) && !p. at ( T ! [ ')' ] ) {
153
+ match p. current ( ) {
154
+ T ! [ ..] => p. bump ( ) ,
155
+ _ => {
156
+ if !p. at_ts ( PATTERN_FIRST ) {
157
+ p. error ( "expected a pattern" ) ;
158
+ break ;
159
+ }
160
+ pattern ( p) ;
161
+ }
162
+ }
163
+ if !p. at ( T ! [ ')' ] ) {
164
+ p. expect ( T ! [ , ] ) ;
165
+ }
166
+ }
149
167
p. expect ( T ! [ ')' ] ) ;
150
168
}
151
169
@@ -229,28 +247,45 @@ fn tuple_pat(p: &mut Parser) -> CompletedMarker {
229
247
fn slice_pat ( p : & mut Parser ) -> CompletedMarker {
230
248
assert ! ( p. at( T ![ '[' ] ) ) ;
231
249
let m = p. start ( ) ;
250
+ // test subslice_pat
251
+ // fn main() {
252
+ // let [a, b..] = [];
253
+ // let &[ref a.., ref b] = [];
254
+ // }
232
255
p. bump ( ) ;
233
- pat_list ( p, T ! [ ']' ] ) ;
234
- p. expect ( T ! [ ']' ] ) ;
235
- m. complete ( p, SLICE_PAT )
236
- }
237
256
238
- fn pat_list ( p : & mut Parser , ket : SyntaxKind ) {
239
- while !p. at ( EOF ) && !p. at ( ket) {
240
- match p. current ( ) {
241
- T ! [ ..] => p. bump ( ) ,
242
- _ => {
243
- if !p. at_ts ( PATTERN_FIRST ) {
244
- p. error ( "expected a pattern" ) ;
245
- break ;
246
- }
247
- pattern ( p)
257
+ while !p. at ( EOF ) && !p. at ( T ! [ ']' ] ) {
258
+ let la0 = p. nth ( 0 ) ;
259
+ let la1 = p. nth ( 1 ) ;
260
+ if la0 == T ! [ ref]
261
+ || la0 == T ! [ mut ]
262
+ || la0 == T ! [ box]
263
+ || ( la0 == IDENT
264
+ && !( la1 == T ! [ :: ] || la1 == T ! [ '(' ] || la1 == T ! [ '{' ] || la1 == T ! [ !] ) )
265
+ {
266
+ let m = p. start ( ) ;
267
+ bind_pat ( p, true ) ;
268
+ if p. current ( ) == T ! [ ..] {
269
+ p. bump ( ) ;
270
+ m. complete ( p, SUBSLICE_PAT ) ;
271
+ } else {
272
+ m. abandon ( p) ;
273
+ }
274
+ } else if la0 == T ! [ ..] {
275
+ p. bump ( ) ;
276
+ } else {
277
+ if !p. at_ts ( PATTERN_FIRST ) {
278
+ p. error ( "expected a pattern" ) ;
279
+ break ;
248
280
}
281
+ pattern ( p) ;
249
282
}
250
- if !p. at ( ket ) {
283
+ if !p. at ( T ! [ ']' ] ) {
251
284
p. expect ( T ! [ , ] ) ;
252
285
}
253
286
}
287
+ p. expect ( T ! [ ']' ] ) ;
288
+ m. complete ( p, SLICE_PAT )
254
289
}
255
290
256
291
// test bind_pat
0 commit comments