mirror of
https://github.com/astral-sh/ruff.git
synced 2025-08-10 13:48:35 +00:00
[syntax-errors] Make async-comprehension-in-sync-comprehension
more specific (#17460)
## Summary While adding semantic error support to red-knot, I noticed duplicate diagnostics for code like this: ```py # error: [invalid-syntax] "cannot use an asynchronous comprehension outside of an asynchronous function on Python 3.9 (syntax was added in 3.11)" # error: [invalid-syntax] "`asynchronous comprehension` outside of an asynchronous function" [reveal_type(x) async for x in AsyncIterable()] ``` Beyond the duplication, the first error message doesn't make much sense because this syntax is _not_ allowed on Python 3.11 either. To fix this, this PR renames the `async-comprehension-outside-async-function` semantic syntax error to `async-comprehension-in-sync-comprehension` and fixes the rule to avoid applying outside of sync comprehensions at all. ## Test Plan New linter test demonstrating the false positive. The mdtests from my red-knot PR also reflect this change.
This commit is contained in:
parent
f7b48510b5
commit
92ecfc908b
9 changed files with 25 additions and 21 deletions
|
@ -573,7 +573,7 @@ impl SemanticSyntaxChecker {
|
|||
elt, generators, ..
|
||||
}) => {
|
||||
Self::check_generator_expr(elt, generators, ctx);
|
||||
Self::async_comprehension_outside_async_function(ctx, generators);
|
||||
Self::async_comprehension_in_sync_comprehension(ctx, generators);
|
||||
for generator in generators.iter().filter(|g| g.is_async) {
|
||||
Self::await_outside_async_function(
|
||||
ctx,
|
||||
|
@ -590,7 +590,7 @@ impl SemanticSyntaxChecker {
|
|||
}) => {
|
||||
Self::check_generator_expr(key, generators, ctx);
|
||||
Self::check_generator_expr(value, generators, ctx);
|
||||
Self::async_comprehension_outside_async_function(ctx, generators);
|
||||
Self::async_comprehension_in_sync_comprehension(ctx, generators);
|
||||
for generator in generators.iter().filter(|g| g.is_async) {
|
||||
Self::await_outside_async_function(
|
||||
ctx,
|
||||
|
@ -801,7 +801,7 @@ impl SemanticSyntaxChecker {
|
|||
}
|
||||
}
|
||||
|
||||
fn async_comprehension_outside_async_function<Ctx: SemanticSyntaxContext>(
|
||||
fn async_comprehension_in_sync_comprehension<Ctx: SemanticSyntaxContext>(
|
||||
ctx: &Ctx,
|
||||
generators: &[ast::Comprehension],
|
||||
) {
|
||||
|
@ -813,7 +813,7 @@ impl SemanticSyntaxChecker {
|
|||
if ctx.in_notebook() && ctx.in_module_scope() {
|
||||
return;
|
||||
}
|
||||
if ctx.in_async_context() && !ctx.in_sync_comprehension() {
|
||||
if !ctx.in_sync_comprehension() {
|
||||
return;
|
||||
}
|
||||
for generator in generators.iter().filter(|gen| gen.is_async) {
|
||||
|
@ -845,7 +845,7 @@ impl SemanticSyntaxChecker {
|
|||
// async def j(): return [([y for y in range(1)], [z async for z in range(2)]) for x in range(5)]
|
||||
Self::add_error(
|
||||
ctx,
|
||||
SemanticSyntaxErrorKind::AsyncComprehensionOutsideAsyncFunction(python_version),
|
||||
SemanticSyntaxErrorKind::AsyncComprehensionInSyncComprehension(python_version),
|
||||
generator.range,
|
||||
);
|
||||
}
|
||||
|
@ -914,11 +914,11 @@ impl Display for SemanticSyntaxError {
|
|||
SemanticSyntaxErrorKind::InvalidStarExpression => {
|
||||
f.write_str("can't use starred expression here")
|
||||
}
|
||||
SemanticSyntaxErrorKind::AsyncComprehensionOutsideAsyncFunction(python_version) => {
|
||||
SemanticSyntaxErrorKind::AsyncComprehensionInSyncComprehension(python_version) => {
|
||||
write!(
|
||||
f,
|
||||
"cannot use an asynchronous comprehension outside of an asynchronous \
|
||||
function on Python {python_version} (syntax was added in 3.11)",
|
||||
"cannot use an asynchronous comprehension inside of a synchronous comprehension \
|
||||
on Python {python_version} (syntax was added in 3.11)",
|
||||
)
|
||||
}
|
||||
SemanticSyntaxErrorKind::YieldOutsideFunction(kind) => {
|
||||
|
@ -1187,7 +1187,7 @@ pub enum SemanticSyntaxErrorKind {
|
|||
/// This was discussed in [BPO 33346] and fixed in Python 3.11.
|
||||
///
|
||||
/// [BPO 33346]: https://github.com/python/cpython/issues/77527
|
||||
AsyncComprehensionOutsideAsyncFunction(PythonVersion),
|
||||
AsyncComprehensionInSyncComprehension(PythonVersion),
|
||||
|
||||
/// Represents the use of `yield`, `yield from`, or `await` outside of a function scope.
|
||||
///
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue