Skip to content

Commit fb4e935

Browse files
committed
Auto merge of rust-lang#13769 - jonas-schievink:parse-half-open-range-pat, r=jonas-schievink
feat: Parse half-open `..= X` patterns Closes rust-lang/rust-analyzer#13739
2 parents 5bd9373 + 9e0aaf4 commit fb4e935

File tree

4 files changed

+157
-35
lines changed

4 files changed

+157
-35
lines changed

crates/parser/src/grammar/patterns.rs

+43-32
Original file line numberDiff line numberDiff line change
@@ -62,39 +62,50 @@ fn pattern_r(p: &mut Parser<'_>, recovery_set: TokenSet) {
6262
}
6363

6464
fn pattern_single_r(p: &mut Parser<'_>, recovery_set: TokenSet) {
65-
if let Some(lhs) = atom_pat(p, recovery_set) {
66-
// test range_pat
67-
// fn main() {
68-
// match 92 {
69-
// 0 ... 100 => (),
70-
// 101 ..= 200 => (),
71-
// 200 .. 301 => (),
72-
// 302 .. => (),
73-
// }
74-
//
75-
// match Some(10 as u8) {
76-
// Some(0) | None => (),
77-
// Some(1..) => ()
78-
// }
79-
//
80-
// match () {
81-
// S { a: 0 } => (),
82-
// S { a: 1.. } => (),
83-
// }
84-
//
85-
// match () {
86-
// [0] => (),
87-
// [1..] => (),
88-
// }
89-
//
90-
// match (10 as u8, 5 as u8) {
91-
// (0, _) => (),
92-
// (1.., _) => ()
93-
// }
94-
// }
65+
// test range_pat
66+
// fn main() {
67+
// match 92 {
68+
// 0 ... 100 => (),
69+
// 101 ..= 200 => (),
70+
// 200 .. 301 => (),
71+
// 302 .. => (),
72+
// ..= 303 => (),
73+
// }
74+
//
75+
// match Some(10 as u8) {
76+
// Some(0) | None => (),
77+
// Some(1..) => (),
78+
// Some(..=2) => (),
79+
// }
80+
//
81+
// match () {
82+
// S { a: 0 } => (),
83+
// S { a: 1.. } => (),
84+
// S { a: ..=2 } => (),
85+
// }
86+
//
87+
// match () {
88+
// [0] => (),
89+
// [1..] => (),
90+
// [..=2] => (),
91+
// }
92+
//
93+
// match (10 as u8, 5 as u8) {
94+
// (0, _) => (),
95+
// (1.., _) => (),
96+
// (..=2, _) => (),
97+
// }
98+
// }
99+
100+
if p.at(T![..=]) {
101+
let m = p.start();
102+
p.bump(T![..=]);
103+
atom_pat(p, recovery_set);
104+
m.complete(p, RANGE_PAT);
105+
return;
106+
}
95107

96-
// FIXME: support half_open_range_patterns (`..=2`),
97-
// exclusive_range_pattern (`..5`) with missing lhs
108+
if let Some(lhs) = atom_pat(p, recovery_set) {
98109
for range_op in [T![...], T![..=], T![..]] {
99110
if p.at(range_op) {
100111
let m = lhs.precede(p);

crates/parser/src/parser.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ impl<'t> Parser<'t> {
162162
Marker::new(pos)
163163
}
164164

165-
/// Consume the next token if `kind` matches.
165+
/// Consume the next token. Panics if the parser isn't currently at `kind`.
166166
pub(crate) fn bump(&mut self, kind: SyntaxKind) {
167167
assert!(self.eat(kind));
168168
}

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

+106
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,21 @@ SOURCE_FILE
9393
L_PAREN "("
9494
R_PAREN ")"
9595
COMMA ","
96+
WHITESPACE "\n "
97+
MATCH_ARM
98+
RANGE_PAT
99+
DOT2EQ "..="
100+
WHITESPACE " "
101+
LITERAL_PAT
102+
LITERAL
103+
INT_NUMBER "303"
104+
WHITESPACE " "
105+
FAT_ARROW "=>"
106+
WHITESPACE " "
107+
TUPLE_EXPR
108+
L_PAREN "("
109+
R_PAREN ")"
110+
COMMA ","
96111
WHITESPACE "\n "
97112
R_CURLY "}"
98113
WHITESPACE "\n\n "
@@ -169,6 +184,28 @@ SOURCE_FILE
169184
TUPLE_EXPR
170185
L_PAREN "("
171186
R_PAREN ")"
187+
COMMA ","
188+
WHITESPACE "\n "
189+
MATCH_ARM
190+
TUPLE_STRUCT_PAT
191+
PATH
192+
PATH_SEGMENT
193+
NAME_REF
194+
IDENT "Some"
195+
L_PAREN "("
196+
RANGE_PAT
197+
DOT2EQ "..="
198+
LITERAL_PAT
199+
LITERAL
200+
INT_NUMBER "2"
201+
R_PAREN ")"
202+
WHITESPACE " "
203+
FAT_ARROW "=>"
204+
WHITESPACE " "
205+
TUPLE_EXPR
206+
L_PAREN "("
207+
R_PAREN ")"
208+
COMMA ","
172209
WHITESPACE "\n "
173210
R_CURLY "}"
174211
WHITESPACE "\n\n "
@@ -240,6 +277,36 @@ SOURCE_FILE
240277
L_PAREN "("
241278
R_PAREN ")"
242279
COMMA ","
280+
WHITESPACE "\n "
281+
MATCH_ARM
282+
RECORD_PAT
283+
PATH
284+
PATH_SEGMENT
285+
NAME_REF
286+
IDENT "S"
287+
WHITESPACE " "
288+
RECORD_PAT_FIELD_LIST
289+
L_CURLY "{"
290+
WHITESPACE " "
291+
RECORD_PAT_FIELD
292+
NAME_REF
293+
IDENT "a"
294+
COLON ":"
295+
WHITESPACE " "
296+
RANGE_PAT
297+
DOT2EQ "..="
298+
LITERAL_PAT
299+
LITERAL
300+
INT_NUMBER "2"
301+
WHITESPACE " "
302+
R_CURLY "}"
303+
WHITESPACE " "
304+
FAT_ARROW "=>"
305+
WHITESPACE " "
306+
TUPLE_EXPR
307+
L_PAREN "("
308+
R_PAREN ")"
309+
COMMA ","
243310
WHITESPACE "\n "
244311
R_CURLY "}"
245312
WHITESPACE "\n\n "
@@ -285,6 +352,23 @@ SOURCE_FILE
285352
L_PAREN "("
286353
R_PAREN ")"
287354
COMMA ","
355+
WHITESPACE "\n "
356+
MATCH_ARM
357+
SLICE_PAT
358+
L_BRACK "["
359+
RANGE_PAT
360+
DOT2EQ "..="
361+
LITERAL_PAT
362+
LITERAL
363+
INT_NUMBER "2"
364+
R_BRACK "]"
365+
WHITESPACE " "
366+
FAT_ARROW "=>"
367+
WHITESPACE " "
368+
TUPLE_EXPR
369+
L_PAREN "("
370+
R_PAREN ")"
371+
COMMA ","
288372
WHITESPACE "\n "
289373
R_CURLY "}"
290374
WHITESPACE "\n\n "
@@ -360,6 +444,28 @@ SOURCE_FILE
360444
TUPLE_EXPR
361445
L_PAREN "("
362446
R_PAREN ")"
447+
COMMA ","
448+
WHITESPACE "\n "
449+
MATCH_ARM
450+
TUPLE_PAT
451+
L_PAREN "("
452+
RANGE_PAT
453+
DOT2EQ "..="
454+
LITERAL_PAT
455+
LITERAL
456+
INT_NUMBER "2"
457+
COMMA ","
458+
WHITESPACE " "
459+
WILDCARD_PAT
460+
UNDERSCORE "_"
461+
R_PAREN ")"
462+
WHITESPACE " "
463+
FAT_ARROW "=>"
464+
WHITESPACE " "
465+
TUPLE_EXPR
466+
L_PAREN "("
467+
R_PAREN ")"
468+
COMMA ","
363469
WHITESPACE "\n "
364470
R_CURLY "}"
365471
WHITESPACE "\n"

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

+7-2
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,30 @@ fn main() {
44
101 ..= 200 => (),
55
200 .. 301 => (),
66
302 .. => (),
7+
..= 303 => (),
78
}
89

910
match Some(10 as u8) {
1011
Some(0) | None => (),
11-
Some(1..) => ()
12+
Some(1..) => (),
13+
Some(..=2) => (),
1214
}
1315

1416
match () {
1517
S { a: 0 } => (),
1618
S { a: 1.. } => (),
19+
S { a: ..=2 } => (),
1720
}
1821

1922
match () {
2023
[0] => (),
2124
[1..] => (),
25+
[..=2] => (),
2226
}
2327

2428
match (10 as u8, 5 as u8) {
2529
(0, _) => (),
26-
(1.., _) => ()
30+
(1.., _) => (),
31+
(..=2, _) => (),
2732
}
2833
}

0 commit comments

Comments
 (0)