Skip to content

Commit b90ed92

Browse files
committed
Support exclusive_range_pattern
Fix #9779
1 parent e3a67cc commit b90ed92

File tree

3 files changed

+42
-21
lines changed

3 files changed

+42
-21
lines changed

crates/parser/src/grammar/patterns.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,14 +65,18 @@ fn pattern_single_r(p: &mut Parser, recovery_set: TokenSet) {
6565
// match 92 {
6666
// 0 ... 100 => (),
6767
// 101 ..= 200 => (),
68-
// 200 .. 301=> (),
68+
// 200 .. 301 => (),
69+
// 302 .. => (),
6970
// }
7071
// }
7172
for &range_op in [T![...], T![..=], T![..]].iter() {
7273
if p.at(range_op) {
7374
let m = lhs.precede(p);
7475
p.bump(range_op);
75-
atom_pat(p, recovery_set);
76+
if !p.at(T![=>]) {
77+
// not a range pat like `302 .. => ()`
78+
atom_pat(p, recovery_set);
79+
}
7680
m.complete(p, RANGE_PAT);
7781
return;
7882
}
@@ -84,7 +88,7 @@ const PAT_RECOVERY_SET: TokenSet =
8488
TokenSet::new(&[T![let], T![if], T![while], T![loop], T![match], T![')'], T![,], T![=]]);
8589

8690
fn atom_pat(p: &mut Parser, recovery_set: TokenSet) -> Option<CompletedMarker> {
87-
let m = match p.nth(0) {
91+
let m = match p.current() {
8892
T![box] => box_pat(p),
8993
T![ref] | T![mut] => ident_pat(p, true),
9094
T![const] => const_block_pat(p),

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

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
SOURCE_FILE@0..112
2-
FN@0..111
1+
SOURCE_FILE@0..135
2+
FN@0..134
33
FN_KW@0..2 "fn"
44
WHITESPACE@2..3 " "
55
NAME@3..7
@@ -8,16 +8,16 @@ SOURCE_FILE@0..112
88
L_PAREN@7..8 "("
99
R_PAREN@8..9 ")"
1010
WHITESPACE@9..10 " "
11-
BLOCK_EXPR@10..111
11+
BLOCK_EXPR@10..134
1212
L_CURLY@10..11 "{"
1313
WHITESPACE@11..16 "\n "
14-
MATCH_EXPR@16..109
14+
MATCH_EXPR@16..132
1515
MATCH_KW@16..21 "match"
1616
WHITESPACE@21..22 " "
1717
LITERAL@22..24
1818
INT_NUMBER@22..24 "92"
1919
WHITESPACE@24..25 " "
20-
MATCH_ARM_LIST@25..109
20+
MATCH_ARM_LIST@25..132
2121
L_CURLY@25..26 "{"
2222
WHITESPACE@26..35 "\n "
2323
MATCH_ARM@35..51
@@ -58,7 +58,7 @@ SOURCE_FILE@0..112
5858
R_PAREN@76..77 ")"
5959
COMMA@77..78 ","
6060
WHITESPACE@78..87 "\n "
61-
MATCH_ARM@87..103
61+
MATCH_ARM@87..104
6262
RANGE_PAT@87..97
6363
LITERAL_PAT@87..90
6464
LITERAL@87..90
@@ -69,14 +69,30 @@ SOURCE_FILE@0..112
6969
LITERAL_PAT@94..97
7070
LITERAL@94..97
7171
INT_NUMBER@94..97 "301"
72-
FAT_ARROW@97..99 "=>"
73-
WHITESPACE@99..100 " "
74-
TUPLE_EXPR@100..102
75-
L_PAREN@100..101 "("
76-
R_PAREN@101..102 ")"
77-
COMMA@102..103 ","
78-
WHITESPACE@103..108 "\n "
79-
R_CURLY@108..109 "}"
80-
WHITESPACE@109..110 "\n"
81-
R_CURLY@110..111 "}"
82-
WHITESPACE@111..112 "\n"
72+
WHITESPACE@97..98 " "
73+
FAT_ARROW@98..100 "=>"
74+
WHITESPACE@100..101 " "
75+
TUPLE_EXPR@101..103
76+
L_PAREN@101..102 "("
77+
R_PAREN@102..103 ")"
78+
COMMA@103..104 ","
79+
WHITESPACE@104..113 "\n "
80+
MATCH_ARM@113..126
81+
RANGE_PAT@113..119
82+
LITERAL_PAT@113..116
83+
LITERAL@113..116
84+
INT_NUMBER@113..116 "302"
85+
WHITESPACE@116..117 " "
86+
DOT2@117..119 ".."
87+
WHITESPACE@119..120 " "
88+
FAT_ARROW@120..122 "=>"
89+
WHITESPACE@122..123 " "
90+
TUPLE_EXPR@123..125
91+
L_PAREN@123..124 "("
92+
R_PAREN@124..125 ")"
93+
COMMA@125..126 ","
94+
WHITESPACE@126..131 "\n "
95+
R_CURLY@131..132 "}"
96+
WHITESPACE@132..133 "\n"
97+
R_CURLY@133..134 "}"
98+
WHITESPACE@134..135 "\n"

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ fn main() {
22
match 92 {
33
0 ... 100 => (),
44
101 ..= 200 => (),
5-
200 .. 301=> (),
5+
200 .. 301 => (),
6+
302 .. => (),
67
}
78
}

0 commit comments

Comments
 (0)