Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit a81c7a2

Browse files
committed
Parse range patterns in struct and slice without trailing comma
1 parent 1c03f45 commit a81c7a2

File tree

3 files changed

+150
-3
lines changed

3 files changed

+150
-3
lines changed

crates/parser/src/grammar/patterns.rs

Lines changed: 24 additions & 3 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,9 +98,20 @@ 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+
// (1.., _)
107+
// ^
108+
// `Some(0 .. )`
109+
// ^
110+
// `S { t: 0.. }`
111+
// ^
112+
// `[0..]`
113+
// ^
114+
if p.at(T![=]) | p.at(T![')']) | p.at(T![,]) | p.at(T!['}']) | p.at(T![']']) {
94115
// test half_open_range_pat
95116
// fn f() { let 0 .. = 1u32; }
96117
} else {

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.., _) => ()

0 commit comments

Comments
 (0)