Skip to content

Commit 79c22d5

Browse files
committed
Auto merge of rust-lang#12962 - lowr:patch/parse-last-range-pattern, r=Veykril
Parse range patterns in struct and slice without trailing comma Resolves rust-lang#12935 This patch includes the support for range patterns in slices, which is unstable (tracked in rust-lang#67264). If it's not desired I can remove it.
2 parents 49700e4 + b14062a commit 79c22d5

File tree

5 files changed

+181
-7
lines changed

5 files changed

+181
-7
lines changed

crates/parser/src/grammar/patterns.rs

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,16 @@ fn pattern_single_r(p: &mut Parser<'_>, recovery_set: TokenSet) {
7575
// Some(1..) => ()
7676
// }
7777
//
78+
// match () {
79+
// S { a: 0 } => (),
80+
// S { a: 1.. } => (),
81+
// }
82+
//
83+
// match () {
84+
// [0] => (),
85+
// [1..] => (),
86+
// }
87+
//
7888
// match (10 as u8, 5 as u8) {
7989
// (0, _) => (),
8090
// (1.., _) => ()
@@ -88,11 +98,27 @@ fn pattern_single_r(p: &mut Parser<'_>, recovery_set: TokenSet) {
8898
let m = lhs.precede(p);
8999
p.bump(range_op);
90100

91-
// `0 .. =>` or `let 0 .. =` or `Some(0 .. )`
92-
// ^ ^ ^
93-
if p.at(T![=]) | p.at(T![')']) | p.at(T![,]) {
101+
// testing if we're at one of the following positions:
102+
// `0 .. =>`
103+
// ^
104+
// `let 0 .. =`
105+
// ^
106+
// `let 0..: _ =`
107+
// ^
108+
// (1.., _)
109+
// ^
110+
// `Some(0 .. )`
111+
// ^
112+
// `S { t: 0.. }`
113+
// ^
114+
// `[0..]`
115+
// ^
116+
if matches!(p.current(), T![=] | T![,] | T![:] | T![')'] | T!['}'] | T![']']) {
94117
// test half_open_range_pat
95-
// fn f() { let 0 .. = 1u32; }
118+
// fn f() {
119+
// let 0 .. = 1u32;
120+
// let 0..: _ = 1u32;
121+
// }
96122
} else {
97123
atom_pat(p, recovery_set);
98124
}

crates/parser/test_data/parser/inline/ok/0058_range_pat.rast

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,122 @@ SOURCE_FILE
172172
WHITESPACE "\n "
173173
R_CURLY "}"
174174
WHITESPACE "\n\n "
175+
EXPR_STMT
176+
MATCH_EXPR
177+
MATCH_KW "match"
178+
WHITESPACE " "
179+
TUPLE_EXPR
180+
L_PAREN "("
181+
R_PAREN ")"
182+
WHITESPACE " "
183+
MATCH_ARM_LIST
184+
L_CURLY "{"
185+
WHITESPACE "\n "
186+
MATCH_ARM
187+
RECORD_PAT
188+
PATH
189+
PATH_SEGMENT
190+
NAME_REF
191+
IDENT "S"
192+
WHITESPACE " "
193+
RECORD_PAT_FIELD_LIST
194+
L_CURLY "{"
195+
WHITESPACE " "
196+
RECORD_PAT_FIELD
197+
NAME_REF
198+
IDENT "a"
199+
COLON ":"
200+
WHITESPACE " "
201+
LITERAL_PAT
202+
LITERAL
203+
INT_NUMBER "0"
204+
WHITESPACE " "
205+
R_CURLY "}"
206+
WHITESPACE " "
207+
FAT_ARROW "=>"
208+
WHITESPACE " "
209+
TUPLE_EXPR
210+
L_PAREN "("
211+
R_PAREN ")"
212+
COMMA ","
213+
WHITESPACE "\n "
214+
MATCH_ARM
215+
RECORD_PAT
216+
PATH
217+
PATH_SEGMENT
218+
NAME_REF
219+
IDENT "S"
220+
WHITESPACE " "
221+
RECORD_PAT_FIELD_LIST
222+
L_CURLY "{"
223+
WHITESPACE " "
224+
RECORD_PAT_FIELD
225+
NAME_REF
226+
IDENT "a"
227+
COLON ":"
228+
WHITESPACE " "
229+
RANGE_PAT
230+
LITERAL_PAT
231+
LITERAL
232+
INT_NUMBER "1"
233+
DOT2 ".."
234+
WHITESPACE " "
235+
R_CURLY "}"
236+
WHITESPACE " "
237+
FAT_ARROW "=>"
238+
WHITESPACE " "
239+
TUPLE_EXPR
240+
L_PAREN "("
241+
R_PAREN ")"
242+
COMMA ","
243+
WHITESPACE "\n "
244+
R_CURLY "}"
245+
WHITESPACE "\n\n "
246+
EXPR_STMT
247+
MATCH_EXPR
248+
MATCH_KW "match"
249+
WHITESPACE " "
250+
TUPLE_EXPR
251+
L_PAREN "("
252+
R_PAREN ")"
253+
WHITESPACE " "
254+
MATCH_ARM_LIST
255+
L_CURLY "{"
256+
WHITESPACE "\n "
257+
MATCH_ARM
258+
SLICE_PAT
259+
L_BRACK "["
260+
LITERAL_PAT
261+
LITERAL
262+
INT_NUMBER "0"
263+
R_BRACK "]"
264+
WHITESPACE " "
265+
FAT_ARROW "=>"
266+
WHITESPACE " "
267+
TUPLE_EXPR
268+
L_PAREN "("
269+
R_PAREN ")"
270+
COMMA ","
271+
WHITESPACE "\n "
272+
MATCH_ARM
273+
SLICE_PAT
274+
L_BRACK "["
275+
RANGE_PAT
276+
LITERAL_PAT
277+
LITERAL
278+
INT_NUMBER "1"
279+
DOT2 ".."
280+
R_BRACK "]"
281+
WHITESPACE " "
282+
FAT_ARROW "=>"
283+
WHITESPACE " "
284+
TUPLE_EXPR
285+
L_PAREN "("
286+
R_PAREN ")"
287+
COMMA ","
288+
WHITESPACE "\n "
289+
R_CURLY "}"
290+
WHITESPACE "\n\n "
175291
MATCH_EXPR
176292
MATCH_KW "match"
177293
WHITESPACE " "

crates/parser/test_data/parser/inline/ok/0058_range_pat.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,16 @@ fn main() {
1111
Some(1..) => ()
1212
}
1313

14+
match () {
15+
S { a: 0 } => (),
16+
S { a: 1.. } => (),
17+
}
18+
19+
match () {
20+
[0] => (),
21+
[1..] => (),
22+
}
23+
1424
match (10 as u8, 5 as u8) {
1525
(0, _) => (),
1626
(1.., _) => ()

crates/parser/test_data/parser/inline/ok/0166_half_open_range_pat.rast

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ SOURCE_FILE
1111
BLOCK_EXPR
1212
STMT_LIST
1313
L_CURLY "{"
14-
WHITESPACE " "
14+
WHITESPACE "\n "
1515
LET_STMT
1616
LET_KW "let"
1717
WHITESPACE " "
@@ -27,6 +27,25 @@ SOURCE_FILE
2727
LITERAL
2828
INT_NUMBER "1u32"
2929
SEMICOLON ";"
30-
WHITESPACE " "
30+
WHITESPACE "\n "
31+
LET_STMT
32+
LET_KW "let"
33+
WHITESPACE " "
34+
RANGE_PAT
35+
LITERAL_PAT
36+
LITERAL
37+
INT_NUMBER "0"
38+
DOT2 ".."
39+
COLON ":"
40+
WHITESPACE " "
41+
INFER_TYPE
42+
UNDERSCORE "_"
43+
WHITESPACE " "
44+
EQ "="
45+
WHITESPACE " "
46+
LITERAL
47+
INT_NUMBER "1u32"
48+
SEMICOLON ";"
49+
WHITESPACE "\n"
3150
R_CURLY "}"
3251
WHITESPACE "\n"
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,4 @@
1-
fn f() { let 0 .. = 1u32; }
1+
fn f() {
2+
let 0 .. = 1u32;
3+
let 0..: _ = 1u32;
4+
}

0 commit comments

Comments
 (0)