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