diff options
author | Stefan Behnel <stefan_ml@behnel.de> | 2017-08-04 16:11:50 +0200 |
---|---|---|
committer | Stefan Behnel <stefan_ml@behnel.de> | 2017-08-04 16:11:50 +0200 |
commit | 6c5fab7c91870678caa2840835ade0b28fa383bd (patch) | |
tree | 891cbc09a6d9d81129cce384131257af90dfccf9 /Cython/Compiler/ParseTreeTransforms.py | |
parent | ddec13cbecd43f20d0c9a9dbe10a9151f066650d (diff) | |
download | cython-6c5fab7c91870678caa2840835ade0b28fa383bd.tar.gz |
implement PEP 530 by allowing async generator expressions
Diffstat (limited to 'Cython/Compiler/ParseTreeTransforms.py')
-rw-r--r-- | Cython/Compiler/ParseTreeTransforms.py | 21 |
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 |