Fix unsafe cast in linegen.py w/ await yield handling (#3533)

Fixes #3532.
This commit is contained in:
Jelle Zijlstra 2023-01-30 18:53:14 -08:00 committed by GitHub
parent f4ebc68320
commit 226cbf0226
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 21 additions and 12 deletions

View File

@ -42,6 +42,7 @@
- Fix an invalid quote escaping bug in f-string expressions where it produced invalid
code. Implicitly concatenated f-strings with different quotes can now be merged or
quote-normalized by changing the quotes used in expressions. (#3509)
- Fix crash on `await (yield)` when Black is compiled with mypyc (#3533)
### Configuration

View File

@ -1223,18 +1223,19 @@ def remove_await_parens(node: Node) -> None:
# N.B. We've still removed any redundant nested brackets though :)
opening_bracket = cast(Leaf, node.children[1].children[0])
closing_bracket = cast(Leaf, node.children[1].children[-1])
bracket_contents = cast(Node, node.children[1].children[1])
if bracket_contents.type != syms.power:
ensure_visible(opening_bracket)
ensure_visible(closing_bracket)
elif (
bracket_contents.type == syms.power
and bracket_contents.children[0].type == token.AWAIT
):
ensure_visible(opening_bracket)
ensure_visible(closing_bracket)
# If we are in a nested await then recurse down.
remove_await_parens(bracket_contents)
bracket_contents = node.children[1].children[1]
if isinstance(bracket_contents, Node):
if bracket_contents.type != syms.power:
ensure_visible(opening_bracket)
ensure_visible(closing_bracket)
elif (
bracket_contents.type == syms.power
and bracket_contents.children[0].type == token.AWAIT
):
ensure_visible(opening_bracket)
ensure_visible(closing_bracket)
# If we are in a nested await then recurse down.
remove_await_parens(bracket_contents)
def _maybe_wrap_cms_in_parens(

View File

@ -77,6 +77,9 @@ async def main():
async def main():
await (await (await (await (await (asyncio.sleep(1))))))
async def main():
await (yield)
# output
import asyncio
@ -167,3 +170,7 @@ async def main():
async def main():
await (await (await (await (await asyncio.sleep(1)))))
async def main():
await (yield)