[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

@ -0,0 +1,12 @@
match x:
case var: ... # capture pattern
case 2: ...
match x:
case _: ...
case 2: ... # wildcard pattern
match x:
case var1 as var2: ... # as pattern with irrefutable left-hand side
case 2: ...
match x:
case enum.variant | var: ... # or pattern with irrefutable part
case 2: ...

View file

@ -0,0 +1,9 @@
match x:
case 2: ...
case var: ...
match x:
case 2: ...
case _: ...
match x:
case var if True: ... # don't try to refute a guarded pattern
case 2: ...

View file

@ -1,3 +1,4 @@
match foo:
case foo_bar: ...
match foo:
case _: ...

View file

@ -1,4 +1,6 @@
match foo:
case case: ...
match foo:
case match: ...
match foo:
case type: ...

View file

@ -1,5 +1,5 @@
match subject:
case a: ...
case a if x: ...
case a, b: ...
case a, b if x: ...
case a: ...