Skip to content

Commit 5366009

Browse files
committed
Auto merge of #12987 - Veykril:ellipsis-recov, r=Veykril
Recover from missing ellipsis in record literals for path expressions
2 parents d186986 + 49d24f6 commit 5366009

File tree

5 files changed

+116
-7
lines changed

5 files changed

+116
-7
lines changed

crates/parser/src/grammar/expressions.rs

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -564,8 +564,10 @@ fn path_expr(p: &mut Parser<'_>, r: Restrictions) -> (CompletedMarker, BlockLike
564564
// test record_lit
565565
// fn foo() {
566566
// S {};
567+
// S { x };
567568
// S { x, y: 32, };
568569
// S { x, y: 32, ..Default::default() };
570+
// S { x: ::default() };
569571
// TupleStruct { 0: 1 };
570572
// }
571573
pub(crate) fn record_expr_field_list(p: &mut Parser<'_>) {
@@ -582,16 +584,26 @@ pub(crate) fn record_expr_field_list(p: &mut Parser<'_>) {
582584

583585
match p.current() {
584586
IDENT | INT_NUMBER => {
585-
// test_err record_literal_before_ellipsis_recovery
587+
// test_err record_literal_missing_ellipsis_recovery
586588
// fn main() {
587-
// S { field ..S::default() }
589+
// S { S::default() }
588590
// }
589-
if p.nth_at(1, T![:]) || p.nth_at(1, T![..]) {
590-
name_ref_or_index(p);
591-
p.expect(T![:]);
591+
if p.nth_at(1, T![::]) {
592+
m.abandon(p);
593+
p.expect(T![..]);
594+
expr(p);
595+
} else {
596+
// test_err record_literal_before_ellipsis_recovery
597+
// fn main() {
598+
// S { field ..S::default() }
599+
// }
600+
if p.nth_at(1, T![:]) || p.nth_at(1, T![..]) {
601+
name_ref_or_index(p);
602+
p.expect(T![:]);
603+
}
604+
expr(p);
605+
m.complete(p, RECORD_EXPR_FIELD);
592606
}
593-
expr(p);
594-
m.complete(p, RECORD_EXPR_FIELD);
595607
}
596608
T![.] if p.at(T![..]) => {
597609
m.abandon(p);
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
SOURCE_FILE
2+
FN
3+
FN_KW "fn"
4+
WHITESPACE " "
5+
NAME
6+
IDENT "main"
7+
PARAM_LIST
8+
L_PAREN "("
9+
R_PAREN ")"
10+
WHITESPACE " "
11+
BLOCK_EXPR
12+
STMT_LIST
13+
L_CURLY "{"
14+
WHITESPACE "\n "
15+
RECORD_EXPR
16+
PATH
17+
PATH_SEGMENT
18+
NAME_REF
19+
IDENT "S"
20+
WHITESPACE " "
21+
RECORD_EXPR_FIELD_LIST
22+
L_CURLY "{"
23+
WHITESPACE " "
24+
CALL_EXPR
25+
PATH_EXPR
26+
PATH
27+
PATH
28+
PATH_SEGMENT
29+
NAME_REF
30+
IDENT "S"
31+
COLON2 "::"
32+
PATH_SEGMENT
33+
NAME_REF
34+
IDENT "default"
35+
ARG_LIST
36+
L_PAREN "("
37+
R_PAREN ")"
38+
WHITESPACE " "
39+
R_CURLY "}"
40+
WHITESPACE "\n"
41+
R_CURLY "}"
42+
WHITESPACE "\n"
43+
error 19: expected DOT2
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
fn main() {
2+
S { S::default() }
3+
}

crates/parser/test_data/parser/inline/ok/0061_record_lit.rast

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,26 @@ SOURCE_FILE
2424
R_CURLY "}"
2525
SEMICOLON ";"
2626
WHITESPACE "\n "
27+
EXPR_STMT
28+
RECORD_EXPR
29+
PATH
30+
PATH_SEGMENT
31+
NAME_REF
32+
IDENT "S"
33+
WHITESPACE " "
34+
RECORD_EXPR_FIELD_LIST
35+
L_CURLY "{"
36+
WHITESPACE " "
37+
RECORD_EXPR_FIELD
38+
PATH_EXPR
39+
PATH
40+
PATH_SEGMENT
41+
NAME_REF
42+
IDENT "x"
43+
WHITESPACE " "
44+
R_CURLY "}"
45+
SEMICOLON ";"
46+
WHITESPACE "\n "
2747
EXPR_STMT
2848
RECORD_EXPR
2949
PATH
@@ -100,6 +120,35 @@ SOURCE_FILE
100120
R_CURLY "}"
101121
SEMICOLON ";"
102122
WHITESPACE "\n "
123+
EXPR_STMT
124+
RECORD_EXPR
125+
PATH
126+
PATH_SEGMENT
127+
NAME_REF
128+
IDENT "S"
129+
WHITESPACE " "
130+
RECORD_EXPR_FIELD_LIST
131+
L_CURLY "{"
132+
WHITESPACE " "
133+
RECORD_EXPR_FIELD
134+
NAME_REF
135+
IDENT "x"
136+
COLON ":"
137+
WHITESPACE " "
138+
CALL_EXPR
139+
PATH_EXPR
140+
PATH
141+
PATH_SEGMENT
142+
COLON2 "::"
143+
NAME_REF
144+
IDENT "default"
145+
ARG_LIST
146+
L_PAREN "("
147+
R_PAREN ")"
148+
WHITESPACE " "
149+
R_CURLY "}"
150+
SEMICOLON ";"
151+
WHITESPACE "\n "
103152
EXPR_STMT
104153
RECORD_EXPR
105154
PATH
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
fn foo() {
22
S {};
3+
S { x };
34
S { x, y: 32, };
45
S { x, y: 32, ..Default::default() };
6+
S { x: ::default() };
57
TupleStruct { 0: 1 };
68
}

0 commit comments

Comments
 (0)