mirror of
https://github.com/astral-sh/ruff.git
synced 2025-07-28 15:34:19 +00:00
[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:
parent
d0623888b3
commit
318f503714
16 changed files with 876 additions and 3 deletions
|
@ -449,6 +449,37 @@ pub enum UnsupportedSyntaxErrorKind {
|
|||
Match,
|
||||
Walrus,
|
||||
ExceptStar,
|
||||
/// Represents the use of a "relaxed" [PEP 614] decorator before Python 3.9.
|
||||
///
|
||||
/// ## Examples
|
||||
///
|
||||
/// Prior to Python 3.9, decorators were defined to be [`dotted_name`]s, optionally followed by
|
||||
/// an argument list. For example:
|
||||
///
|
||||
/// ```python
|
||||
/// @buttons.clicked.connect
|
||||
/// def foo(): ...
|
||||
///
|
||||
/// @buttons.clicked.connect(1, 2, 3)
|
||||
/// def foo(): ...
|
||||
/// ```
|
||||
///
|
||||
/// As pointed out in the PEP, this prevented reasonable extensions like subscripts:
|
||||
///
|
||||
/// ```python
|
||||
/// buttons = [QPushButton(f'Button {i}') for i in range(10)]
|
||||
///
|
||||
/// @buttons[0].clicked.connect
|
||||
/// def spam(): ...
|
||||
/// ```
|
||||
///
|
||||
/// Python 3.9 removed these restrictions and expanded the [decorator grammar] to include any
|
||||
/// assignment expression and include cases like the example above.
|
||||
///
|
||||
/// [PEP 614]: https://peps.python.org/pep-0614/
|
||||
/// [`dotted_name`]: https://docs.python.org/3.8/reference/compound_stmts.html#grammar-token-dotted-name
|
||||
/// [decorator grammar]: https://docs.python.org/3/reference/compound_stmts.html#grammar-token-python-grammar-decorator
|
||||
RelaxedDecorator,
|
||||
/// Represents the use of a [PEP 570] positional-only parameter before Python 3.8.
|
||||
///
|
||||
/// ## Examples
|
||||
|
@ -513,6 +544,7 @@ impl Display for UnsupportedSyntaxError {
|
|||
UnsupportedSyntaxErrorKind::Match => "Cannot use `match` statement",
|
||||
UnsupportedSyntaxErrorKind::Walrus => "Cannot use named assignment expression (`:=`)",
|
||||
UnsupportedSyntaxErrorKind::ExceptStar => "Cannot use `except*`",
|
||||
UnsupportedSyntaxErrorKind::RelaxedDecorator => "Unsupported expression in decorators",
|
||||
UnsupportedSyntaxErrorKind::PositionalOnlyParameter => {
|
||||
"Cannot use positional-only parameter separator"
|
||||
}
|
||||
|
@ -538,6 +570,7 @@ impl UnsupportedSyntaxErrorKind {
|
|||
UnsupportedSyntaxErrorKind::Match => PythonVersion::PY310,
|
||||
UnsupportedSyntaxErrorKind::Walrus => PythonVersion::PY38,
|
||||
UnsupportedSyntaxErrorKind::ExceptStar => PythonVersion::PY311,
|
||||
UnsupportedSyntaxErrorKind::RelaxedDecorator => PythonVersion::PY39,
|
||||
UnsupportedSyntaxErrorKind::PositionalOnlyParameter => PythonVersion::PY38,
|
||||
UnsupportedSyntaxErrorKind::TypeParameterList => PythonVersion::PY312,
|
||||
UnsupportedSyntaxErrorKind::TypeAliasStatement => PythonVersion::PY312,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue