summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--_nodes_ast.py10
-rw-r--r--_nodes_compiler.py10
-rw-r--r--node_classes.py82
-rw-r--r--raw_building.py19
-rw-r--r--rebuilder.py4
-rw-r--r--scoped_nodes.py23
7 files changed, 110 insertions, 42 deletions
diff --git a/ChangeLog b/ChangeLog
index 4118933d..9cac3d4e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,9 @@
Change log for the astng package
================================
---
+--
+
+2010-03-18 -- 0.20.0
* fix #19882: pylint hangs
* fix #20759: crash on pyreverse UNARY_OP_METHOD KeyError '~'
diff --git a/_nodes_ast.py b/_nodes_ast.py
index f877f073..cbb9f4c2 100644
--- a/_nodes_ast.py
+++ b/_nodes_ast.py
@@ -90,8 +90,11 @@ def _init_set_doc(node, newnode):
newnode.tolineno = node.body[0].lineno
newnode.doc = node.body[0].value.s
node.body = node.body[1:]
+
except IndexError:
pass # ast built from scratch
+
+
def native_repr_tree(node, indent='', _done=None):
if _done is None:
@@ -248,7 +251,7 @@ class TreeRebuilder(RebuildVisitor):
def _visit_class(self, node, parent):
"""visit a Class node by returning a fresh instance of it"""
- newnode = new.Class()
+ newnode = new.Class(node.name, None)
_lineno_parent(node, newnode, parent)
_init_set_doc(node, newnode)
newnode.bases = [self.visit(child, newnode) for child in node.bases]
@@ -373,7 +376,7 @@ class TreeRebuilder(RebuildVisitor):
def _visit_function(self, node, parent):
"""visit a Function node by returning a fresh instance of it"""
- newnode = new.Function()
+ newnode = new.Function(node.name, None)
_lineno_parent(node, newnode, parent)
_init_set_doc(node, newnode)
newnode.args = self.visit(node.args, newnode)
@@ -493,10 +496,9 @@ class TreeRebuilder(RebuildVisitor):
def visit_module(self, node, parent):
"""visit a Module node by returning a fresh instance of it"""
- newnode = new.Module()
+ newnode = new.Module(node.name, None)
_lineno_parent(node, newnode, parent)
_init_set_doc(node, newnode)
- newnode.name = node.name
newnode.body = [self.visit(child, newnode) for child in node.body]
newnode.set_line_info(newnode.last_child())
return newnode
diff --git a/_nodes_compiler.py b/_nodes_compiler.py
index c6d2a018..fd8fa5b2 100644
--- a/_nodes_compiler.py
+++ b/_nodes_compiler.py
@@ -319,11 +319,10 @@ class TreeRebuilder(RebuildVisitor):
def _visit_class(self, node, parent):
"""visit a Class node by returning a fresh instance of it"""
- newnode = new.Class()
+ newnode = new.Class(node.name, node.doc)
self._set_infos(node, newnode, parent)
newnode.bases = [self.visit(child, newnode) for child in node.bases]
newnode.body = [self.visit(child, newnode) for child in node.code.nodes]
- newnode.doc = node.doc
return newnode
def visit_compare(self, node, parent):
@@ -442,10 +441,9 @@ class TreeRebuilder(RebuildVisitor):
def _visit_function(self, node, parent):
"""visit a Function node by returning a fresh instance of it"""
- newnode = new.Function()
+ newnode = new.Function(node.name, node.doc)
self._set_infos(node, newnode, parent)
newnode.decorators = self.visit(node.decorators, newnode)
- newnode.doc = node.doc
newnode.args = self.visit_arguments(node, newnode)
newnode.body = [self.visit(child, newnode) for child in node.code.nodes]
return newnode
@@ -547,11 +545,9 @@ class TreeRebuilder(RebuildVisitor):
def visit_module(self, node, parent):
"""visit a Module node by returning a fresh instance of it"""
- newnode = new.Module()
+ newnode = new.Module(node.name, node.doc)
self._set_infos(node, newnode, parent)
self._remove_nodes = [] # list of ';' Discard nodes to be removed
- newnode.doc = node.doc
- newnode.name = node.name
newnode.body = [self.visit(child, newnode) for child in node.node.nodes]
for discard, d_parent in self._remove_nodes:
d_parent.child_sequence(discard).remove(discard)
diff --git a/node_classes.py b/node_classes.py
index 7c03cff2..a2b96c26 100644
--- a/node_classes.py
+++ b/node_classes.py
@@ -252,6 +252,8 @@ class Name(LookupMixIn, NodeNG):
class Arguments(NodeNG, AssignTypeMixin):
"""class representing an Arguments node"""
_astng_fields = ('args', 'defaults')
+ args = None
+ defaults = None
def __init__(self, vararg=None, kwarg=None):
self.vararg = vararg
@@ -329,37 +331,41 @@ def _format_args(args, defaults=None):
class AssAttr(NodeNG, ParentAssignTypeMixin):
"""class representing an AssAttr node"""
_astng_fields = ('expr',)
-
+ expr = None
class Assert(StmtMixIn, NodeNG):
"""class representing an Assert node"""
_astng_fields = ('test', 'fail',)
-
+ test = None
+ fail = None
class Assign(StmtMixIn, NodeNG, AssignTypeMixin):
"""class representing an Assign node"""
_astng_fields = ('targets', 'value',)
-
+ targets = None
+ value = None
class AugAssign(StmtMixIn, NodeNG, AssignTypeMixin):
"""class representing an AugAssign node"""
_astng_fields = ('target', 'value',)
-
+ target = None
+ value = None
class Backquote(NodeNG):
"""class representing a Backquote node"""
_astng_fields = ('value',)
-
+ value = None
class BinOp(NodeNG):
"""class representing a BinOp node"""
_astng_fields = ('left', 'right',)
-
+ left = None
+ right = None
class BoolOp(NodeNG):
"""class representing a BoolOp node"""
_astng_fields = ('values',)
-
+ values = None
class Break(StmtMixIn, NodeNG):
"""class representing a Break node"""
@@ -368,6 +374,10 @@ class Break(StmtMixIn, NodeNG):
class CallFunc(NodeNG):
"""class representing a CallFunc node"""
_astng_fields = ('func', 'args', 'starargs', 'kwargs')
+ func = None
+ args = None
+ starargs = None
+ kwargs = None
def __init__(self):
self.starargs = None
@@ -376,6 +386,8 @@ class CallFunc(NodeNG):
class Compare(NodeNG):
"""class representing a Compare node"""
_astng_fields = ('left', 'ops',)
+ left = None
+ ops = None
def get_children(self):
"""override get_children for tuple fields"""
@@ -392,6 +404,9 @@ class Compare(NodeNG):
class Comprehension(NodeNG):
"""class representing a Comprehension node"""
_astng_fields = ('target', 'iter' ,'ifs')
+ target = None
+ iter = None
+ ifs = None
def ass_type(self):
return self
@@ -437,6 +452,7 @@ class Continue(StmtMixIn, NodeNG):
class Decorators(NodeNG):
"""class representing a Decorators node"""
_astng_fields = ('nodes',)
+ nodes = None
def __init__(self, nodes=None):
self.nodes = nodes
@@ -448,16 +464,19 @@ class Decorators(NodeNG):
class DelAttr(NodeNG, ParentAssignTypeMixin):
"""class representing a DelAttr node"""
_astng_fields = ('expr',)
+ expr = None
class Delete(StmtMixIn, NodeNG, AssignTypeMixin):
"""class representing a Delete node"""
_astng_fields = ('targets',)
+ targets = None
class Dict(NodeNG, Instance):
"""class representing a Dict node"""
_astng_fields = ('items',)
+ items = None
def pytype(self):
return '__builtin__.dict'
@@ -491,6 +510,7 @@ class Dict(NodeNG, Instance):
class Discard(StmtMixIn, NodeNG):
"""class representing a Discard node"""
_astng_fields = ('value',)
+ value = None
class Ellipsis(NodeNG):
@@ -504,6 +524,9 @@ class EmptyNode(NodeNG):
class ExceptHandler(StmtMixIn, NodeNG, AssignTypeMixin):
"""class representing an ExceptHandler node"""
_astng_fields = ('type', 'name', 'body',)
+ type = None
+ name = None
+ body = None
def _blockstart_toline(self):
if self.name:
@@ -529,16 +552,24 @@ class ExceptHandler(StmtMixIn, NodeNG, AssignTypeMixin):
class Exec(StmtMixIn, NodeNG):
"""class representing an Exec node"""
_astng_fields = ('expr', 'globals', 'locals',)
+ expr = None
+ globals = None
+ locals = None
class ExtSlice(NodeNG):
"""class representing an ExtSlice node"""
_astng_fields = ('dims',)
+ dims = None
class For(BlockRangeMixIn, StmtMixIn, AssignTypeMixin, NodeNG):
"""class representing a For node"""
_astng_fields = ('target', 'iter', 'body', 'orelse',)
+ target = None
+ iter = None
+ body = None
+ orelse = None
def _blockstart_toline(self):
return self.iter.tolineno
@@ -555,6 +586,7 @@ class From(FromImportMixIn, StmtMixIn, NodeNG):
class Getattr(NodeNG):
"""class representing a Getattr node"""
_astng_fields = ('expr',)
+ expr = None
class Global(StmtMixIn, NodeNG):
@@ -570,6 +602,9 @@ class Global(StmtMixIn, NodeNG):
class If(BlockRangeMixIn, StmtMixIn, NodeNG):
"""class representing an If node"""
_astng_fields = ('test', 'body', 'orelse')
+ test = None
+ body = None
+ orelse = None
def _blockstart_toline(self):
return self.test.tolineno
@@ -587,6 +622,9 @@ class If(BlockRangeMixIn, StmtMixIn, NodeNG):
class IfExp(NodeNG):
"""class representing an IfExp node"""
_astng_fields = ('test', 'body', 'orelse')
+ test = None
+ body = None
+ orelse = None
class Import(FromImportMixIn, StmtMixIn, NodeNG):
@@ -596,16 +634,19 @@ class Import(FromImportMixIn, StmtMixIn, NodeNG):
class Index(NodeNG):
"""class representing an Index node"""
_astng_fields = ('value',)
+ value = None
class Keyword(NodeNG):
"""class representing a Keyword node"""
_astng_fields = ('value',)
+ value = None
class List(NodeNG, Instance, ParentAssignTypeMixin):
"""class representing a List node"""
_astng_fields = ('elts',)
+ elts = None
def pytype(self):
return '__builtin__.list'
@@ -621,6 +662,8 @@ class List(NodeNG, Instance, ParentAssignTypeMixin):
class ListComp(NodeNG):
"""class representing a ListComp node"""
_astng_fields = ('elt', 'generators')
+ elt = None
+ generators = None
class Pass(StmtMixIn, NodeNG):
@@ -630,31 +673,45 @@ class Pass(StmtMixIn, NodeNG):
class Print(StmtMixIn, NodeNG):
"""class representing a Print node"""
_astng_fields = ('dest', 'values',)
+ dest = None
+ values = None
class Raise(StmtMixIn, NodeNG):
"""class representing a Raise node"""
_astng_fields = ('type', 'inst', 'tback')
+ type = None
+ inst = None
+ tback = None
class Return(StmtMixIn, NodeNG):
"""class representing a Return node"""
_astng_fields = ('value',)
+ value = None
class Slice(NodeNG):
"""class representing a Slice node"""
_astng_fields = ('lower', 'upper', 'step')
+ lower = None
+ upper = None
+ step = None
class Subscript(NodeNG):
"""class representing a Subscript node"""
_astng_fields = ('value', 'slice')
+ value = None
+ slice = None
class TryExcept(BlockRangeMixIn, StmtMixIn, NodeNG):
"""class representing a TryExcept node"""
_astng_fields = ('body', 'handlers', 'orelse',)
+ body = None
+ handlers = None
+ orelse = None
def _infer_name(self, frame, name):
return name
@@ -678,6 +735,8 @@ class TryExcept(BlockRangeMixIn, StmtMixIn, NodeNG):
class TryFinally(BlockRangeMixIn, StmtMixIn, NodeNG):
"""class representing a TryFinally node"""
_astng_fields = ('body', 'finalbody',)
+ body = None
+ finalbody = None
def _blockstart_toline(self):
return self.lineno
@@ -695,6 +754,7 @@ class TryFinally(BlockRangeMixIn, StmtMixIn, NodeNG):
class Tuple(NodeNG, Instance, ParentAssignTypeMixin):
"""class representing a Tuple node"""
_astng_fields = ('elts',)
+ elts = None
def pytype(self):
return '__builtin__.tuple'
@@ -709,11 +769,15 @@ class Tuple(NodeNG, Instance, ParentAssignTypeMixin):
class UnaryOp(NodeNG):
"""class representing an UnaryOp node"""
_astng_fields = ('operand',)
+ operand = None
class While(BlockRangeMixIn, StmtMixIn, NodeNG):
"""class representing a While node"""
_astng_fields = ('test', 'body', 'orelse',)
+ test = None
+ body = None
+ orelse = None
def _blockstart_toline(self):
return self.test.tolineno
@@ -725,6 +789,9 @@ class While(BlockRangeMixIn, StmtMixIn, NodeNG):
class With(BlockRangeMixIn, StmtMixIn, AssignTypeMixin, NodeNG):
"""class representing a With node"""
_astng_fields = ('expr', 'vars', 'body')
+ expr = None
+ vars = None
+ body = None
def _blockstart_toline(self):
if self.vars:
@@ -736,6 +803,7 @@ class With(BlockRangeMixIn, StmtMixIn, AssignTypeMixin, NodeNG):
class Yield(NodeNG):
"""class representing a Yield node"""
_astng_fields = ('value',)
+ value = None
# constants ##############################################################
diff --git a/raw_building.py b/raw_building.py
index 31de2fc6..fc3132ad 100644
--- a/raw_building.py
+++ b/raw_building.py
@@ -61,9 +61,7 @@ def attach_import_node(node, modname, membername):
def build_module(name, doc=None):
"""create and initialize a astng Module node"""
- node = nodes.Module()
- node.doc = doc
- node.name = name
+ node = nodes.Module(name, doc)
node.pure_python = False
node.package = False
node.parent = None
@@ -71,28 +69,19 @@ def build_module(name, doc=None):
def build_class(name, basenames=(), doc=None):
"""create and initialize a astng Class node"""
- node = nodes.Class()
- node.body = []
- node.name = name
- node.bases = []
+ node = nodes.Class(name, doc)
for base in basenames:
basenode = nodes.Name()
basenode.name = base
node.bases.append(basenode)
basenode.parent = node
- node.doc = doc
- node.locals = {}
- node.instance_attrs = {}
return node
def build_function(name, args=None, defaults=None, flag=0, doc=None):
"""create and initialize a astng Function node"""
args, defaults = args or [], defaults or []
# first argument is now a list of decorators
- func = nodes.Function()
- func.decorators = None
- func.body = []
- func.name = name
+ func = nodes.Function(name, doc)
func.args = argsnode = nodes.Arguments()
argsnode.args = []
for arg in args:
@@ -106,8 +95,6 @@ def build_function(name, args=None, defaults=None, flag=0, doc=None):
argsnode.kwarg = None
argsnode.vararg = None
argsnode.parent = func
- func.doc = doc
- func.locals = {}
if args:
register_arguments(func)
return func
diff --git a/rebuilder.py b/rebuilder.py
index 14f2a996..90b31b6b 100644
--- a/rebuilder.py
+++ b/rebuilder.py
@@ -101,7 +101,6 @@ class RebuildVisitor(object):
"""visit a Class node to become astng"""
self._metaclass.append(self._metaclass[-1])
newnode = self._visit_class(node, parent)
- newnode.name = node.name
metaclass = self._metaclass.pop()
if not newnode.bases:
# no base classes, detect new / style old style according to
@@ -142,7 +141,7 @@ class RebuildVisitor(object):
def _store_from_node(self, node):
"""handle From names by adding them to locals now or after"""
- # we can not call handle wildcard imports if the source module is not
+ # we can not handle wildcard imports if the source module is not
# in the cache since 'import_module' calls the MANAGER and we will
# end up with infinite recursions working with unfinished trees
if node.modname in self._manager._cache:
@@ -175,7 +174,6 @@ class RebuildVisitor(object):
"""visit an Function node to become astng"""
self._global_names.append({})
newnode = self._visit_function(node, parent)
- newnode.name = node.name
self._global_names.pop()
frame = newnode.parent.frame()
if isinstance(frame, nodes.Class):
diff --git a/scoped_nodes.py b/scoped_nodes.py
index 6d2852fa..4af2b95f 100644
--- a/scoped_nodes.py
+++ b/scoped_nodes.py
@@ -239,8 +239,10 @@ class Module(LocalsDictNodeNG):
# names of module attributes available through the global scope
scope_attrs = set(('__name__', '__doc__', '__file__', '__path__'))
- def __init__(self, body=None):
- self.body = body or []
+ def __init__(self, name, doc):
+ self.body = []
+ self.name = name
+ self.doc = doc
self.locals = self.globals = {}
# Module is not a Statement node but needs the replace method (see StmtMixIn)
@@ -403,6 +405,8 @@ class GenExpr(LocalsDictNodeNG):
def __init__(self):
self.locals = {}
+ self.elt = None
+ self.generators = []
def frame(self):
return self.parent.frame()
@@ -420,6 +424,8 @@ class Lambda(LocalsDictNodeNG, FilterStmtsMixin):
def __init__(self):
self.locals = {}
+ self.args = []
+ self.body = []
def pytype(self):
if 'method' in self.type:
@@ -469,8 +475,13 @@ class Function(StmtMixIn, Lambda):
blockstart_tolineno = None
- def __init__(self):
+ def __init__(self, name, doc):
self.locals = {}
+ self.args = []
+ self.body = []
+ self.decorators = None
+ self.name = name
+ self.doc = doc
def set_line_info(self, lastchild):
self.fromlineno = self.lineno
@@ -642,9 +653,13 @@ class Class(StmtMixIn, LocalsDictNodeNG, FilterStmtsMixin):
doc="class'type, possible values are 'class' | "
"'metaclass' | 'interface' | 'exception'")
- def __init__(self):
+ def __init__(self, name, doc):
self.instance_attrs = {}
self.locals = {}
+ self.bases = []
+ self.body = []
+ self.name = name
+ self.doc = doc
def _newstyle_impl(self, context=None):
if context is None: