[syntax-errors] Irrefutable case pattern before final case (#16905)

Summary
--

Detects irrefutable `match` cases before the final case using a modified
version
of the existing `Pattern::is_irrefutable` method from the AST crate. The
modified method helps to retrieve a more precise diagnostic range to
match what
Python 3.13 shows in the REPL.

Test Plan
--

New inline tests, as well as some updates to existing tests that had
irrefutable
patterns before the last block.
This commit is contained in:
Brent Westbrook 2025-03-26 12:27:16 -04:00 committed by GitHub
parent 58350ec93b
commit 5697d21fca
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
17 changed files with 1420 additions and 594 deletions

View file

@ -1060,10 +1060,10 @@ impl RecoveryContextKind {
None => {
// test_ok match_sequence_pattern_terminator
// match subject:
// case a: ...
// case a if x: ...
// case a, b: ...
// case a, b if x: ...
// case a: ...
matches!(p.current_token_kind(), TokenKind::Colon | TokenKind::If)
.then_some(ListTerminatorKind::Regular)
}

View file

@ -488,13 +488,16 @@ impl Parser<'_> {
// test_ok match_as_pattern_soft_keyword
// match foo:
// case case: ...
// match foo:
// case match: ...
// match foo:
// case type: ...
let ident = self.parse_identifier();
// test_ok match_as_pattern
// match foo:
// case foo_bar: ...
// match foo:
// case _: ...
Pattern::MatchAs(ast::PatternMatchAs {
range: ident.range,