diff options
| author | Emile Anclin <emile.anclin@logilab.fr> | 2009-12-01 10:26:11 +0100 |
|---|---|---|
| committer | Emile Anclin <emile.anclin@logilab.fr> | 2009-12-01 10:26:11 +0100 |
| commit | 1e96ea4167cef70ea1c1f0ca936b6c50de1fd7d0 (patch) | |
| tree | 68c3be133f63ba0f526a2372757f6b443df3453a | |
| parent | 93e06a3679c6c961239431c667eee60d04c8fa32 (diff) | |
| download | astroid-git-1e96ea4167cef70ea1c1f0ca936b6c50de1fd7d0.tar.gz | |
a sketch of the new Rebuilders including '# XXX old code'
--HG--
branch : rebuild
| -rw-r--r-- | _nodes_ast.py | 428 | ||||
| -rw-r--r-- | _nodes_compiler.py | 559 |
2 files changed, 810 insertions, 177 deletions
diff --git a/_nodes_ast.py b/_nodes_ast.py index 7cafee4f..1ad14be3 100644 --- a/_nodes_ast.py +++ b/_nodes_ast.py @@ -76,7 +76,7 @@ from _ast import ( ) from logilab.astng.utils import ASTVisitor -import logilab.astng.nodes as new +from logilab.astng import nodes as new _BIN_OP_CLASSES = {_Add: '+', _BitAnd: '&', @@ -160,110 +160,436 @@ def native_repr_tree(node, indent='', _done=None): print indent + f, repr(attr) -_Num.accept = lambda self, visitor: visitor.visit_num(self) -_Str.accept = lambda self, visitor: visitor.visit_str(self) - - +from logilab.astng.rebuilder import RebuildVisitor # _ast rebuilder ############################################################## -class TreeRebuilder(ASTVisitor): +class TreeRebuilder(RebuildVisitor): """Rebuilds the _ast tree to become an ASTNG tree""" - def __init__(self, rebuild_visitor): - self.visitor = rebuild_visitor + def visit_arguments(self, node): + """visit a Arguments node by returning a fresh instance of it""" + newnode = new.Arguments() + newnode.args = [self.visit(child, node) for child in node.args] + newnode.defaults = [self.visit(child, node) for child in node.defaults] + return newnode + + def visit_assattr(self, node): + """visit a AssAttr node by returning a fresh instance of it""" + newnode = new.AssAttr() + newnode.expr = self.visit(node.expr, node) + return newnode + + def visit_assname(self, node): + """visit a AssName node by returning a fresh instance of it""" + newnode = new.AssName() + return newnode def visit_assert(self, node): - node.fail = node.msg - del node.msg + """visit a Assert node by returning a fresh instance of it""" + newnode = new.Assert() + newnode.test = self.visit(node.test, node) + newnode.fail = self.visit(node.msg, node) + return newnode + + def visit_assign(self, node): + """visit a Assign node by returning a fresh instance of it""" + newnode = new.Assign() + newnode.targets = [self.visit(child, node) for child in node.targets] + newnode.value = self.visit(node.value, node) + return newnode def visit_augassign(self, node): - node.op = _BIN_OP_CLASSES[node.op.__class__] + """visit a AugAssign node by returning a fresh instance of it""" + newnode = new.AugAssign() + newnode.target = self.visit(node.target, node) + newnode.value = self.visit(node.value, node) + return newnode + + def visit_backquote(self, node): + """visit a Backquote node by returning a fresh instance of it""" + newnode = new.Backquote() + newnode.value = self.visit(node.value, node) + return newnode def visit_binop(self, node): - node.op = _BIN_OP_CLASSES[node.op.__class__] + """visit a BinOp node by returning a fresh instance of it""" + newnode = new.BinOp() + newnode.left = self.visit(node.left, node) + newnode.right = self.visit(node.right, node) + newnode.op = _BIN_OP_CLASSES[node.op.__class__] + return newnode def visit_boolop(self, node): - node.op = _BOOL_OP_CLASSES[node.op.__class__] + """visit a BoolOp node by returning a fresh instance of it""" + newnode = new.BoolOp() + newnode.values = [self.visit(child, node) for child in node.values] + newnode.op = _BOOL_OP_CLASSES[node.op.__class__] + return newnode + + def visit_break(self, node): + """visit a Break node by returning a fresh instance of it""" + newnode = new.Break() + return newnode def visit_callfunc(self, node): + """visit a CallFunc node by returning a fresh instance of it""" + newnode = new.CallFunc() + newnode.func = self.visit(node.func, node) + newnode.args = [self.visit(child, node) for child in node.args] + newnode.starargs = [self.visit(child, node) for child in node.starargs] + newnode.kwargs = [self.visit(child, node) for child in node.kwargs] + # XXX old code node.args.extend(node.keywords) del node.keywords + # end old return newnode def visit_class(self, node): - _init_set_doc(node) + """visit a Class node by returning a fresh instance of it""" + newnode = new.Class() + _init_set_doc(node, newnode) + newnode.bases = [self.visit(child, node) for child in node.bases] + newnode.body = [self.visit(child, node) for child in node.body] + return newnode def visit_compare(self, node): - node.ops = [(_CMP_OP_CLASSES[op.__class__], expr) - for op, expr in zip(node.ops, node.comparators)] + """visit a Compare node by returning a fresh instance of it""" + newnode = new.Compare() + newnode.left = self.visit(node.left, node) + newnode.ops = [self.visit(child, node) for child in node.ops] + # XXX old code + node.ops = [(_CMP_OP_CLASSES[op.__class__], expr) + for (op, expr) in zip(node.ops, node.comparators)] del node.comparators + # end old + return newnode + + def visit_comprehension(self, node): + """visit a Comprehension node by returning a fresh instance of it""" + newnode = new.Comprehension() + newnode.target = self.visit(node.target, node) + newnode.iter = self.visit(node.iter, node) + newnode.ifs = [self.visit(child, node) for child in node.ifs] + return newnode + + def visit_const(self, node): + """visit a Const node by returning a fresh instance of it""" + newnode = new.Const() + return newnode + + def visit_continue(self, node): + """visit a Continue node by returning a fresh instance of it""" + newnode = new.Continue() + return newnode + + def visit_decorators(self, node): + """visit a Decorators node by returning a fresh instance of it""" + newnode = new.Decorators() + newnode.nodes = [self.visit(child, node) for child in node.nodes] + return newnode + + def visit_delattr(self, node): + """visit a DelAttr node by returning a fresh instance of it""" + newnode = new.DelAttr() + newnode.expr = self.visit(node.expr, node) + return newnode + + def visit_delname(self, node): + """visit a DelName node by returning a fresh instance of it""" + newnode = new.DelName() + return newnode + + def visit_delete(self, node): + """visit a Delete node by returning a fresh instance of it""" + newnode = new.Delete() + newnode.targets = [self.visit(child, node) for child in node.targets] + return newnode def visit_dict(self, node): - node.items = zip(node.keys, node.values) - del node.keys, node.values + """visit a Dict node by returning a fresh instance of it""" + newnode = new.Dict() + newnode.items = [(self.visit(key, node),self.visit(value, node)) + for key, value in zip(node.keys, node.values)] + return newnode + + def visit_discard(self, node): + """visit a Discard node by returning a fresh instance of it""" + if isinstance(node.value, _ast.Yield): + return self.visit(node.value, node) + newnode = new.Discard() + newnode.value = self.visit(node.value, node) + return newnode + + def visit_ellipsis(self, node): + """visit an Ellipsis node by returning a fresh instance of it""" + newnode = new.Ellipsis() + return newnode + + def visit_emptynode(self, node): + """visit an EmptyNode node by returning a fresh instance of it""" + newnode = new.EmptyNode() + return newnode + + def visit_excepthandler(self, node): + """visit an ExceptHandler node by returning a fresh instance of it""" + newnode = new.ExceptHandler() + newnode.type = self.visit(node.type, node) + newnode.name = self.visit(node.name, node) + newnode.body = [self.visit(child, node) for child in node.body] + return newnode def visit_exec(self, node): - node.expr = node.body - del node.body + """visit an Exec node by returning a fresh instance of it""" + newnode = new.Exec() + newnode.expr = self.visit(node.body, node) + newnode.globals = [self.visit(child, node) for child in node.globals] + newnode.locals = [self.visit(child, node) for child in node.locals] + return newnode + + def visit_extslice(self, node): + """visit an ExtSlice node by returning a fresh instance of it""" + newnode = new.ExtSlice() + newnode.dims = self.visit(node.dims, node) + return newnode + + def visit_for(self, node): + """visit a For node by returning a fresh instance of it""" + newnode = new.For() + newnode.target = self.visit(node.target, node) + newnode.iter = self.visit(node.iter, node) + newnode.body = [self.visit(child, node) for child in node.body] + newnode.orelse = self.visit(node.orelse, node) + return newnode + + def visit_from(self, node): + """visit a From node by returning a fresh instance of it""" + names = [(alias.name, alias.asname) for alias in node.names] + newnode = new.From(node.module, names) + return newnode def visit_function(self, node): - _init_set_doc(node) + """visit a Function node by returning a fresh instance of it""" + newnode = new.Function() + _init_set_doc(node, newnode) + newnode.args = [self.visit(child, node) for child in node.args] + newnode.body = [self.visit(child, node) for child in node.body] if 'decorators' in node._fields: # py < 2.6 attr = 'decorators' else: attr = 'decorator_list' decorators = getattr(node, attr) - delattr(node, attr) if decorators: - node.decorators = new.Decorators(decorators) + newnode.decorators = Decorators(decorators) else: - node.decorators = None + newnode.decorators = None + return newnode + + def visit_genexpr(self, node): + """visit a GenExpr node by returning a fresh instance of it""" + newnode = new.GenExpr() + newnode.elt = self.visit(node.elt, node) + newnode.generators = [self.visit(child, node) for child in node.generators] + return newnode def visit_getattr(self, node): + """visit a Getattr node by returning a fresh instance of it""" + newnode = new.Getattr() + newnode.expr = self.visit(node.expr, node) + # XXX old code node.attrname = node.attr node.expr = node.value del node.attr, node.value - if isinstance(self.visitor.asscontext, Delete): - node.__class__ = new.DelAttr - elif self.visitor.asscontext is not None: - node.__class__ = new.AssAttr + if isinstance(self.asscontext, Delete): + node.__class__ = DelAttr + else: + if self.asscontext is not None: + node.__class__ = AssAttr + # end old + return newnode + + def visit_global(self, node): + """visit a Global node by returning a fresh instance of it""" + newnode = new.Global() + # XXX newnode.globals/targets = ... + return newnode + + def visit_if(self, node): + """visit a If node by returning a fresh instance of it""" + newnode = new.If() + newnode.test = self.visit(node.test, node) + newnode.body = [self.visit(child, node) for child in node.body] + newnode.orelse = self.visit(node.orelse, node) + return newnode + + def visit_ifexp(self, node): + """visit a IfExp node by returning a fresh instance of it""" + newnode = new.IfExp() + newnode.test = self.visit(node.test, node) + newnode.body = [self.visit(child, node) for child in node.body] + newnode.orelse = self.visit(node.orelse, node) + return newnode def visit_import(self, node): - node.names = [(alias.name, alias.asname) for alias in node.names] + """visit a Import node by returning a fresh instance of it""" + newnode = new.Import() + newnode.names = [(alias.name, alias.asname) for alias in node.names] + return newnode - def visit_from(self, node): - node.names = [(alias.name, alias.asname) for alias in node.names] - node.modname = node.module - del node.module + def visit_index(self, node): + """visit a Index node by returning a fresh instance of it""" + newnode = new.Index() + newnode.value = self.visit(node.value, node) + return newnode + + def visit_keyword(self, node): + """visit a Keyword node by returning a fresh instance of it""" + newnode = new.Keyword() + newnode.value = self.visit(node.value, node) + return newnode + + def visit_lambda(self, node): + """visit a Lambda node by returning a fresh instance of it""" + newnode = new.Lambda() + newnode.args = [self.visit(child, node) for child in node.args] + newnode.body = [self.visit(child, node) for child in node.body] + return newnode + + def visit_list(self, node): + """visit a List node by returning a fresh instance of it""" + newnode = new.List() + newnode.elts = [self.visit(child, node) for child in node.elts] + return newnode + + def visit_listcomp(self, node): + """visit a ListComp node by returning a fresh instance of it""" + newnode = new.ListComp() + newnode.elt = self.visit(node.elt, node) + newnode.generators = [self.visit(child, node) + for child in node.generators] + return newnode def visit_module(self, node): - _init_set_doc(node) + """visit a Module node by returning a fresh instance of it""" + print "build new Module" + newnode = new.Module() + _init_set_doc(node, newnode) + newnode.body = [self.visit(child, node) for child in node.body] + return newnode def visit_name(self, node): - node.name = node.id - del node.id - if isinstance(self.visitor.asscontext, Delete): - node.__class__ = new.DelName - elif self.visitor.asscontext is not None: - node.__class__ = new.AssName + """visit a Name node by returning a fresh instance of it""" + newnode = new.Name() + newnode.name = node.id + # XXX old code + if isinstance(self.asscontext, Delete): + node.__class__ = DelName + else: + if self.asscontext is not None: + node.__class__ = AssName + # end old + return newnode def visit_num(self, node): - node.__class__ = new.Const - node.value = node.n - del node.n + """visit a a Num node by returning a fresh instance of Const""" + newnode = new.Const() + newnode.value = node.n + return newnode def visit_str(self, node): - node.__class__ = new.Const - node.value = node.s - del node.s + """visit a a Str node by returning a fresh instance of Const""" + newnode = new.Const() + newnode.value = node.s + return newnode + + def visit_pass(self, node): + """visit a Pass node by returning a fresh instance of it""" + newnode = new.Pass() + return newnode + + def visit_print(self, node): + """visit a Print node by returning a fresh instance of it""" + newnode = new.Print() + newnode.dest = self.visit(node.dest, node) + newnode.values = [self.visit(child, node) for child in node.values] + return newnode + + def visit_raise(self, node): + """visit a Raise node by returning a fresh instance of it""" + newnode = new.Raise() + newnode.type = self.visit(node.type, node) + newnode.inst = self.visit(node.inst, node) + newnode.tback = self.visit(node.tback, node) + return newnode + + def visit_return(self, node): + """visit a Return node by returning a fresh instance of it""" + newnode = new.Return() + newnode.value = self.visit(node.value, node) + return newnode + + def visit_slice(self, node): + """visit a Slice node by returning a fresh instance of it""" + newnode = new.Slice() + newnode.lower = self.visit(node.lower, node) + newnode.upper = self.visit(node.upper, node) + newnode.step = self.visit(node.step, node) + return newnode + + def visit_subscript(self, node): + """visit a Subscript node by returning a fresh instance of it""" + newnode = new.Subscript() + newnode.value = self.visit(node.value, node) + newnode.slice = self.visit(node.slice, node) + return newnode + + def visit_tryexcept(self, node): + """visit a TryExcept node by returning a fresh instance of it""" + newnode = new.TryExcept() + newnode.body = [self.visit(child, node) for child in node.body] + newnode.handlers = [self.visit(child, node) for child in node.handlers] + newnode.orelse = self.visit(node.orelse, node) + return newnode + + def visit_tryfinally(self, node): + """visit a TryFinally node by returning a fresh instance of it""" + newnode = new.TryFinally() + newnode.body = [self.visit(child, node) for child in node.body] + newnode.finalbody = self.visit(node.finalbody, node) + return newnode + + def visit_tuple(self, node): + """visit a Tuple node by returning a fresh instance of it""" + newnode = new.Tuple() + newnode.elts = [self.visit(child, node) for child in node.elts] + return newnode def visit_unaryop(self, node): - node.op = _UNARY_OP_CLASSES[node.op.__class__] + """visit a UnaryOp node by returning a fresh instance of it""" + newnode = new.UnaryOp() + newnode.operand = self.visit(node.operand, node) + newnode.op = _UNARY_OP_CLASSES[node.op.__class__] + return newnode + + def visit_while(self, node): + """visit a While node by returning a fresh instance of it""" + newnode = new.While() + newnode.test = self.visit(node.test, node) + newnode.body = [self.visit(child, node) for child in node.body] + newnode.orelse = self.visit(node.orelse, node) + return newnode def visit_with(self, node): - """build compiler like node """ - node.vars = node.optional_vars - node.expr = node.context_expr - del node.optional_vars, node.context_expr + """visit a With node by returning a fresh instance of it""" + newnode = new.With() + newnode.expr = self.visit(node.context_expr, node) + newnode.vars = self.visit(node.optional_vars, node) + newnode.body = [self.visit(child, node) for child in node.body] + return newnode + def visit_yield(self, node): + """visit a Yield node by returning a fresh instance of it""" + newnode = new.Yield() + newnode.value = self.visit(node.value, node) + # removing discard parent handled in visit_discard + return newnode diff --git a/_nodes_compiler.py b/_nodes_compiler.py index f43433c8..07e0049f 100644 --- a/_nodes_compiler.py +++ b/_nodes_compiler.py @@ -51,25 +51,12 @@ from compiler.ast import AssList as _AssList, AssTuple as _AssTuple,\ from logilab.astng.utils import ASTVisitor from logilab.astng._exceptions import NodeRemoved, ASTNGError +import logilab.astng.nodes as new +from logilab.astng.rebuilder import RebuildVisitor -# set missing accept methods -_AssList.accept = lambda self, visitor: visitor.visit_asslist(self) -_AssTuple.accept = lambda self, visitor: visitor.visit_asstuple(self) -_Printnl.accept = lambda self, visitor: visitor.visit_printnl(self) -_Slice.accept = lambda self, visitor: visitor.visit_slice(self) -_GenExprFor.accept = lambda self, visitor: visitor.visit_comprehension(self) -for boolopcls in (_And, _Or): - boolopcls.accept = lambda self, visitor: visitor.visit_boolop(self) -for unaryopcls in (_UnaryAdd, _UnarySub, _Not,_Invert): - unaryopcls.accept = lambda self, visitor: visitor.visit_unaryop(self) -for binopcls in (_Add, _Div, _FloorDiv, _Mod, _Mul, _Power, _Sub, _Bitand, - _Bitor, _Bitxor, _LeftShift, _RightShift): - binopcls.accept = lambda self, visitor: visitor.visit_binop(self) class BaseClass: pass -import logilab.astng.nodes as new - # introduced in python 2.5 From.level = 0 # will be overridden by instance attribute with py>=2.5 @@ -235,12 +222,9 @@ def _filter_none(node): else: return node -class TreeRebuilder(ASTVisitor): - """Rebuilds the compiler tree to become an ASTNG tree""" - - def __init__(self, rebuild_visitor): - self.visitor = rebuild_visitor +class TreeRebuilder(RebuildVisitor): + """Rebuilds the compiler tree to become an ASTNG tree""" def insert_delstmt_if_necessary(self, node): """insert a Delete statement node if necessary @@ -263,101 +247,219 @@ class TreeRebuilder(ASTVisitor): stmt.tolineno = node.tolineno node.parent = stmt stmt.targets = [node] - self.visitor.asscontext = stmt + self.asscontext = stmt return stmt is node - # scoped nodes ####################################################### - - def visit_function(self, node): - # remove Stmt node - node.body = node.code.nodes - del node.code - args_compiler_to_ast(node) - - def visit_lambda(self, node): - node.body = node.code - del node.code - args_compiler_to_ast(node) - - def visit_class(self, node): - # remove Stmt node - node.body = node.code.nodes - del node.code - - def visit_module(self, node): - # remove Stmt node - node.body = node.node.nodes - del node.node - return True - - # other visit_<node> ##################################################### + def visit_arguments(self, node): + """visit an Arguments node by returning a fresh instance of it""" + newnode = new.Arguments() + newnode.args = [self.visit(child, node) for child in node.args] + newnode.defaults = [self.visit(child, node) for child in node.defaults] + return newnode def visit_assattr(self, node): + """visit an AssAttr node by returning a fresh instance of it""" + newnode = new.AssAttr() + newnode.expr = self.visit(node.expr, node) + # XXX old code if node.flags == 'OP_DELETE': self.insert_delstmt_if_necessary(node) - node.__class__ = new.DelAttr + node.__class__ = DelAttr del node.flags - - def visit_assign(self, node): - node.value = node.expr - node.targets = node.nodes - del node.nodes, node.expr - - def visit_asslist(self, node): - self.insert_delstmt_if_necessary(node) - node.__class__ = new.List - self.visit_list(node) - - def visit_asstuple(self, node): - if not self.insert_delstmt_if_necessary(node): - node.__class__ = new.Tuple - self.visit_tuple(node) + # end old + return newnode def visit_assname(self, node): + """visit an AssName node by returning a fresh instance of it""" + newnode = new.AssName() + # XXX old code if node.flags == 'OP_DELETE': self.insert_delstmt_if_necessary(node) - node.__class__ = new.DelName + node.__class__ = DelName del node.flags + # end old + return newnode + + def visit_assert(self, node): + """visit an Assert node by returning a fresh instance of it""" + newnode = new.Assert() + newnode.test = self.visit(node.test, node) + newnode.fail = self.visit(node.fail, node) + return newnode + + def visit_assign(self, node): + """visit an Assign node by returning a fresh instance of it""" + newnode = new.Assign() + newnode.targets = [self.visit(child, node) for child in node.targets] + newnode.value = self.visit(node.value, node) + # XXX old code + node.value = node.expr + node.targets = node.nodes + del node.nodes, node.expr + # end old + return newnode def visit_augassign(self, node): + """visit an AugAssign node by returning a fresh instance of it""" + newnode = new.AugAssign() + newnode.target = self.visit(node.target, node) + newnode.value = self.visit(node.value, node) + # XXX old code node.value = node.expr del node.expr node.target = node.node del node.node + # end old + return newnode + - def visit_backquote(self, node): + def visit_backquote(self, node): + """visit a Backquote node by returning a fresh instance of it""" + newnode = new.Backquote() + newnode.value = self.visit(node.value, node) + # XXX old code node.value = node.expr del node.expr + # end old + return newnode def visit_binop(self, node): - node.op = BinOp_OP_CLASSES[node.__class__] - node.__class__ = new.BinOp # XXX just instanciate the node + """visit a BinOp node by returning a fresh instance of it""" + newnode = new.BinOp() + newnode.left = self.visit(node.left, node) + newnode.right = self.visit(node.right, node) + # XXX old code + node.op = BinOp.OP_CLASSES[node.__class__] + node.__class__ = BinOp if node.op in ('&', '|', '^'): node.right = node.nodes[-1] - bitop = BinOp_BIT_CLASSES[node.op] + bitop = BinOp.BIT_CLASSES[node.op] if len(node.nodes) > 2: node.left = bitop(node.nodes[:-1]) else: node.left = node.nodes[0] del node.nodes + # end old + return newnode def visit_boolop(self, node): - node.op = BoolOp_OP_CLASSES[node.__class__] - node.__class__ = new.BoolOp # XXX just instanciate the node + """visit a BoolOp node by returning a fresh instance of it""" + newnode = new.BoolOp() + newnode.values = [self.visit(child, node) for child in node.values] + # XXX old code + node.op = BoolOp.OP_CLASSES[node.__class__] + node.__class__ = BoolOp node.values = node.nodes del node.nodes + # end old + return newnode + + def visit_break(self, node): + """visit a Break node by returning a fresh instance of it""" + newnode = new.Break() + return newnode def visit_callfunc(self, node): + """visit a CallFunc node by returning a fresh instance of it""" + newnode = new.CallFunc() + newnode.func = self.visit(node.func, node) + newnode.args = [self.visit(child, node) for child in node.args] + newnode.starargs = [self.visit(child, node) for child in node.starargs] + newnode.kwargs = [self.visit(child, node) for child in node.kwargs] + # XXX old code node.func = node.node node.starargs = node.star_args node.kwargs = node.dstar_args del node.node, node.star_args, node.dstar_args + # end old + return newnode + + def visit_class(self, node): + """visit a Class node by returning a fresh instance of it""" + newnode = new.Class() + newnode.bases = [self.visit(child, node) for child in node.bases] + newnode.body = [self.visit(child, node) for child in node.body] + # XXX old code + node.body = node.code.nodes + del node.code + # end old + return newnode def visit_compare(self, node): + """visit a Compare node by returning a fresh instance of it""" + newnode = new.Compare() + newnode.left = self.visit(node.left, node) + newnode.ops = [self.visit(child, node) for child in node.ops] + # XXX old code node.left = node.expr del node.expr + # end old + return newnode + + def visit_comprehension(self, node): + """visit a Comprehension node by returning a fresh instance of it""" + newnode = new.Comprehension() + newnode.target = self.visit(node.target, node) + newnode.iter = self.visit(node.iter, node) + newnode.ifs = [self.visit(child, node) for child in node.ifs] + # XXX old code + if hasattr(node, 'list'): + # ListCompFor + node.iter = node.list + del node.list + else: # GenExprFor + node.__class__ = Comprehension + node.target = node.assign + if node.ifs: + node.ifs = [iff.test for iff in node.ifs] + del node.assign + # end old + return newnode + + def visit_const(self, node): + """visit a Const node by returning a fresh instance of it""" + newnode = new.Const() + return newnode + + def visit_continue(self, node): + """visit a Continue node by returning a fresh instance of it""" + newnode = new.Continue() + return newnode + + def visit_decorators(self, node): + """visit a Decorators node by returning a fresh instance of it""" + newnode = new.Decorators() + newnode.nodes = [self.visit(child, node) for child in node.nodes] + return newnode + + def visit_delattr(self, node): + """visit a DelAttr node by returning a fresh instance of it""" + newnode = new.DelAttr() + newnode.expr = self.visit(node.expr, node) + return newnode + + def visit_delname(self, node): + """visit a DelName node by returning a fresh instance of it""" + newnode = new.DelName() + return newnode + + def visit_delete(self, node): + """visit a Delete node by returning a fresh instance of it""" + newnode = new.Delete() + newnode.targets = [self.visit(child, node) for child in node.targets] + return newnode + + def visit_dict(self, node): + """visit a Dict node by returning a fresh instance of it""" + newnode = new.Dict() + newnode.items = [self.visit(child, node) for child in node.items] + return newnode def visit_discard(self, node): + """visit a Discard node by returning a fresh instance of it""" + newnode = new.Discard() + newnode.value = self.visit(node.value, node) + # XXX old code node.value = node.expr del node.expr if node.lineno is None: @@ -365,36 +467,123 @@ class TreeRebuilder(ASTVisitor): # is ended by a semi-colon node.parent.child_sequence(node).remove(node) raise NodeRemoved + # end old + return newnode + + def visit_ellipsis(self, node): + """visit an Ellipsis node by returning a fresh instance of it""" + newnode = new.Ellipsis() + return newnode + + def visit_emptynode(self, node): + """visit an EmptyNode node by returning a fresh instance of it""" + newnode = new.EmptyNode() + return newnode + + def visit_excepthandler(self, node): + """visit an ExceptHandler node by returning a fresh instance of it""" + newnode = new.ExceptHandler() + newnode.type = self.visit(node.type, node) + newnode.name = self.visit(node.name, node) + newnode.body = [self.visit(child, node) for child in node.body] + return newnode def visit_exec(self, node): - node.locals, node.globals = node.globals, node.locals + """visit an Exec node by returning a fresh instance of it""" + newnode = new.Exec() + newnode.expr = self.visit(node.expr, node) + newnode.globals = [self.visit(child, node) for child in node.globals] + newnode.locals = [self.visit(child, node) for child in node.locals] + # XXX old code + (node.locals, node.globals) = (node.globals, node.locals) + # end old + return newnode + + def visit_extslice(self, node): + """visit an ExtSlice node by returning a fresh instance of it""" + newnode = new.ExtSlice() + newnode.dims = self.visit(node.dims, node) + return newnode def visit_for(self, node): + """visit a For node by returning a fresh instance of it""" + newnode = new.For() + newnode.target = self.visit(node.target, node) + newnode.iter = self.visit(node.iter, node) + newnode.body = [self.visit(child, node) for child in node.body] + newnode.orelse = self.visit(node.orelse, node) + # XXX old code node.target = node.assign del node.assign node.iter = node.list del node.list node.body = node.body.nodes _init_else_node(node) + # end old + return newnode + + def visit_from(self, node): + """visit a From node by returning a fresh instance of it""" + newnode = new.From(node.modname, nodes.names) + return newnode + + + def visit_function(self, node): + """visit a Function node by returning a fresh instance of it""" + newnode = new.Function() + newnode.decorators = [self.visit(child, node) for child in node.decorators] + newnode.args = [self.visit(child, node) for child in node.args] + newnode.body = [self.visit(child, node) for child in node.body] + # XXX old code + node.body = node.code.nodes + del node.code + args_compiler_to_ast(node) + # end old + return newnode def visit_genexpr(self, node): + """visit a GenExpr node by returning a fresh instance of it""" + newnode = new.GenExpr() + newnode.elt = self.visit(node.elt, node) + newnode.generators = [self.visit(child, node) for child in node.generators] + # XXX old code # remove GenExprInner node node.elt = node.code.expr node.generators = node.code.quals del node.code + # end old + return newnode def visit_getattr(self, node): - if isinstance(self.visitor.asscontext, new.AugAssign): - node.__class__ = new.AssAttr + """visit a Getattr node by returning a fresh instance of it""" + newnode = new.Getattr() + newnode.expr = self.visit(node.expr, node) + # XXX old code + if isinstance(self.visitor.asscontext, AugAssign): + node.__class__ = AssAttr + # end old + return newnode + + def visit_global(self, node): + """visit a Global node by returning a fresh instance of it""" + newnode = new.Global() + return newnode + def visit_if(self, node): - node.test, body = node.tests[0] + """visit an If node by returning a fresh instance of it""" + newnode = new.If() + newnode.test = self.visit(node.test, node) + newnode.body = [self.visit(child, node) for child in node.body] + newnode.orelse = self.visit(node.orelse, node) + # XXX old code + (node.test, body) = node.tests[0] node.body = body.nodes if node.tests[1:]: # create If node and put it in orelse # rely on the fact that the new If node will be visited # as well until no more tests remains - subnode = If(node.tests[1:], node.else_ ) + subnode = If(node.tests[1:], node.else_) subnode.fromlineno = node.tests[1][0].fromlineno subnode.tolineno = node.tests[1][1].nodes[-1].tolineno subnode.blockstart_tolineno = node.tests[1][0].tolineno @@ -403,60 +592,140 @@ class TreeRebuilder(ASTVisitor): else: # handle orelse _init_else_node(node) del node.tests - - def visit_list(self, node): - node.elts = node.nodes - del node.nodes + # end old + return newnode + + def visit_ifexp(self, node): + """visit an IfExp node by returning a fresh instance of it""" + newnode = new.IfExp() + newnode.test = self.visit(node.test, node) + newnode.body = [self.visit(child, node) for child in node.body] + newnode.orelse = self.visit(node.orelse, node) + return newnode + + def visit_import(self, node): + """visit an Import node by returning a fresh instance of it""" + newnode = new.Import() + return newnode + + def visit_index(self, node): + """visit an Index node by returning a fresh instance of it""" + newnode = new.Index() + newnode.value = self.visit(node.value, node) + return newnode def visit_keyword(self, node): + """visit a Keyword node by returning a fresh instance of it""" + newnode = new.Keyword() + newnode.value = self.visit(node.value, node) + # XXX old code node.value = node.expr node.arg = node.name del node.expr, node.name + # end old + return newnode + + def visit_lambda(self, node): + """visit a Lambda node by returning a fresh instance of it""" + newnode = new.Lambda() + newnode.args = [self.visit(child, node) for child in node.args] + newnode.body = [self.visit(child, node) for child in node.body] + # XXX old code + node.body = node.code + del node.code + args_compiler_to_ast(node) + # end old + return newnode + + def visit_list(self, node): + """visit a List node by returning a fresh instance of it""" + newnode = new.List() + newnode.elts = [self.visit(child, node) for child in node.elts] + # XXX old code + node.elts = node.nodes + del node.nodes + # end old + return newnode def visit_listcomp(self, node): + """visit a ListComp node by returning a fresh instance of it""" + newnode = new.ListComp() + newnode.elt = self.visit(node.elt, node) + newnode.generators = [self.visit(child, node) for child in node.generators] + # XXX old code node.elt = node.expr node.generators = node.quals del node.expr, node.quals + # end old + return newnode - def visit_name(self, node): - if isinstance(self.visitor.asscontext, new.AugAssign): - node.__class__ = new.AssName + def visit_module(self, node): + """visit a Module node by returning a fresh instance of it""" + newnode = new.Module() + newnode.body = [self.visit(child, node) for child in node.body] + # XXX old code + node.body = node.node.nodes + del node.node + return True + # end old + return newnode - def visit_comprehension(self, node): - if hasattr(node, "list"): - # ListCompFor - node.iter = node.list - del node.list - else: # GenExprFor - node.__class__ = new.Comprehension - node.target = node.assign - if node.ifs: - node.ifs = [iff.test for iff in node.ifs ] - del node.assign + def visit_name(self, node): + """visit a Name node by returning a fresh instance of it""" + newnode = new.Name() + # XXX old code + if isinstance(self.visitor.asscontext, AugAssign): + node.__class__ = AssName + # end old + return newnode + + def visit_pass(self, node): + """visit a Pass node by returning a fresh instance of it""" + newnode = new.Pass() + return newnode def visit_print(self, node): + """visit a Print node by returning a fresh instance of it""" + newnode = new.Print() + newnode.dest = self.visit(node.dest, node) + newnode.values = [self.visit(child, node) for child in node.values] + # XXX old code node.values = node.nodes del node.nodes node.nl = False - - def visit_printnl(self, node): - node.__class__ = Print - node.values = node.nodes - del node.nodes - node.nl = True + # end old + return newnode def visit_raise(self, node): + """visit a Raise node by returning a fresh instance of it""" + newnode = new.Raise() + newnode.type = self.visit(node.type, node) + newnode.inst = self.visit(node.inst, node) + newnode.tback = self.visit(node.tback, node) + # XXX old code node.type = node.expr1 node.inst = node.expr2 node.tback = node.expr3 del node.expr1, node.expr2, node.expr3 + # end old + return newnode def visit_return(self, node): - """visit Return: filter None Const""" - node.value = _filter_none( node.value ) + """visit a Return node by returning a fresh instance of it""" + newnode = new.Return() + newnode.value = self.visit(node.value, node) + # XXX old code + node.value = _filter_none(node.value) + # end old + return newnode def visit_slice(self, node): - """visit slice""" + """visit a Slice node by returning a fresh instance of it""" + newnode = new.Slice() + newnode.lower = self.visit(node.lower, node) + newnode.upper = self.visit(node.upper, node) + newnode.step = self.visit(node.step, node) + # XXX old code # /!\ Careful : # if the node comes from compiler, it is actually an astng.Subscript # with only 'lower' and 'upper' attributes; no 'step'. @@ -472,64 +741,102 @@ class TreeRebuilder(ASTVisitor): self.insert_delstmt_if_necessary(node) else: assert node.flags in ('OP_APPLY', 'OP_ASSIGN') - node.__class__ = Subscript # XXX what should we do here ? + node.__class__ = Subscript node.value = node.expr - node.slice = ew.Slice(node.lower, node.upper, None, - node.lineno) + node.slice = Slice(node.lower, node.upper, None, node.lineno) del node.expr, node.lower, node.upper, node.flags + # end old + return newnode def visit_subscript(self, node): + """visit a Subscript node by returning a fresh instance of it""" + newnode = new.Subscript() + newnode.value = self.visit(node.value, node) + newnode.slice = self.visit(node.slice, node) + # XXX old code if node.flags == 'OP_DELETE': self.insert_delstmt_if_necessary(node) node.value = node.expr if [n for n in node.subs if isinstance(n, Sliceobj)]: subs = node.subs - if len(node.subs) == 1:# Slice + if len(node.subs) == 1: subs = node.subs[0].nodes - node.slice = new.Slice(subs[0], subs[1], subs[2], node.lineno) + node.slice = Slice(subs[0], subs[1], subs[2], node.lineno) else: # ExtSlice - node.slice = new.ExtSlice() - node.dims = [_extslice(n) for n in node.subs] + node.slice = ExtSlice(node.subs) else: # Index - node.slice = new.Index(node.subs) + node.slice = Index(node.subs) del node.expr, node.subs, node.flags + # end old + return newnode + def visit_tryexcept(self, node): + """visit a TryExcept node by returning a fresh instance of it""" + newnode = new.TryExcept() + newnode.body = [self.visit(child, node) for child in node.body] + newnode.handlers = [self.visit(child, node) for child in node.handlers] + newnode.orelse = self.visit(node.orelse, node) + # XXX old code # remove Stmt node node.body = node.body.nodes - # remove Stmt node - node.handlers = [new.ExceptHandler(exctype, excobj, body.nodes) - for exctype, excobj, body in node.handlers] + node.handlers = [ExceptHandler(exctype, excobj, body, node) for (exctype, excobj, body) in node.handlers] _init_else_node(node) + # end old + return newnode def visit_tryfinally(self, node): - # remove Stmt nodes + """visit a TryFinally node by returning a fresh instance of it""" + newnode = new.TryFinally() + newnode.body = [self.visit(child, node) for child in node.body] + newnode.finalbody = self.visit(node.finalbody, node) + # XXX old code node.body = node.body.nodes node.finalbody = node.final.nodes del node.final + # end old + return newnode - visit_tuple = visit_list + def visit_tuple(self, node): + """visit a Tuple node by returning a fresh instance of it""" + newnode = new.Tuple() + newnode.elts = [self.visit(child, node) for child in node.elts] + return newnode def visit_unaryop(self, node): - node.op = UnaryOp_OP_CLASSES[node.__class__] - node.__class__ = new.UnaryOp # XXX just instanciate the node + """visit an UnaryOp node by returning a fresh instance of it""" + newnode = new.UnaryOp() + newnode.operand = self.visit(node.operand, node) + # XXX old code + node.op = UnaryOp.OP_CLASSES[node.__class__] + node.__class__ = UnaryOp node.operand = node.expr del node.expr + # end old + return newnode def visit_while(self, node): + """visit a While node by returning a fresh instance of it""" + newnode = new.While() + newnode.test = self.visit(node.test, node) + newnode.body = [self.visit(child, node) for child in node.body] + newnode.orelse = self.visit(node.orelse, node) + # XXX old code node.body = node.body.nodes _init_else_node(node) + # end old + def visit_with(self, node): + """visit a With node by returning a fresh instance of it""" + newnode = new.With() + newnode.expr = self.visit(node.expr, node) + newnode.vars = self.visit(node.vars, node) + newnode.body = [self.visit(child, node) for child in node.body] + return newnode def visit_yield(self, node): - """visit yield : add parent Discard node""" - if not isinstance(node.parent, new.Discard): - stmt = new.Discard(None) - del stmt.expr - stmt.value = node - stmt.fromlineno = node.fromlineno - stmt.tolineno = node.tolineno - node.parent.replace(node, stmt) - node.parent = stmt - + """visit a Yield node by returning a fresh instance of it""" + newnode = new.Yield() + newnode.value = self.visit(node.value, node) + return newnode |
