Improve `SyntaxError` message for `case ... as a.b`
Feature or enhancement
There's already a similar rule:
| | or_pattern 'as' !NAME a=expression { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "invalid pattern target") } |
But, it has two problems:
- It does not work for cases like
as a.b, becauseamatchesNAME - It does not show rich error message, only a static one:
invalid pattern target
My proposed change:
| or_pattern 'as' a=expression {
RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
a, "cannot use pattern target as %s", _PyPegen_get_expr_name(a)) }
Why is it safe?
Here's how the parent rule is defined:
as_pattern[pattern_ty]:
| pattern=or_pattern 'as' target=pattern_capture_target {
_PyAST_MatchAs(pattern, target->v.Name.id, EXTRA) }
| invalid_as_pattern
So, if pattern=or_pattern 'as' target=pattern_capture_target with a valid 'as' NAME is matched, we won't fall to the next invalid_ rule.
Proposed result:
>>> match 1: ... case x as a.b: ... ... File "<python-input-0>", line 2 case x as a.b: ... ^^^ SyntaxError: cannot use pattern target as attribute
Refs #123440