diff options
author | Emile Anclin <emile.anclin@logilab.fr> | 2010-01-21 16:58:50 +0100 |
---|---|---|
committer | Emile Anclin <emile.anclin@logilab.fr> | 2010-01-21 16:58:50 +0100 |
commit | 13c8cb6bf539e411f4c2913fe04648b4d947565c (patch) | |
tree | a8e850513165cec88ba2a635a3b073457c649a36 /rebuilder.py | |
parent | 585184106fb4534b775636a4e0a8cfa0f6c6debf (diff) | |
download | astroid-git-13c8cb6bf539e411f4c2913fe04648b4d947565c.tar.gz |
fix parent for some nodes; add a _check_children helper function
--HG--
branch : rebuild
Diffstat (limited to 'rebuilder.py')
-rw-r--r-- | rebuilder.py | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/rebuilder.py b/rebuilder.py index 21118fc3..f8fff89a 100644 --- a/rebuilder.py +++ b/rebuilder.py @@ -30,6 +30,17 @@ CONST_NAME_TRANSFORMS = {'None': None, 'True': True, 'False': False} +def _check_children(node): + """a helper function to check children - parent relations""" + for child in node.get_children(): + if not hasattr(child, 'parent'): + print " %s has child %s %x with no parent" % (node, child, id(child)) + elif not child.parent: + print " %s has child %s %x with parent %r" % (node, child, id(child), child.parent) + elif child.parent is not node: + print " child %s %x has not parent %s %x" % (child, id(child), node, id(node)) + _check_children(child) + class RebuildVisitor(ASTVisitor): """Visitor to transform an AST to an ASTNG @@ -47,7 +58,7 @@ class RebuildVisitor(ASTVisitor): if node is None: # some attributes of some nodes are just None print "node with parent %s is None" % parent return None - node.parent = parent # XXX it seems that we need it sometimes + # TODO : remove parent: it is never used cls_name = node.__class__.__name__ _method_suffix = REDIRECT.get(cls_name, cls_name).lower() _visit = getattr(self, "visit_%s" % _method_suffix ) @@ -55,29 +66,33 @@ class RebuildVisitor(ASTVisitor): newnode = _visit(node) except NodeRemoved: return - child = None if newnode is None: return + self.set_infos(newnode, node) + _leave = getattr(self, "leave_%s" % _method_suffix, None ) + if _leave: + _leave(newnode) + return newnode + + def set_infos(self, newnode, oldnode): + """set parent and line number infos""" + child = None for child in newnode.get_children(): if child is not None: child.parent = newnode else: print "newnode %s has None as child" % newnode # newnode.set_line_info(child) - _leave = getattr(self, "leave_%s" % _method_suffix, None ) - if _leave: - _leave(newnode) - return newnode - def walk(self, node): newnode = self.visit(node, None) + _check_children(newnode) for name, nodes in self._delayed.items(): 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) + for assnode, root in self._assignments: + self.set_local_name(assnode, root) return newnode # general visit_<node> methods ############################################ |