Ensure bindings are created in correct order for e.g. "x, y = y, x".

This commit is contained in:
whitequark 2015-07-16 15:59:59 +03:00
parent 5756cfcebc
commit bcd1832203
1 changed files with 14 additions and 1 deletions

View File

@ -107,12 +107,25 @@ class LocalExtractor(algorithm.Visitor):
def visit_Name(self, node): def visit_Name(self, node):
if self.in_assign: if self.in_assign:
# code like: # Code like:
# x = 1 # x = 1
# def f(): # def f():
# x = 1 # x = 1
# creates a new binding for x in f's scope # creates a new binding for x in f's scope
self._assignable(node.id) self._assignable(node.id)
else:
# This is duplicated here as well as below so that
# code like:
# x, y = y, x
# where y and x were not defined earlier would be invalid.
if node.id in self.typing_env:
return
for outer_env in reversed(self.env_stack):
if node.id in outer_env:
return
diag = diagnostic.Diagnostic("fatal",
"name '{name}' is not bound to anything", {"name":node.id}, node.loc)
self.engine.process(diag)
def visit_Attribute(self, node): def visit_Attribute(self, node):
self.visit_in_assign(node.value, in_assign=False) self.visit_in_assign(node.value, in_assign=False)