Skip to content

Commit 1142568

Browse files
committed
Parse subslice patterns within slice patterns
cc #1479
1 parent fee552d commit 1142568

File tree

5 files changed

+59
-16
lines changed

5 files changed

+59
-16
lines changed

crates/ra_parser/src/grammar/patterns.rs

+26-9
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,21 @@ fn path_pat(p: &mut Parser) -> CompletedMarker {
145145
fn tuple_pat_fields(p: &mut Parser) {
146146
assert!(p.at(T!['(']));
147147
p.bump();
148-
pat_list(p, T![')']);
148+
while !p.at(EOF) && !p.at(T![')']) {
149+
match p.current() {
150+
T![..] => p.bump(),
151+
_ => {
152+
if !p.at_ts(PATTERN_FIRST) {
153+
p.error("expected a pattern");
154+
break;
155+
}
156+
pattern(p)
157+
}
158+
}
159+
if !p.at(T![')']) {
160+
p.expect(T![,]);
161+
}
162+
}
149163
p.expect(T![')']);
150164
}
151165

@@ -225,20 +239,21 @@ fn tuple_pat(p: &mut Parser) -> CompletedMarker {
225239
// test slice_pat
226240
// fn main() {
227241
// let [a, b, ..] = [];
242+
// let [a, b..] = [];
228243
// }
229244
fn slice_pat(p: &mut Parser) -> CompletedMarker {
230245
assert!(p.at(T!['[']));
231246
let m = p.start();
232247
p.bump();
233-
pat_list(p, T![']']);
234-
p.expect(T![']']);
235-
m.complete(p, SLICE_PAT)
236-
}
237-
238-
fn pat_list(p: &mut Parser, ket: SyntaxKind) {
239-
while !p.at(EOF) && !p.at(ket) {
248+
while !p.at(EOF) && !p.at(T![']']) {
240249
match p.current() {
241250
T![..] => p.bump(),
251+
IDENT if p.nth(1) == T![..] => {
252+
let m_sub = p.start();
253+
p.bump();
254+
p.bump();
255+
m_sub.complete(p, SUBSLICE_PAT);
256+
}
242257
_ => {
243258
if !p.at_ts(PATTERN_FIRST) {
244259
p.error("expected a pattern");
@@ -247,10 +262,12 @@ fn pat_list(p: &mut Parser, ket: SyntaxKind) {
247262
pattern(p)
248263
}
249264
}
250-
if !p.at(ket) {
265+
if !p.at(T![']']) {
251266
p.expect(T![,]);
252267
}
253268
}
269+
p.expect(T![']']);
270+
m.complete(p, SLICE_PAT)
254271
}
255272

256273
// test bind_pat

crates/ra_parser/src/syntax_kind/generated.rs

+2
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ pub enum SyntaxKind {
165165
SLICE_PAT,
166166
RANGE_PAT,
167167
LITERAL_PAT,
168+
SUBSLICE_PAT,
168169
TUPLE_EXPR,
169170
ARRAY_EXPR,
170171
PAREN_EXPR,
@@ -632,6 +633,7 @@ impl SyntaxKind {
632633
SLICE_PAT => &SyntaxInfo { name: "SLICE_PAT" },
633634
RANGE_PAT => &SyntaxInfo { name: "RANGE_PAT" },
634635
LITERAL_PAT => &SyntaxInfo { name: "LITERAL_PAT" },
636+
SUBSLICE_PAT => &SyntaxInfo { name: "SUBSLICE_PAT" },
635637
TUPLE_EXPR => &SyntaxInfo { name: "TUPLE_EXPR" },
636638
ARRAY_EXPR => &SyntaxInfo { name: "ARRAY_EXPR" },
637639
PAREN_EXPR => &SyntaxInfo { name: "PAREN_EXPR" },

crates/ra_syntax/src/grammar.ron

+2-1
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ Grammar(
168168
"SLICE_PAT",
169169
"RANGE_PAT",
170170
"LITERAL_PAT",
171+
"SUBSLICE_PAT",
171172

172173
// atoms
173174
"TUPLE_EXPR",
@@ -686,7 +687,7 @@ Grammar(
686687
"LifetimeArg": (),
687688

688689
"MacroItems": (
689-
traits: [ "ModuleItemOwner", "FnDefOwner" ],
690+
traits: [ "ModuleItemOwner", "FnDefOwner" ],
690691
),
691692

692693
"MacroStmts" : (
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
fn main() {
22
let [a, b, ..] = [];
3+
let [a, b..] = [];
34
}

crates/ra_syntax/tests/data/parser/inline/ok/0024_slice_pat.txt

+28-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
SOURCE_FILE@[0; 39)
2-
FN_DEF@[0; 38)
1+
SOURCE_FILE@[0; 62)
2+
FN_DEF@[0; 61)
33
FN_KW@[0; 2) "fn"
44
WHITESPACE@[2; 3) " "
55
NAME@[3; 7)
@@ -8,7 +8,7 @@ SOURCE_FILE@[0; 39)
88
L_PAREN@[7; 8) "("
99
R_PAREN@[8; 9) ")"
1010
WHITESPACE@[9; 10) " "
11-
BLOCK@[10; 38)
11+
BLOCK@[10; 61)
1212
L_CURLY@[10; 11) "{"
1313
WHITESPACE@[11; 16) "\n "
1414
LET_STMT@[16; 36)
@@ -35,6 +35,28 @@ SOURCE_FILE@[0; 39)
3535
L_BRACK@[33; 34) "["
3636
R_BRACK@[34; 35) "]"
3737
SEMI@[35; 36) ";"
38-
WHITESPACE@[36; 37) "\n"
39-
R_CURLY@[37; 38) "}"
40-
WHITESPACE@[38; 39) "\n"
38+
WHITESPACE@[36; 41) "\n "
39+
LET_STMT@[41; 59)
40+
LET_KW@[41; 44) "let"
41+
WHITESPACE@[44; 45) " "
42+
SLICE_PAT@[45; 53)
43+
L_BRACK@[45; 46) "["
44+
BIND_PAT@[46; 47)
45+
NAME@[46; 47)
46+
IDENT@[46; 47) "a"
47+
COMMA@[47; 48) ","
48+
WHITESPACE@[48; 49) " "
49+
SUBSLICE_PAT@[49; 52)
50+
IDENT@[49; 50) "b"
51+
DOTDOT@[50; 52) ".."
52+
R_BRACK@[52; 53) "]"
53+
WHITESPACE@[53; 54) " "
54+
EQ@[54; 55) "="
55+
WHITESPACE@[55; 56) " "
56+
ARRAY_EXPR@[56; 58)
57+
L_BRACK@[56; 57) "["
58+
R_BRACK@[57; 58) "]"
59+
SEMI@[58; 59) ";"
60+
WHITESPACE@[59; 60) "\n"
61+
R_CURLY@[60; 61) "}"
62+
WHITESPACE@[61; 62) "\n"

0 commit comments

Comments
 (0)