Skip to content

Commit

Permalink
Expect indented case block instead of match stmt (#11033)
Browse files Browse the repository at this point in the history
## Summary

This PR adds a new `Clause::Case` and uses it to parse the body of a
`case` block. Earlier, it was using `Match` which would give an
incorrect error message like:

```
  |
1 | match subject:
2 |     case 1:
3 |     case 2: ...
  |     ^^^^ Syntax Error: Expected an indented block after `match` statement
  |
```

## Test Plan

Add test case and update the snapshot.
  • Loading branch information
dhruvmanila committed Apr 19, 2024
1 parent 06c248a commit 9bb23b0
Show file tree
Hide file tree
Showing 3 changed files with 95 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
match subject:
case 1:
case 2: ...
11 changes: 8 additions & 3 deletions crates/ruff_python_parser/src/parser/statement.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2492,7 +2492,12 @@ impl<'src> Parser<'src> {
};

self.expect(TokenKind::Colon);
let body = self.parse_body(Clause::Match);

// test_err case_expect_indented_block
// match subject:
// case 1:
// case 2: ...
let body = self.parse_body(Clause::Case);

ast::MatchCase {
pattern,
Expand Down Expand Up @@ -3363,7 +3368,7 @@ enum Clause {
Class,
While,
FunctionDef,
Match,
Case,
Try,
Except,
Finally,
Expand All @@ -3380,7 +3385,7 @@ impl Display for Clause {
Clause::Class => write!(f, "`class` definition"),
Clause::While => write!(f, "`while` statement"),
Clause::FunctionDef => write!(f, "function definition"),
Clause::Match => write!(f, "`match` statement"),
Clause::Case => write!(f, "`case` block"),
Clause::Try => write!(f, "`try` statement"),
Clause::Except => write!(f, "`except` clause"),
Clause::Finally => write!(f, "`finally` clause"),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
---
source: crates/ruff_python_parser/tests/fixtures.rs
input_file: crates/ruff_python_parser/resources/inline/err/case_expect_indented_block.py
---
## AST

```
Module(
ModModule {
range: 0..43,
body: [
Match(
StmtMatch {
range: 0..42,
subject: Name(
ExprName {
range: 6..13,
id: "subject",
ctx: Load,
},
),
cases: [
MatchCase {
range: 19..26,
pattern: MatchValue(
PatternMatchValue {
range: 24..25,
value: NumberLiteral(
ExprNumberLiteral {
range: 24..25,
value: Int(
1,
),
},
),
},
),
guard: None,
body: [],
},
MatchCase {
range: 31..42,
pattern: MatchValue(
PatternMatchValue {
range: 36..37,
value: NumberLiteral(
ExprNumberLiteral {
range: 36..37,
value: Int(
2,
),
},
),
},
),
guard: None,
body: [
Expr(
StmtExpr {
range: 39..42,
value: EllipsisLiteral(
ExprEllipsisLiteral {
range: 39..42,
},
),
},
),
],
},
],
},
),
],
},
)
```
## Errors

|
1 | match subject:
2 | case 1:
3 | case 2: ...
| ^^^^ Syntax Error: Expected an indented block after `case` block
|

0 comments on commit 9bb23b0

Please sign in to comment.