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 stashed = tok
continue continue
if token == 'def': if token in ('def', 'for'):
if (stashed if (stashed
and stashed[0] == NAME and stashed[0] == NAME
and stashed[1] == 'async'): and stashed[1] == 'async'):
async_def = True if token == 'def':
async_def_indent = indents[-1] async_def = True
async_def_indent = indents[-1]
yield (ASYNC, stashed[1], yield (ASYNC, stashed[1],
stashed[2], stashed[3], 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) self.assertFormatEqual(expected, actual)
black.assert_stable(source, actual, line_length=ll, mode=mode) 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) @patch("black.dump_to_file", dump_to_stderr)
def test_fmtonoff(self) -> None: def test_fmtonoff(self) -> None:
source, expected = read_data("fmtonoff") source, expected = read_data("fmtonoff")