summaryrefslogtreecommitdiff
path: root/rebuilder.py
diff options
context:
space:
mode:
authorEmile Anclin <emile.anclin@logilab.fr>2010-01-21 14:38:07 +0100
committerEmile Anclin <emile.anclin@logilab.fr>2010-01-21 14:38:07 +0100
commit374ad7c58fa14da8733a0690c7421a5fc8d21743 (patch)
tree82b5e869f1a30fe83463e67e44ef95591f064379 /rebuilder.py
parentf19c445cf15e40d383ea7bff70b00242a4686691 (diff)
downloadastroid-git-374ad7c58fa14da8733a0690c7421a5fc8d21743.tar.gz
save assignement nodes and call set_local after walking the tree
--HG-- branch : rebuild
Diffstat (limited to 'rebuilder.py')
-rw-r--r--rebuilder.py24
1 files changed, 16 insertions, 8 deletions
diff --git a/rebuilder.py b/rebuilder.py
index 49260b50..21118fc3 100644
--- a/rebuilder.py
+++ b/rebuilder.py
@@ -41,7 +41,7 @@ class RebuildVisitor(ASTVisitor):
self._delayed = dict((name, []) for name in ('class', 'function', 'assattr'))
self.set_line_info = (ast_mode == '_ast')
self._ast_mode = (ast_mode == '_ast')
- self._asscontext = None
+ self._assignments = []
def visit(self, node, parent):
if node is None: # some attributes of some nodes are just None
@@ -76,6 +76,8 @@ class RebuildVisitor(ASTVisitor):
delay_method = getattr(self, 'delayed_' + name)
for node in nodes:
delay_method(node)
+ for node, root in self._assignments:
+ self.set_local_name(node, root)
return newnode
# general visit_<node> methods ############################################
@@ -231,13 +233,19 @@ class RebuildVisitor(ASTVisitor):
newnode = nodes.Pass()
return newnode
- def visit_assname(self, node): # XXX parent
- if self.asscontext is not None:
- if self._global_names and node.name in self._global_names[-1]:
- node.root().set_local(node.name, node)
- else:
- node.parent.set_local(node.name, node)
- visit_delname = visit_assname
+ def _save_assigment(self, node):
+ """save assignement situation since node.parent is not available yet"""
+ if self._global_names and node.name in self._global_names[-1]:
+ self._assignments.append((node, True))
+ else:
+ self._assignments.append((node, False))
+
+ def set_local_name(self, node, root):
+ """set local name into the right place"""
+ if root:
+ node.root().set_local(node.name, node)
+ else:
+ node.parent.set_local(node.name, node)
def delayed_assattr(self, node):
"""visit a AssAttr node -> add name to locals, handle members