summaryrefslogtreecommitdiff
path: root/Cython/Compiler/ParseTreeTransforms.py
diff options
context:
space:
mode:
authorStefan Behnel <stefan_ml@behnel.de>2017-08-04 16:11:50 +0200
committerStefan Behnel <stefan_ml@behnel.de>2017-08-04 16:11:50 +0200
commit6c5fab7c91870678caa2840835ade0b28fa383bd (patch)
tree891cbc09a6d9d81129cce384131257af90dfccf9 /Cython/Compiler/ParseTreeTransforms.py
parentddec13cbecd43f20d0c9a9dbe10a9151f066650d (diff)
downloadcython-6c5fab7c91870678caa2840835ade0b28fa383bd.tar.gz
implement PEP 530 by allowing async generator expressions
Diffstat (limited to 'Cython/Compiler/ParseTreeTransforms.py')
-rw-r--r--Cython/Compiler/ParseTreeTransforms.py21
1 files changed, 16 insertions, 5 deletions
diff --git a/Cython/Compiler/ParseTreeTransforms.py b/Cython/Compiler/ParseTreeTransforms.py
index 13f6ae7e1..b4cbc3ad2 100644
--- a/Cython/Compiler/ParseTreeTransforms.py
+++ b/Cython/Compiler/ParseTreeTransforms.py
@@ -208,11 +208,22 @@ class PostParse(ScopeTrackingTransform):
def visit_GeneratorExpressionNode(self, node):
# unpack a generator expression into the corresponding DefNode
- node.def_node = Nodes.DefNode(node.pos, name=node.name,
- doc=None,
- args=[], star_arg=None,
- starstar_arg=None,
- body=node.loop)
+ collector = YieldNodeCollector()
+ collector.visitchildren(node.loop)
+ node.def_node = Nodes.DefNode(
+ node.pos, name=node.name, doc=None,
+ args=[], star_arg=None, starstar_arg=None,
+ body=node.loop, is_async_def=collector.has_await)
+ self.visitchildren(node)
+ return node
+
+ def visit_ComprehensionNode(self, node):
+ # enforce local scope also in Py2 for async generators (seriously, that's a Py3.6 feature...)
+ if not node.has_local_scope:
+ collector = YieldNodeCollector()
+ collector.visitchildren(node.loop)
+ if collector.has_await:
+ node.has_local_scope = True
self.visitchildren(node)
return node