[syntax-errors] Named expressions in decorators before Python 3.9 (#16386)

Summary
--

This PR detects the relaxed grammar for decorators proposed in [PEP
614](https://peps.python.org/pep-0614/) on Python 3.8 and lower.

The 3.8 grammar for decorators is
[here](https://docs.python.org/3.8/reference/compound_stmts.html#grammar-token-decorators):

```
decorators                ::=  decorator+
decorator                 ::=  "@" dotted_name ["(" [argument_list [","]] ")"] NEWLINE
dotted_name               ::=  identifier ("." identifier)*
```

in contrast to the current grammar
[here](https://docs.python.org/3/reference/compound_stmts.html#grammar-token-python-grammar-decorators)

```
decorators                ::= decorator+
decorator                 ::= "@" assignment_expression NEWLINE
assignment_expression ::= [identifier ":="] expression
```

Test Plan
--

New inline parser tests.
This commit is contained in:
Brent Westbrook 2025-03-05 12:08:18 -05:00 committed by GitHub
parent d0623888b3
commit 318f503714
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
16 changed files with 876 additions and 3 deletions

View file

@ -0,0 +1,3 @@
# parse_options: { "target-version": "3.8" }
@buttons[0].clicked.connect
def spam(): ...

View file

@ -0,0 +1,3 @@
# parse_options: { "target-version": "3.7" }
@(x := lambda x: x)(foo)
def bar(): ...

View file

@ -0,0 +1,3 @@
# parse_options: { "target-version": "3.8" }
@buttons.clicked.connect
def spam(): ...

View file

@ -0,0 +1,3 @@
# parse_options: { "target-version": "3.8" }
@eval("buttons[0].clicked.connect")
def spam(): ...

View file

@ -0,0 +1,4 @@
# parse_options: { "target-version": "3.8" }
def _(x): return x
@_(buttons[0].clicked.connect)
def spam(): ...

View file

@ -0,0 +1,5 @@
# parse_options: { "target-version": "3.9" }
@buttons[0].clicked.connect
def spam(): ...
@(x := lambda x: x)(foo)
def bar(): ...