def infer_type(self, env):
return self.target.infer_type(env)
-
+
+ def analyse_declarations(self, env):
+ self.append.target = self # this is used in the PyList_Append of the inner loop
+ self.loop.analyse_declarations(env)
+
def analyse_types(self, env):
self.target.analyse_expressions(env)
self.type = self.target.type
- self.append.target = self # this is a CloneNode used in the PyList_Append in the inner loop
- # We are analysing declarations to late.
- self.loop.target.analyse_target_declaration(env)
- env.infer_types()
- self.loop.analyse_declarations(env)
self.loop.analyse_expressions(env)
def calculate_result_code(self):
self.env_stack.pop()
self.seen_vars_stack.pop()
return node
-
+
+ def visit_ComprehensionNode(self, node):
+ self.visitchildren(node)
+ node.analyse_declarations(self.env_stack[-1])
+ return node
+
# Some nodes are no longer needed after declaration
# analysis and can be dropped. The analysis was performed
# on these nodes in a seperate recursive process from the
if isinstance(lhs, (ExprNodes.NameNode, Nodes.PyArgDeclNode)):
if lhs.entry is None:
# TODO: This shouldn't happen...
- # It looks like comprehension loop targets are not declared soon enough.
return
lhs.entry.assignments.append(rhs)
elif isinstance(lhs, ExprNodes.SequenceNode):