mirror of
https://github.com/astral-sh/ruff.git
synced 2025-08-03 18:28:56 +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
|
@ -780,7 +780,7 @@ Module(
|
|||
|
|
||||
1 | # parse_options: {"target-version": "3.10"}
|
||||
2 | async def f(): return [[x async for x in foo(n)] for n in range(3)] # list
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ Syntax Error: cannot use an asynchronous comprehension outside of an asynchronous function on Python 3.10 (syntax was added in 3.11)
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ Syntax Error: cannot use an asynchronous comprehension inside of a synchronous comprehension on Python 3.10 (syntax was added in 3.11)
|
||||
3 | async def g(): return [{x: 1 async for x in foo(n)} for n in range(3)] # dict
|
||||
4 | async def h(): return [{x async for x in foo(n)} for n in range(3)] # set
|
||||
|
|
||||
|
@ -790,7 +790,7 @@ Module(
|
|||
1 | # parse_options: {"target-version": "3.10"}
|
||||
2 | async def f(): return [[x async for x in foo(n)] for n in range(3)] # list
|
||||
3 | async def g(): return [{x: 1 async for x in foo(n)} for n in range(3)] # dict
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ Syntax Error: cannot use an asynchronous comprehension outside of an asynchronous function on Python 3.10 (syntax was added in 3.11)
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ Syntax Error: cannot use an asynchronous comprehension inside of a synchronous comprehension on Python 3.10 (syntax was added in 3.11)
|
||||
4 | async def h(): return [{x async for x in foo(n)} for n in range(3)] # set
|
||||
5 | async def i(): return [([y async for y in range(1)], [z for z in range(2)]) for x in range(5)]
|
||||
|
|
||||
|
@ -800,7 +800,7 @@ Module(
|
|||
2 | async def f(): return [[x async for x in foo(n)] for n in range(3)] # list
|
||||
3 | async def g(): return [{x: 1 async for x in foo(n)} for n in range(3)] # dict
|
||||
4 | async def h(): return [{x async for x in foo(n)} for n in range(3)] # set
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ Syntax Error: cannot use an asynchronous comprehension outside of an asynchronous function on Python 3.10 (syntax was added in 3.11)
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ Syntax Error: cannot use an asynchronous comprehension inside of a synchronous comprehension on Python 3.10 (syntax was added in 3.11)
|
||||
5 | async def i(): return [([y async for y in range(1)], [z for z in range(2)]) for x in range(5)]
|
||||
6 | async def j(): return [([y for y in range(1)], [z async for z in range(2)]) for x in range(5)]
|
||||
|
|
||||
|
@ -810,7 +810,7 @@ Module(
|
|||
3 | async def g(): return [{x: 1 async for x in foo(n)} for n in range(3)] # dict
|
||||
4 | async def h(): return [{x async for x in foo(n)} for n in range(3)] # set
|
||||
5 | async def i(): return [([y async for y in range(1)], [z for z in range(2)]) for x in range(5)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ Syntax Error: cannot use an asynchronous comprehension outside of an asynchronous function on Python 3.10 (syntax was added in 3.11)
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ Syntax Error: cannot use an asynchronous comprehension inside of a synchronous comprehension on Python 3.10 (syntax was added in 3.11)
|
||||
6 | async def j(): return [([y for y in range(1)], [z async for z in range(2)]) for x in range(5)]
|
||||
|
|
||||
|
||||
|
@ -819,5 +819,5 @@ Module(
|
|||
4 | async def h(): return [{x async for x in foo(n)} for n in range(3)] # set
|
||||
5 | async def i(): return [([y async for y in range(1)], [z for z in range(2)]) for x in range(5)]
|
||||
6 | async def j(): return [([y for y in range(1)], [z async for z in range(2)]) for x in range(5)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ Syntax Error: cannot use an asynchronous comprehension outside of an asynchronous function on Python 3.10 (syntax was added in 3.11)
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ Syntax Error: cannot use an asynchronous comprehension inside of a synchronous comprehension on Python 3.10 (syntax was added in 3.11)
|
||||
|
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue