Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit bf115a6

Browse files
committed
fix: Recover from = in record pattern field
1 parent ccccc29 commit bf115a6

6 files changed

+59
-4
lines changed

crates/parser/src/grammar/expressions.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -694,7 +694,7 @@ pub(crate) fn record_expr_field_list(p: &mut Parser<'_>) {
694694
// S { field ..S::default() }
695695
// }
696696
name_ref_or_index(p);
697-
p.error("expected colon");
697+
p.error("expected `:`");
698698
} else {
699699
// test_err record_literal_field_eq_recovery
700700
// fn main() {
@@ -705,7 +705,7 @@ pub(crate) fn record_expr_field_list(p: &mut Parser<'_>) {
705705
p.bump(T![:]);
706706
} else if p.nth_at(1, T![=]) {
707707
name_ref_or_index(p);
708-
p.err_and_bump("expected colon");
708+
p.err_and_bump("expected `:`");
709709
}
710710
expr(p);
711711
}

crates/parser/src/grammar/patterns.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,15 @@ fn record_pat_field(p: &mut Parser<'_>) {
323323
p.bump(T![:]);
324324
pattern(p);
325325
}
326+
// test_err record_pat_field_eq_recovery
327+
// fn main() {
328+
// let S { field = foo };
329+
// }
330+
IDENT | INT_NUMBER if p.nth(1) == T![=] => {
331+
name_ref_or_index(p);
332+
p.err_and_bump("expected `:`");
333+
pattern(p);
334+
}
326335
T![box] => {
327336
// FIXME: not all box patterns should be allowed
328337
box_pat(p);

crates/parser/test_data/parser/inline/err/0014_record_literal_before_ellipsis_recovery.rast

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,5 +45,5 @@ SOURCE_FILE
4545
WHITESPACE "\n"
4646
R_CURLY "}"
4747
WHITESPACE "\n"
48-
error 25: expected colon
48+
error 25: expected `:`
4949
error 25: expected COMMA

crates/parser/test_data/parser/inline/err/0032_record_literal_field_eq_recovery.rast

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,4 @@ SOURCE_FILE
3838
WHITESPACE "\n"
3939
R_CURLY "}"
4040
WHITESPACE "\n"
41-
error 26: expected colon
41+
error 26: expected `:`
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+
LET_STMT
16+
LET_KW "let"
17+
WHITESPACE " "
18+
RECORD_PAT
19+
PATH
20+
PATH_SEGMENT
21+
NAME_REF
22+
IDENT "S"
23+
WHITESPACE " "
24+
RECORD_PAT_FIELD_LIST
25+
L_CURLY "{"
26+
WHITESPACE " "
27+
RECORD_PAT_FIELD
28+
NAME_REF
29+
IDENT "field"
30+
WHITESPACE " "
31+
ERROR
32+
EQ "="
33+
WHITESPACE " "
34+
IDENT_PAT
35+
NAME
36+
IDENT "foo"
37+
WHITESPACE " "
38+
R_CURLY "}"
39+
SEMICOLON ";"
40+
WHITESPACE "\n"
41+
R_CURLY "}"
42+
WHITESPACE "\n"
43+
error 30: expected `:`
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
fn main() {
2+
let S { field = foo };
3+
}

0 commit comments

Comments
 (0)