text: """Generic abstract syntax tree node visitor"""
  
  from typing import TypeVar, Generic
  
  import mypy.nodes
  
  
  T = TypeVar('T')
  
  
  class NodeVisitor(Generic[T]):
      """Empty base class for parse tree node visitors.
  
      The T type argument specifies the return type of the visit
      methods. As all methods defined here return None by default,
      subclasses do not always need to override all the methods.
  
      TODO make the default return value explicit
      """
  
      # Module structure
  
      def visit_mypy_file(self, o: 'mypy.nodes.MypyFile') -> T:
          pass
  
      def visit_import(self, o: 'mypy.nodes.Import') -> T:
          pass
  
      def visit_import_from(self, o: 'mypy.nodes.ImportFrom') -> T:
          pass
  
      def visit_import_all(self, o: 'mypy.nodes.ImportAll') -> T:
          pass
  
      # Definitions
  
      def visit_func_def(self, o: 'mypy.nodes.FuncDef') -> T:
          pass
  
      def visit_overloaded_func_def(self,
                                    o: 'mypy.nodes.OverloadedFuncDef') -> T:
          pass
  
      def visit_class_def(self, o: 'mypy.nodes.ClassDef') -> T:
          pass
  
      def visit_global_decl(self, o: 'mypy.nodes.GlobalDecl') -> T:
          pass
  
      def visit_nonlocal_decl(self, o: 'mypy.nodes.NonlocalDecl') -> T:
          pass
  
      def visit_decorator(self, o: 'mypy.nodes.Decorator') -> T:
          pass
  
      def visit_var(self, o: 'mypy.nodes.Var') -> T:
          pass
  
      # Statements
  
      def visit_block(self, o: 'mypy.nodes.Block') -> T:
          pass
  
      def visit_expression_stmt(self, o: 'mypy.nodes.ExpressionStmt') -> T:
          pass
  
      def visit_assignment_stmt(self, o: 'mypy.nodes.AssignmentStmt') -> T:
          pass
  
      def visit_operator_assignment_stmt(self,
                                         o: 'mypy.nodes.OperatorAssignmentStmt') -> T:
          pass
  
      def visit_while_stmt(self, o: 'mypy.nodes.WhileStmt') -> T:
          pass
  
      def visit_for_stmt(self, o: 'mypy.nodes.ForStmt') -> T:
          pass
  
      def visit_return_stmt(self, o: 'mypy.nodes.ReturnStmt') -> T:
          pass
  
      def visit_assert_stmt(self, o: 'mypy.nodes.AssertStmt') -> T:
          pass
  
      def visit_yield_stmt(self, o: 'mypy.nodes.YieldStmt') -> T:
          pass
  
      def visit_yield_from_stmt(self, o: 'mypy.nodes.YieldFromStmt') -> T:
          pass
  
      def visit_del_stmt(self, o: 'mypy.nodes.DelStmt') -> T:
          pass
  
      def visit_if_stmt(self, o: 'mypy.nodes.IfStmt') -> T:
          pass
  
      def visit_break_stmt(self, o: 'mypy.nodes.BreakStmt') -> T:
          pass
  
      def visit_continue_stmt(self, o: 'mypy.nodes.ContinueStmt') -> T:
          pass
  
      def visit_pass_stmt(self, o: 'mypy.nodes.PassStmt') -> T:
          pass
  
      def visit_raise_stmt(self, o: 'mypy.nodes.RaiseStmt') -> T:
          pass
  
      def visit_try_stmt(self, o: 'mypy.nodes.TryStmt') -> T:
          pass
  
      def visit_with_stmt(self, o: 'mypy.nodes.WithStmt') -> T:
          pass
  
      def visit_print_stmt(self, o: 'mypy.nodes.PrintStmt') -> T:
          pass
  
      def visit_exec_stmt(self, o: 'mypy.nodes.ExecStmt') -> T:
          pass
  
      # Expressions
  
      def visit_int_expr(self, o: 'mypy.nodes.IntExpr') -> T:
          pass
  
      def visit_str_expr(self, o: 'mypy.nodes.StrExpr') -> T:
          pass
  
      def visit_bytes_expr(self, o: 'mypy.nodes.BytesExpr') -> T:
          pass
  
      def visit_unicode_expr(self, o: 'mypy.nodes.UnicodeExpr') -> T:
          pass
  
      def visit_float_expr(self, o: 'mypy.nodes.FloatExpr') -> T:
          pass
  
      def visit_complex_expr(self, o: 'mypy.nodes.ComplexExpr') -> T:
          pass
  
      def visit_ellipsis(self, o: 'mypy.nodes.EllipsisExpr') -> T:
          pass
  
      def visit_star_expr(self, o: 'mypy.nodes.StarExpr') -> T:
          pass
  
      def visit_name_expr(self, o: 'mypy.nodes.NameExpr') -> T:
          pass
  
      def visit_member_expr(self, o: 'mypy.nodes.MemberExpr') -> T:
          pass
  
      def visit_yield_from_expr(self, o: 'mypy.nodes.YieldFromExpr') -> T:
          pass
  
      def visit_yield_expr(self, o: 'mypy.nodes.YieldExpr') -> T:
          pass
  
      def visit_call_expr(self, o: 'mypy.nodes.CallExpr') -> T:
          pass
  
      def visit_op_expr(self, o: 'mypy.nodes.OpExpr') -> T:
          pass
  
      def visit_comparison_expr(self, o: 'mypy.nodes.ComparisonExpr') -> T:
          pass
  
      def visit_cast_expr(self, o: 'mypy.nodes.CastExpr') -> T:
          pass
  
      def visit_super_expr(self, o: 'mypy.nodes.SuperExpr') -> T:
          pass
  
      def visit_unary_expr(self, o: 'mypy.nodes.UnaryExpr') -> T:
          pass
  
      def visit_list_expr(self, o: 'mypy.nodes.ListExpr') -> T:
          pass
  
      def visit_dict_expr(self, o: 'mypy.nodes.DictExpr') -> T:
          pass
  
      def visit_tuple_expr(self, o: 'mypy.nodes.TupleExpr') -> T:
          pass
  
      def visit_set_expr(self, o: 'mypy.nodes.SetExpr') -> T:
          pass
  
      def visit_index_expr(self, o: 'mypy.nodes.IndexExpr') -> T:
          pass
  
      def visit_type_application(self, o: 'mypy.nodes.TypeApplication') -> T:
          pass
  
      def visit_func_expr(self, o: 'mypy.nodes.FuncExpr') -> T:
          pass
  
      def visit_list_comprehension(self, o: 'mypy.nodes.ListComprehension') -> T:
          pass
  
      def visit_set_comprehension(self, o: 'mypy.nodes.SetComprehension') -> T:
          pass
  
      def visit_dictionary_comprehension(self, o: 'mypy.nodes.DictionaryComprehension') -> T:
          pass
  
      def visit_generator_expr(self, o: 'mypy.nodes.GeneratorExpr') -> T:
          pass
  
      def visit_slice_expr(self, o: 'mypy.nodes.SliceExpr') -> T:
          pass
  
      def visit_conditional_expr(self, o: 'mypy.nodes.ConditionalExpr') -> T:
          pass
  
      def visit_type_var_expr(self, o: 'mypy.nodes.TypeVarExpr') -> T:
          pass
  
      def visit_type_alias_expr(self, o: 'mypy.nodes.TypeAliasExpr') -> T:
          pass
  
      def visit_namedtuple_expr(self, o: 'mypy.nodes.NamedTupleExpr') -> T:
          pass
  
      def visit__promote_expr(self, o: 'mypy.nodes.PromoteExpr') -> T:
          pass
  
      def visit_temp_node(self, o: 'mypy.nodes.TempNode') -> T:
          pass
  