Support parsing of async generators in non-async functions (#165)

This is a new syntax added in python3.7, so black can't verify that reformatting will not change the ast unless black itself is run with 3.7. We'll need to change the error message black gives in this case. @ambv any ideas?

Fixes #125.
This commit is contained in:
Zsolt Dollenstein 2018-08-20 14:47:58 +01:00 committed by Łukasz Langa
parent b719d85ccc
commit 883689366c
3 changed files with 27 additions and 3 deletions

View File

@ -516,13 +516,14 @@ def generate_tokens(readline):
stashed = tok
continue
if token == 'def':
if token in ('def', 'for'):
if (stashed
and stashed[0] == NAME
and stashed[1] == 'async'):
async_def = True
async_def_indent = indents[-1]
if token == 'def':
async_def = True
async_def_indent = indents[-1]
yield (ASYNC, stashed[1],
stashed[2], stashed[3],

13
tests/data/python37.py Normal file
View File

@ -0,0 +1,13 @@
#!/usr/bin/env python3.7
def f():
return (i*2 async for i in arange(42))
# output
#!/usr/bin/env python3.7
def f():
return (i * 2 async for i in arange(42))

View File

@ -411,6 +411,16 @@ def test_stub(self) -> None:
self.assertFormatEqual(expected, actual)
black.assert_stable(source, actual, line_length=ll, mode=mode)
@patch("black.dump_to_file", dump_to_stderr)
def test_python37(self) -> None:
source, expected = read_data("python37")
actual = fs(source)
self.assertFormatEqual(expected, actual)
major, minor = sys.version_info[:2]
if major > 3 or (major == 3 and minor >= 7):
black.assert_equivalent(source, actual)
black.assert_stable(source, actual, line_length=ll)
@patch("black.dump_to_file", dump_to_stderr)
def test_fmtonoff(self) -> None:
source, expected = read_data("fmtonoff")