diff options
author | Emile Anclin <emile.anclin@logilab.fr> | 2010-03-22 10:11:20 +0100 |
---|---|---|
committer | Emile Anclin <emile.anclin@logilab.fr> | 2010-03-22 10:11:20 +0100 |
commit | ec4ce3ab0dc8d3e48867ccdc3d928d2486d59599 (patch) | |
tree | 420bcb7588e9a4a983c81c52e725b9da8c50bebf | |
parent | 975cecee7a11c34da5cce5df05571566ac978bda (diff) | |
download | astroid-git-ec4ce3ab0dc8d3e48867ccdc3d928d2486d59599.tar.gz |
make pylint happier : mention node attributes
* mention node attributes in the classes to make pylint happier
* set doc and name for Class, Function and Module in the constructor
--HG--
branch : rebuild
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | _nodes_ast.py | 10 | ||||
-rw-r--r-- | _nodes_compiler.py | 10 | ||||
-rw-r--r-- | node_classes.py | 82 | ||||
-rw-r--r-- | raw_building.py | 19 | ||||
-rw-r--r-- | rebuilder.py | 4 | ||||
-rw-r--r-- | scoped_nodes.py | 23 |
7 files changed, 110 insertions, 42 deletions
@@ -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: |