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

Reply via email to