diff options
| author | Emile Anclin <emile.anclin@logilab.fr> | 2010-02-02 14:05:07 +0100 |
|---|---|---|
| committer | Emile Anclin <emile.anclin@logilab.fr> | 2010-02-02 14:05:07 +0100 |
| commit | 1792b0ed5ab7149e97bb9fa25a9e566381a09227 (patch) | |
| tree | f027153a015922ac5132d13fbca73aa50340a7d2 | |
| parent | a38a3a5f8f85dcf07d482c204a3994bb7017eebd (diff) | |
| download | astroid-git-1792b0ed5ab7149e97bb9fa25a9e566381a09227.tar.gz | |
remove all unnecessary delayed methods
--HG--
branch : rebuild
| -rw-r--r-- | _nodes_ast.py | 11 | ||||
| -rw-r--r-- | _nodes_compiler.py | 9 | ||||
| -rw-r--r-- | rebuilder.py | 53 |
3 files changed, 30 insertions, 43 deletions
diff --git a/_nodes_ast.py b/_nodes_ast.py index 90c64e90..8abf5311 100644 --- a/_nodes_ast.py +++ b/_nodes_ast.py @@ -191,7 +191,7 @@ class TreeRebuilder(RebuildVisitor): newnode.parent = parent newnode.expr = self.visit(node.expr, newnode) self.asscontext = assc - self._delayed['assattr'].append(newnode) + self._delayed_assattr.append(newnode) return newnode def visit_assert(self, node, parent): @@ -210,7 +210,7 @@ class TreeRebuilder(RebuildVisitor): newnode.targets = [self.visit(child, newnode) for child in node.targets] self.asscontext = None newnode.value = self.visit(node.value, newnode) - self._delayed['assign'].append(newnode) + self._set_assign_infos(newnode) return newnode def visit_augassign(self, node, parent): @@ -302,7 +302,6 @@ class TreeRebuilder(RebuildVisitor): newnode.parent = parent newnode.nodes = [self.visit(child, newnode) for child in node.decorators] self.set_infos(newnode, node) - self._delayed['decorators'].append(newnode) return newnode def visit_delete(self, node, parent): @@ -374,7 +373,7 @@ class TreeRebuilder(RebuildVisitor): names = [(alias.name, alias.asname) for alias in node.names] newnode = new.From(node.module, names) newnode.parent = parent - self._delayed['from'].append(newnode) + self._add_from_names_to_locals(newnode) return newnode def _visit_function(self, node, parent): @@ -412,7 +411,7 @@ class TreeRebuilder(RebuildVisitor): elif self.asscontext == "Ass": # FIXME : maybe we should call visit_assattr ? newnode = new.AssAttr() - self._delayed['assattr'].append(newnode) + self._delayed_assattr.append(newnode) else: newnode = new.Getattr() newnode.parent = parent @@ -492,8 +491,8 @@ class TreeRebuilder(RebuildVisitor): newnode = new.Module() newnode.parent = parent _init_set_doc(node, newnode) - newnode.body = [self.visit(child, newnode) for child in node.body] newnode.name = node.name + newnode.body = [self.visit(child, newnode) for child in node.body] return newnode def visit_name(self, node, parent): diff --git a/_nodes_compiler.py b/_nodes_compiler.py index 35097d79..8e6bc4b1 100644 --- a/_nodes_compiler.py +++ b/_nodes_compiler.py @@ -233,7 +233,7 @@ class TreeRebuilder(RebuildVisitor): self._set_infos(node, newnode, parent) newnode.expr = self.visit(node.expr, newnode) newnode.attrname = node.attrname - self._delayed['assattr'].append(newnode) + self._delayed_assattr.append(newnode) return newnode def visit_assname(self, node, parent): @@ -267,7 +267,7 @@ class TreeRebuilder(RebuildVisitor): newnode.targets = [self.visit(child, newnode) for child in node.nodes] self.asscontext = None newnode.value = self.visit(node.expr, newnode) - self._delayed['assign'].append(newnode) + self._set_assign_infos(newnode) return newnode def visit_asslist(self, node, parent): @@ -467,10 +467,9 @@ class TreeRebuilder(RebuildVisitor): """visit a From node by returning a fresh instance of it""" newnode = new.From(node.modname, node.names) self._set_infos(node, newnode, parent) - self._delayed['from'].append(newnode) + self._add_from_names_to_locals(newnode) return newnode - def _visit_function(self, node, parent): """visit a Function node by returning a fresh instance of it""" newnode = new.Function() @@ -583,8 +582,8 @@ class TreeRebuilder(RebuildVisitor): newnode = new.Module() self._set_infos(node, newnode, parent) newnode.doc = node.doc - newnode.body = [self.visit(child, newnode) for child in node.node.nodes] newnode.name = node.name + newnode.body = [self.visit(child, newnode) for child in node.node.nodes] return newnode def visit_name(self, node, parent): diff --git a/rebuilder.py b/rebuilder.py index 971d982e..483dffa5 100644 --- a/rebuilder.py +++ b/rebuilder.py @@ -30,6 +30,10 @@ from logilab.astng.infutils import YES, Instance def _check_children(node): """a helper function to check children - parent relations""" for child in node.get_children(): + ok = False + if child is None: + print "Hm, child of %s is None" % node + continue if not hasattr(child, 'parent'): print " ERROR: %s has child %s %x with no parent" % (node, child, id(child)) elif not child.parent: @@ -37,6 +41,12 @@ def _check_children(node): elif child.parent is not node: print " ERROR: %s %x has child %s %x with wrong parent %s" % (node, id(node), child, id(child), child.parent) + else: + ok = True + if not ok: + print "lines;", node.lineno, child.lineno + print "of module", node.root(), node.root().name + raise ASTNGBuildingException _check_children(child) @@ -47,8 +57,7 @@ class RebuildVisitor(ASTVisitor): self.asscontext = None self._metaclass = None self._global_names = None - self._delayed = dict((name, []) for name in ('class', 'function', - 'assattr', 'assign', 'decorators', 'from')) + self._delayed_assattr = [] self.set_line_info = (ast_mode == '_ast') self._ast_mode = (ast_mode == '_ast') self._assignments = [] @@ -95,25 +104,17 @@ class RebuildVisitor(ASTVisitor): """start the walk down the tree and do some work after it""" newnode = self.visit(node, None) _check_children(newnode) # FIXME : remove this asap - # handle delayed nodes; assattr has to be done at last since it needs - # some inference which is only possible once the node.locals set - for name, nodes in self._delayed.items(): - if name == 'assattr': - continue - delay_method = getattr(self, 'delayed_' + name) - for node in nodes: - delay_method(node) for assnode, name, root_local in self._assignments: if root_local: assnode.root().set_local(name, assnode) else: # _check_children(assnode) - # print assnode, id(assnode) if assnode.parent is not None: assnode.parent.set_local(name, assnode) + # handle delayed assattr nodes delay_assattr = self.delayed_assattr - for node in self._delayed['assattr']: + for node in self._delayed_assattr: delay_assattr(node) return newnode @@ -127,7 +128,8 @@ class RebuildVisitor(ASTVisitor): # visit_<node> and delayed_<node> methods ################################# - def delayed_assign(self, newnode): + def _set_assign_infos(self, newnode): + """set some function or metaclass infos""" # XXX right ? klass = newnode.parent.frame() if (isinstance(klass, nodes.Class) and isinstance(newnode.value, nodes.CallFunc) @@ -148,7 +150,6 @@ class RebuildVisitor(ASTVisitor): elif getattr(newnode.targets[0], 'name', None) == '__metaclass__': # XXX check more... self._metaclass[-1] = 'type' # XXX get the actual metaclass - return newnode def visit_class(self, node, parent): """visit a Class node to become astng""" @@ -160,12 +161,9 @@ class RebuildVisitor(ASTVisitor): # no base classes, detect new / style old style according to # current scope newnode._newstyle = metaclass == 'type' - self._delayed['class'].append(newnode) + newnode.parent.frame().set_local(newnode.name, newnode) return newnode - def delayed_class(self, node): - node.parent.frame().set_local(node.name, node) - def visit_const(self, node, parent): """visit a Const node by returning a fresh instance of it""" newnode = nodes.Const(node.value) @@ -185,17 +183,11 @@ class RebuildVisitor(ASTVisitor): newnode = self._visit_decorators(node, parent) newnode.parent = parent self._set_infos(node, newnode, parent) - self._delayed['decorators'].append(newnode) - return newnode - - def delayed_decorators(self, node): - """python >= 2.4 - visit a Decorator node -> check for classmethod and staticmethod - """ - for decorator_expr in node.nodes: + for decorator_expr in newnode.nodes: if isinstance(decorator_expr, nodes.Name) and \ decorator_expr.name in ('classmethod', 'staticmethod'): - node.parent.type = decorator_expr.name + newnode.parent.type = decorator_expr.name + return newnode def visit_ellipsis(self, node, parent): """visit an Ellipsis node by returning a fresh instance of it""" @@ -211,7 +203,7 @@ class RebuildVisitor(ASTVisitor): self._set_infos(node, newnode, parent) return newnode - def delayed_from(self, node): + def _add_from_names_to_locals(self, node): """visit an From node to become astng""" # add names imported by the import to locals for (name, asname) in node.names: @@ -229,12 +221,8 @@ class RebuildVisitor(ASTVisitor): """visit an Function node to become astng""" self._global_names.append({}) newnode = self._visit_function(node, parent) - self._delayed['function'].append(newnode) newnode.name = node.name self._global_names.pop() - return newnode - - def delayed_function(self, newnode): frame = newnode.parent.frame() if isinstance(frame, nodes.Class): if newnode.name == '__new__': @@ -242,6 +230,7 @@ class RebuildVisitor(ASTVisitor): else: newnode.type = 'method' frame.set_local(newnode.name, newnode) + return newnode def visit_global(self, node, parent): """visit an Global node to become astng""" |
