summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmile Anclin <emile.anclin@logilab.fr>2010-02-02 14:05:07 +0100
committerEmile Anclin <emile.anclin@logilab.fr>2010-02-02 14:05:07 +0100
commit1792b0ed5ab7149e97bb9fa25a9e566381a09227 (patch)
treef027153a015922ac5132d13fbca73aa50340a7d2
parenta38a3a5f8f85dcf07d482c204a3994bb7017eebd (diff)
downloadastroid-git-1792b0ed5ab7149e97bb9fa25a9e566381a09227.tar.gz
remove all unnecessary delayed methods
--HG-- branch : rebuild
-rw-r--r--_nodes_ast.py11
-rw-r--r--_nodes_compiler.py9
-rw-r--r--rebuilder.py53
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"""