Author: Carl Friedrich Bolz-Tereick <cfb...@gmx.de> Branch: py3.6 Changeset: r97403:6be03434acd9 Date: 2019-09-07 19:57 +0200 http://bitbucket.org/pypy/pypy/changeset/6be03434acd9/
Log: do visitor differently diff --git a/pypy/interpreter/astcompiler/ast.py b/pypy/interpreter/astcompiler/ast.py --- a/pypy/interpreter/astcompiler/ast.py +++ b/pypy/interpreter/astcompiler/ast.py @@ -4291,19 +4291,27 @@ class GenericASTVisitor(ASTVisitor): + def visited(self, node): + pass # base implementation + def visit_Module(self, node): + self.visited(node) self.visit_sequence(node.body) def visit_Interactive(self, node): + self.visited(node) self.visit_sequence(node.body) def visit_Expression(self, node): + self.visited(node) node.body.walkabout(self) def visit_Suite(self, node): + self.visited(node) self.visit_sequence(node.body) def visit_FunctionDef(self, node): + self.visited(node) node.args.walkabout(self) self.visit_sequence(node.body) self.visit_sequence(node.decorator_list) @@ -4311,6 +4319,7 @@ node.returns.walkabout(self) def visit_AsyncFunctionDef(self, node): + self.visited(node) node.args.walkabout(self) self.visit_sequence(node.body) self.visit_sequence(node.decorator_list) @@ -4318,214 +4327,269 @@ node.returns.walkabout(self) def visit_ClassDef(self, node): + self.visited(node) self.visit_sequence(node.bases) self.visit_sequence(node.keywords) self.visit_sequence(node.body) self.visit_sequence(node.decorator_list) def visit_Return(self, node): + self.visited(node) if node.value: node.value.walkabout(self) def visit_Delete(self, node): + self.visited(node) self.visit_sequence(node.targets) def visit_Assign(self, node): + self.visited(node) self.visit_sequence(node.targets) node.value.walkabout(self) def visit_AugAssign(self, node): + self.visited(node) node.target.walkabout(self) node.value.walkabout(self) def visit_AnnAssign(self, node): + self.visited(node) node.target.walkabout(self) node.annotation.walkabout(self) if node.value: node.value.walkabout(self) def visit_For(self, node): + self.visited(node) node.target.walkabout(self) node.iter.walkabout(self) self.visit_sequence(node.body) self.visit_sequence(node.orelse) def visit_AsyncFor(self, node): + self.visited(node) node.target.walkabout(self) node.iter.walkabout(self) self.visit_sequence(node.body) self.visit_sequence(node.orelse) def visit_While(self, node): + self.visited(node) node.test.walkabout(self) self.visit_sequence(node.body) self.visit_sequence(node.orelse) def visit_If(self, node): + self.visited(node) node.test.walkabout(self) self.visit_sequence(node.body) self.visit_sequence(node.orelse) def visit_With(self, node): + self.visited(node) self.visit_sequence(node.items) self.visit_sequence(node.body) def visit_AsyncWith(self, node): + self.visited(node) self.visit_sequence(node.items) self.visit_sequence(node.body) def visit_Raise(self, node): + self.visited(node) if node.exc: node.exc.walkabout(self) if node.cause: node.cause.walkabout(self) def visit_Try(self, node): + self.visited(node) self.visit_sequence(node.body) self.visit_sequence(node.handlers) self.visit_sequence(node.orelse) self.visit_sequence(node.finalbody) def visit_Assert(self, node): + self.visited(node) node.test.walkabout(self) if node.msg: node.msg.walkabout(self) def visit_Import(self, node): + self.visited(node) self.visit_sequence(node.names) def visit_ImportFrom(self, node): + self.visited(node) self.visit_sequence(node.names) def visit_Global(self, node): + self.visited(node) pass def visit_Nonlocal(self, node): + self.visited(node) pass def visit_Expr(self, node): + self.visited(node) node.value.walkabout(self) def visit_Pass(self, node): + self.visited(node) pass def visit_Break(self, node): + self.visited(node) pass def visit_Continue(self, node): + self.visited(node) pass def visit_BoolOp(self, node): + self.visited(node) self.visit_sequence(node.values) def visit_BinOp(self, node): + self.visited(node) node.left.walkabout(self) node.right.walkabout(self) def visit_UnaryOp(self, node): + self.visited(node) node.operand.walkabout(self) def visit_Lambda(self, node): + self.visited(node) node.args.walkabout(self) node.body.walkabout(self) def visit_IfExp(self, node): + self.visited(node) node.test.walkabout(self) node.body.walkabout(self) node.orelse.walkabout(self) def visit_Dict(self, node): + self.visited(node) self.visit_sequence(node.keys) self.visit_sequence(node.values) def visit_Set(self, node): + self.visited(node) self.visit_sequence(node.elts) def visit_ListComp(self, node): + self.visited(node) node.elt.walkabout(self) self.visit_sequence(node.generators) def visit_SetComp(self, node): + self.visited(node) node.elt.walkabout(self) self.visit_sequence(node.generators) def visit_DictComp(self, node): + self.visited(node) node.key.walkabout(self) node.value.walkabout(self) self.visit_sequence(node.generators) def visit_GeneratorExp(self, node): + self.visited(node) node.elt.walkabout(self) self.visit_sequence(node.generators) def visit_Await(self, node): + self.visited(node) node.value.walkabout(self) def visit_Yield(self, node): + self.visited(node) if node.value: node.value.walkabout(self) def visit_YieldFrom(self, node): + self.visited(node) node.value.walkabout(self) def visit_Compare(self, node): + self.visited(node) node.left.walkabout(self) self.visit_sequence(node.comparators) def visit_Call(self, node): + self.visited(node) node.func.walkabout(self) self.visit_sequence(node.args) self.visit_sequence(node.keywords) def visit_Num(self, node): + self.visited(node) pass def visit_Str(self, node): + self.visited(node) pass def visit_RevDBMetaVar(self, node): + self.visited(node) pass def visit_FormattedValue(self, node): + self.visited(node) node.value.walkabout(self) if node.format_spec: node.format_spec.walkabout(self) def visit_JoinedStr(self, node): + self.visited(node) self.visit_sequence(node.values) def visit_Bytes(self, node): + self.visited(node) pass def visit_NameConstant(self, node): + self.visited(node) pass def visit_Ellipsis(self, node): + self.visited(node) pass def visit_Constant(self, node): + self.visited(node) pass def visit_Attribute(self, node): + self.visited(node) node.value.walkabout(self) def visit_Subscript(self, node): + self.visited(node) node.value.walkabout(self) node.slice.walkabout(self) def visit_Starred(self, node): + self.visited(node) node.value.walkabout(self) def visit_Name(self, node): + self.visited(node) pass def visit_List(self, node): + self.visited(node) self.visit_sequence(node.elts) def visit_Tuple(self, node): + self.visited(node) self.visit_sequence(node.elts) def visit_Slice(self, node): + self.visited(node) if node.lower: node.lower.walkabout(self) if node.upper: @@ -4534,22 +4598,27 @@ node.step.walkabout(self) def visit_ExtSlice(self, node): + self.visited(node) self.visit_sequence(node.dims) def visit_Index(self, node): + self.visited(node) node.value.walkabout(self) def visit_comprehension(self, node): + self.visited(node) node.target.walkabout(self) node.iter.walkabout(self) self.visit_sequence(node.ifs) def visit_ExceptHandler(self, node): + self.visited(node) if node.type: node.type.walkabout(self) self.visit_sequence(node.body) def visit_arguments(self, node): + self.visited(node) self.visit_sequence(node.args) if node.vararg: node.vararg.walkabout(self) @@ -4560,16 +4629,20 @@ self.visit_sequence(node.defaults) def visit_arg(self, node): + self.visited(node) if node.annotation: node.annotation.walkabout(self) def visit_keyword(self, node): + self.visited(node) node.value.walkabout(self) def visit_alias(self, node): + self.visited(node) pass def visit_withitem(self, node): + self.visited(node) node.context_expr.walkabout(self) if node.optional_vars: node.optional_vars.walkabout(self) diff --git a/pypy/interpreter/astcompiler/fstring.py b/pypy/interpreter/astcompiler/fstring.py --- a/pypy/interpreter/astcompiler/fstring.py +++ b/pypy/interpreter/astcompiler/fstring.py @@ -64,25 +64,24 @@ parser = astbuilder.recursive_parser parse_tree = parser.parse_source(paren_source, info) - return fixup_fstring_positions( - ast_from_node(astbuilder.space, parse_tree, info, - recursive_parser=parser), - lineno, column_offset) + ast = ast_from_node(astbuilder.space, parse_tree, info, + recursive_parser=parser) + fixup_fstring_positions(ast, lineno, column_offset) + return ast def fixup_fstring_positions(ast, line_offset, column_offset): visitor = FixPosVisitor(line_offset, column_offset) - return ast.mutate_over(visitor) + ast.walkabout(visitor) -class FixPosVisitor(ast.ASTVisitor): +class FixPosVisitor(ast.GenericASTVisitor): def __init__(self, line_offset, column_offset): self.line_offset = line_offset self.column_offset = column_offset - def default_visitor(self, node): + def visited(self, node): if isinstance(node, ast.stmt) or isinstance(node, ast.expr): node.lineno += self.line_offset node.col_offset += self.column_offset - return node def unexpected_end_of_string(astbuilder, atom_node): diff --git a/pypy/interpreter/astcompiler/tools/asdl_py.py b/pypy/interpreter/astcompiler/tools/asdl_py.py --- a/pypy/interpreter/astcompiler/tools/asdl_py.py +++ b/pypy/interpreter/astcompiler/tools/asdl_py.py @@ -341,6 +341,9 @@ def visitModule(self, mod): self.emit("class GenericASTVisitor(ASTVisitor):") self.emit("") + self.emit("def visited(self, node):", 1) + self.emit("pass # base implementation", 2) + self.emit("") super(GenericASTVisitorVisitor, self).visitModule(mod) self.emit("") @@ -357,6 +360,7 @@ def make_visitor(self, name, fields): self.emit("def visit_%s(self, node):" % (name,), 1) + self.emit("self.visited(node)", 2) have_body = False for field in fields: if self.visitField(field): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit