Skip to content

Improve SyntaxError message for case ... as a.b #123562

Closed
@sobolevn

Description

@sobolevn

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:

  1. It does not work for cases like as a.b, because a matches NAME
  2. 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

Linked PRs

Metadata

Metadata

Assignees

Labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions