@@ -36,9 +36,14 @@ pub(super) fn pattern_r(p: &mut Parser, recovery_set: TokenSet) {
3636 // }
3737 if p. at ( T ! [ ...] ) || p. at ( T ! [ ..=] ) || p. at ( T ! [ ..] ) {
3838 let m = lhs. precede ( p) ;
39+ let dots = p. current ( ) ;
3940 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+ }
4247 }
4348 // test marco_pat
4449 // fn main() {
@@ -145,7 +150,21 @@ fn path_pat(p: &mut Parser) -> CompletedMarker {
145150fn tuple_pat_fields ( p : & mut Parser ) {
146151 assert ! ( p. at( T ![ '(' ] ) ) ;
147152 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+ }
149168 p. expect ( T ! [ ')' ] ) ;
150169}
151170
@@ -229,28 +248,30 @@ fn tuple_pat(p: &mut Parser) -> CompletedMarker {
229248fn slice_pat ( p : & mut Parser ) -> CompletedMarker {
230249 assert ! ( p. at( T ![ '[' ] ) ) ;
231250 let m = p. start ( ) ;
251+ // test subslice_pat
252+ // fn main() {
253+ // let [a, b..] = [];
254+ // let &[ref a.., ref b] = [];
255+ // }
232256 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 ! [ ']' ] ) {
240258 match p. current ( ) {
241259 T ! [ ..] => p. bump ( ) ,
242260 _ => {
243261 if !p. at_ts ( PATTERN_FIRST ) {
244262 p. error ( "expected a pattern" ) ;
245263 break ;
246264 }
247- pattern ( p)
265+ pattern ( p) ;
266+ p. eat ( T ! [ ..] ) ;
248267 }
249268 }
250- if !p. at ( ket ) {
269+ if !p. at ( T ! [ ']' ] ) {
251270 p. expect ( T ! [ , ] ) ;
252271 }
253272 }
273+ p. expect ( T ! [ ']' ] ) ;
274+ m. complete ( p, SLICE_PAT )
254275}
255276
256277// test bind_pat
0 commit comments