]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
make lib2to3 parse async generators everywhere (GH-6588) (GH-27703)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Tue, 10 Aug 2021 09:56:50 +0000 (02:56 -0700)
committerGitHub <noreply@github.com>
Tue, 10 Aug 2021 09:56:50 +0000 (11:56 +0200)
(cherry picked from commit 149addd4960d634ce672ab5fc17e0e785a0cdcd0)

Co-authored-by: Zsolt Dollenstein <zsol.zsol@gmail.com>
Lib/lib2to3/pgen2/tokenize.py
Lib/lib2to3/tests/test_parser.py
Misc/NEWS.d/next/Library/2018-04-24-14-25-07.bpo-33349.Y_0LIr.rst [new file with mode: 0644]

index 0e2685d40433d747b70865be6a2c9a936e26d136..099dfa7798afd44b3e819e971bf4e9f376d765d4 100644 (file)
@@ -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],
index d5db66b9b1e7b9a5c0961befe82bfc043dec78e1..034b5039cf00c4b143d5f6c9c441a749c03b2447 100644 (file)
@@ -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 (file)
index 0000000..be68b3e
--- /dev/null
@@ -0,0 +1 @@
+lib2to3 now recognizes async generators everywhere.