summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2021-08-10 09:56:50 (GMT)
committerGitHub <noreply@github.com>2021-08-10 09:56:50 (GMT)
commit0e63776c4f3d0b972344368f62b91eb96be69fe3 (patch)
treefb4ffcaf9cb4fb0f564283b72fe4dbe12dd954d4
parentede1dc416de5eece02170e03387dc8496c2d00ae (diff)
downloadcpython-0e63776c4f3d0b972344368f62b91eb96be69fe3.zip
cpython-0e63776c4f3d0b972344368f62b91eb96be69fe3.tar.gz
cpython-0e63776c4f3d0b972344368f62b91eb96be69fe3.tar.bz2
make lib2to3 parse async generators everywhere (GH-6588) (GH-27703)
(cherry picked from commit 149addd4960d634ce672ab5fc17e0e785a0cdcd0) Co-authored-by: Zsolt Dollenstein <zsol.zsol@gmail.com>
-rw-r--r--Lib/lib2to3/pgen2/tokenize.py7
-rw-r--r--Lib/lib2to3/tests/test_parser.py17
-rw-r--r--Misc/NEWS.d/next/Library/2018-04-24-14-25-07.bpo-33349.Y_0LIr.rst1
3 files changed, 17 insertions, 8 deletions
diff --git a/Lib/lib2to3/pgen2/tokenize.py b/Lib/lib2to3/pgen2/tokenize.py
index 0e2685d..099dfa7 100644
--- a/Lib/lib2to3/pgen2/tokenize.py
+++ b/Lib/lib2to3/pgen2/tokenize.py
@@ -512,13 +512,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],
diff --git a/Lib/lib2to3/tests/test_parser.py b/Lib/lib2to3/tests/test_parser.py
index d5db66b..034b503 100644
--- a/Lib/lib2to3/tests/test_parser.py
+++ b/Lib/lib2to3/tests/test_parser.py
@@ -196,20 +196,27 @@ class TestAsyncAwait(GrammarTest):
self.validate("""await = 1""")
self.validate("""def async(): pass""")
- def test_async_with(self):
+ def test_async_for(self):
self.validate("""async def foo():
async for a in b: pass""")
- self.invalid_syntax("""def foo():
- async for a in b: pass""")
-
- def test_async_for(self):
+ def test_async_with(self):
self.validate("""async def foo():
async with a: pass""")
self.invalid_syntax("""def foo():
async with a: pass""")
+ def test_async_generator(self):
+ self.validate(
+ """async def foo():
+ return (i * 2 async for i in arange(42))"""
+ )
+ self.validate(
+ """def foo():
+ return (i * 2 async for i in arange(42))"""
+ )
+
class TestRaiseChanges(GrammarTest):
def test_2x_style_1(self):
diff --git a/Misc/NEWS.d/next/Library/2018-04-24-14-25-07.bpo-33349.Y_0LIr.rst b/Misc/NEWS.d/next/Library/2018-04-24-14-25-07.bpo-33349.Y_0LIr.rst
new file mode 100644
index 0000000..be68b3e
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2018-04-24-14-25-07.bpo-33349.Y_0LIr.rst
@@ -0,0 +1 @@
+lib2to3 now recognizes async generators everywhere.