[syntax-errors] Star annotations before Python 3.11 (#16545)

Summary
--

This is closely related to (and stacked on)
https://github.com/astral-sh/ruff/pull/16544 and detects star
annotations in function definitions.

I initially called the variant `StarExpressionInAnnotation` to mirror
`StarExpressionInIndex`, but I realized it's not really a "star
expression" in this position and renamed it. `StarAnnotation` seems in
line with the PEP.

Test Plan
--

Two new inline tests. It looked like there was pretty good existing
coverage of this syntax, so I just added simple examples to test the
version cutoff.
This commit is contained in:
Brent Westbrook 2025-03-14 11:20:44 -04:00 committed by GitHub
parent 4f2851982d
commit 6311412373
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 199 additions and 2 deletions

View file

@ -2882,9 +2882,23 @@ impl<'src> Parser<'src> {
// def foo(*args: *int or str): ...
// def foo(*args: *yield x): ...
// # def foo(*args: **int): ...
self.parse_conditional_expression_or_higher_impl(
let parsed_expr = self.parse_conditional_expression_or_higher_impl(
ExpressionContext::starred_bitwise_or(),
)
);
// test_ok param_with_star_annotation_py311
// # parse_options: {"target-version": "3.11"}
// def foo(*args: *Ts): ...
// test_err param_with_star_annotation_py310
// # parse_options: {"target-version": "3.10"}
// def foo(*args: *Ts): ...
self.add_unsupported_syntax_error(
UnsupportedSyntaxErrorKind::StarAnnotation,
parsed_expr.range(),
);
parsed_expr
}
AllowStarAnnotation::No => {
// test_ok param_with_annotation