Skip to content

Commit 0b873da

Browse files
committed
don't parse subslice pats outside of slice pats
1 parent f109128 commit 0b873da

File tree

1 file changed

+12
-8
lines changed

1 file changed

+12
-8
lines changed

crates/ra_parser/src/grammar/patterns.rs

+12-8
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,12 @@ pub(super) const PATTERN_FIRST: TokenSet = expressions::LITERAL_FIRST
55
.union(token_set![REF_KW, MUT_KW, L_PAREN, L_BRACK, AMP, UNDERSCORE, MINUS]);
66

77
pub(super) fn pattern(p: &mut Parser) {
8-
pattern_r(p, PAT_RECOVERY_SET);
8+
pattern_r(p, PAT_RECOVERY_SET, false);
9+
}
10+
11+
fn pattern_with_subslice_patterns(p: &mut Parser) {
12+
// Subslice patterns are only allowed within a slice pattern
13+
pattern_r(p, PAT_RECOVERY_SET, true);
914
}
1015

1116
/// Parses a pattern list separated by pipes `|`
@@ -17,14 +22,14 @@ pub(super) fn pattern_list(p: &mut Parser) {
1722
/// using the given `recovery_set`
1823
pub(super) fn pattern_list_r(p: &mut Parser, recovery_set: TokenSet) {
1924
p.eat(T![|]);
20-
pattern_r(p, recovery_set);
25+
pattern_r(p, recovery_set, false);
2126

2227
while p.eat(T![|]) {
23-
pattern_r(p, recovery_set);
28+
pattern_r(p, recovery_set, false);
2429
}
2530
}
2631

27-
pub(super) fn pattern_r(p: &mut Parser, recovery_set: TokenSet) {
32+
pub(super) fn pattern_r(p: &mut Parser, recovery_set: TokenSet, subslice_patterns: bool) {
2833
if let Some(lhs) = atom_pat(p, recovery_set) {
2934
// test range_pat
3035
// fn main() {
@@ -38,7 +43,7 @@ pub(super) fn pattern_r(p: &mut Parser, recovery_set: TokenSet) {
3843
let m = lhs.precede(p);
3944
let dots = p.current();
4045
p.bump();
41-
if dots == T![..] && !p.at_ts(PATTERN_FIRST) {
46+
if subslice_patterns && dots == T![..] && !p.at_ts(PATTERN_FIRST) {
4247
m.complete(p, SUBSLICE_PAT);
4348
} else {
4449
atom_pat(p, recovery_set);
@@ -158,7 +163,7 @@ fn tuple_pat_fields(p: &mut Parser) {
158163
p.error("expected a pattern");
159164
break;
160165
}
161-
pattern(p)
166+
pattern_with_subslice_patterns(p);
162167
}
163168
}
164169
if !p.at(T![')']) {
@@ -262,8 +267,7 @@ fn slice_pat(p: &mut Parser) -> CompletedMarker {
262267
p.error("expected a pattern");
263268
break;
264269
}
265-
pattern(p);
266-
p.eat(T![..]);
270+
pattern_with_subslice_patterns(p);
267271
}
268272
}
269273
if !p.at(T![']']) {

0 commit comments

Comments
 (0)