Unnamed repository; edit this file 'description' to name the repository.
Merge pull request #22201 from A4-Tacks/tuple-empty-expr
fix: handle empty expr in tuple expr
| -rw-r--r-- | crates/parser/src/grammar/expressions/atom.rs | 21 | ||||
| -rw-r--r-- | crates/parser/test_data/generated/runner.rs | 4 | ||||
| -rw-r--r-- | crates/parser/test_data/parser/inline/err/tuple_expr_empty_expr.rast | 45 | ||||
| -rw-r--r-- | crates/parser/test_data/parser/inline/err/tuple_expr_empty_expr.rs (renamed from crates/parser/test_data/parser/inline/err/tuple_expr_leading_comma.rs) | 1 | ||||
| -rw-r--r-- | crates/parser/test_data/parser/inline/err/tuple_expr_leading_comma.rast | 24 |
5 files changed, 60 insertions, 35 deletions
diff --git a/crates/parser/src/grammar/expressions/atom.rs b/crates/parser/src/grammar/expressions/atom.rs index 3620a27c23..cabdd74b09 100644 --- a/crates/parser/src/grammar/expressions/atom.rs +++ b/crates/parser/src/grammar/expressions/atom.rs @@ -216,16 +216,19 @@ fn tuple_expr(p: &mut Parser<'_>) -> CompletedMarker { let mut saw_comma = false; let mut saw_expr = false; - // test_err tuple_expr_leading_comma - // fn foo() { - // (,); - // } - if p.eat(T![,]) { - p.error("expected expression"); - saw_comma = true; - } - while !p.at(EOF) && !p.at(T![')']) { + // test_err tuple_expr_empty_expr + // fn foo() { + // (,); + // (a, , b); + // } + if p.current() == T![,] { + p.error("expected expression"); + p.bump(T![,]); + saw_comma = true; + continue; + } + saw_expr = true; // test tuple_attrs diff --git a/crates/parser/test_data/generated/runner.rs b/crates/parser/test_data/generated/runner.rs index ecb9ece67a..845119d922 100644 --- a/crates/parser/test_data/generated/runner.rs +++ b/crates/parser/test_data/generated/runner.rs @@ -958,8 +958,8 @@ mod err { #[test] fn top_level_let() { run_and_expect_errors("test_data/parser/inline/err/top_level_let.rs"); } #[test] - fn tuple_expr_leading_comma() { - run_and_expect_errors("test_data/parser/inline/err/tuple_expr_leading_comma.rs"); + fn tuple_expr_empty_expr() { + run_and_expect_errors("test_data/parser/inline/err/tuple_expr_empty_expr.rs"); } #[test] fn tuple_field_list_recovery() { diff --git a/crates/parser/test_data/parser/inline/err/tuple_expr_empty_expr.rast b/crates/parser/test_data/parser/inline/err/tuple_expr_empty_expr.rast new file mode 100644 index 0000000000..2ccd04c321 --- /dev/null +++ b/crates/parser/test_data/parser/inline/err/tuple_expr_empty_expr.rast @@ -0,0 +1,45 @@ +SOURCE_FILE + FN + FN_KW "fn" + WHITESPACE " " + NAME + IDENT "foo" + PARAM_LIST + L_PAREN "(" + R_PAREN ")" + WHITESPACE " " + BLOCK_EXPR + STMT_LIST + L_CURLY "{" + WHITESPACE "\n " + EXPR_STMT + TUPLE_EXPR + L_PAREN "(" + COMMA "," + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n " + EXPR_STMT + TUPLE_EXPR + L_PAREN "(" + PATH_EXPR + PATH + PATH_SEGMENT + NAME_REF + IDENT "a" + COMMA "," + WHITESPACE " " + COMMA "," + WHITESPACE " " + PATH_EXPR + PATH + PATH_SEGMENT + NAME_REF + IDENT "b" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n" + R_CURLY "}" + WHITESPACE "\n" +error 16: expected expression +error 27: expected expression diff --git a/crates/parser/test_data/parser/inline/err/tuple_expr_leading_comma.rs b/crates/parser/test_data/parser/inline/err/tuple_expr_empty_expr.rs index 12fab59a77..37f756ffa6 100644 --- a/crates/parser/test_data/parser/inline/err/tuple_expr_leading_comma.rs +++ b/crates/parser/test_data/parser/inline/err/tuple_expr_empty_expr.rs @@ -1,3 +1,4 @@ fn foo() { (,); + (a, , b); } diff --git a/crates/parser/test_data/parser/inline/err/tuple_expr_leading_comma.rast b/crates/parser/test_data/parser/inline/err/tuple_expr_leading_comma.rast deleted file mode 100644 index 3fbc0da400..0000000000 --- a/crates/parser/test_data/parser/inline/err/tuple_expr_leading_comma.rast +++ /dev/null @@ -1,24 +0,0 @@ -SOURCE_FILE - FN - FN_KW "fn" - WHITESPACE " " - NAME - IDENT "foo" - PARAM_LIST - L_PAREN "(" - R_PAREN ")" - WHITESPACE " " - BLOCK_EXPR - STMT_LIST - L_CURLY "{" - WHITESPACE "\n " - EXPR_STMT - TUPLE_EXPR - L_PAREN "(" - COMMA "," - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" -error 17: expected expression |