Tipragot
628be439b8
Cela permet de ne pas avoir de problèmes de compatibilité car python est dans le git.
622 lines
16 KiB
Python
622 lines
16 KiB
Python
"""Generic abstract syntax tree node visitor"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from abc import abstractmethod
|
|
from typing import TYPE_CHECKING, Generic, TypeVar
|
|
|
|
from mypy_extensions import mypyc_attr, trait
|
|
|
|
if TYPE_CHECKING:
|
|
# break import cycle only needed for mypy
|
|
import mypy.nodes
|
|
import mypy.patterns
|
|
|
|
|
|
T = TypeVar("T")
|
|
|
|
|
|
@trait
|
|
@mypyc_attr(allow_interpreted_subclasses=True)
|
|
class ExpressionVisitor(Generic[T]):
|
|
@abstractmethod
|
|
def visit_int_expr(self, o: mypy.nodes.IntExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_str_expr(self, o: mypy.nodes.StrExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_bytes_expr(self, o: mypy.nodes.BytesExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_float_expr(self, o: mypy.nodes.FloatExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_complex_expr(self, o: mypy.nodes.ComplexExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_ellipsis(self, o: mypy.nodes.EllipsisExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_star_expr(self, o: mypy.nodes.StarExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_name_expr(self, o: mypy.nodes.NameExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_member_expr(self, o: mypy.nodes.MemberExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_yield_from_expr(self, o: mypy.nodes.YieldFromExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_yield_expr(self, o: mypy.nodes.YieldExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_call_expr(self, o: mypy.nodes.CallExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_op_expr(self, o: mypy.nodes.OpExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_comparison_expr(self, o: mypy.nodes.ComparisonExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_cast_expr(self, o: mypy.nodes.CastExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_assert_type_expr(self, o: mypy.nodes.AssertTypeExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_reveal_expr(self, o: mypy.nodes.RevealExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_super_expr(self, o: mypy.nodes.SuperExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_unary_expr(self, o: mypy.nodes.UnaryExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_assignment_expr(self, o: mypy.nodes.AssignmentExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_list_expr(self, o: mypy.nodes.ListExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_dict_expr(self, o: mypy.nodes.DictExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_tuple_expr(self, o: mypy.nodes.TupleExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_set_expr(self, o: mypy.nodes.SetExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_index_expr(self, o: mypy.nodes.IndexExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_type_application(self, o: mypy.nodes.TypeApplication) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_lambda_expr(self, o: mypy.nodes.LambdaExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_list_comprehension(self, o: mypy.nodes.ListComprehension) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_set_comprehension(self, o: mypy.nodes.SetComprehension) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_dictionary_comprehension(self, o: mypy.nodes.DictionaryComprehension) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_generator_expr(self, o: mypy.nodes.GeneratorExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_slice_expr(self, o: mypy.nodes.SliceExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_conditional_expr(self, o: mypy.nodes.ConditionalExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_type_var_expr(self, o: mypy.nodes.TypeVarExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_paramspec_expr(self, o: mypy.nodes.ParamSpecExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_type_var_tuple_expr(self, o: mypy.nodes.TypeVarTupleExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_type_alias_expr(self, o: mypy.nodes.TypeAliasExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_namedtuple_expr(self, o: mypy.nodes.NamedTupleExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_enum_call_expr(self, o: mypy.nodes.EnumCallExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_typeddict_expr(self, o: mypy.nodes.TypedDictExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_newtype_expr(self, o: mypy.nodes.NewTypeExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit__promote_expr(self, o: mypy.nodes.PromoteExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_await_expr(self, o: mypy.nodes.AwaitExpr) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_temp_node(self, o: mypy.nodes.TempNode) -> T:
|
|
pass
|
|
|
|
|
|
@trait
|
|
@mypyc_attr(allow_interpreted_subclasses=True)
|
|
class StatementVisitor(Generic[T]):
|
|
# Definitions
|
|
|
|
@abstractmethod
|
|
def visit_assignment_stmt(self, o: mypy.nodes.AssignmentStmt) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_for_stmt(self, o: mypy.nodes.ForStmt) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_with_stmt(self, o: mypy.nodes.WithStmt) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_del_stmt(self, o: mypy.nodes.DelStmt) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_func_def(self, o: mypy.nodes.FuncDef) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_overloaded_func_def(self, o: mypy.nodes.OverloadedFuncDef) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_class_def(self, o: mypy.nodes.ClassDef) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_global_decl(self, o: mypy.nodes.GlobalDecl) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_nonlocal_decl(self, o: mypy.nodes.NonlocalDecl) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_decorator(self, o: mypy.nodes.Decorator) -> T:
|
|
pass
|
|
|
|
# Module structure
|
|
|
|
@abstractmethod
|
|
def visit_import(self, o: mypy.nodes.Import) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_import_from(self, o: mypy.nodes.ImportFrom) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_import_all(self, o: mypy.nodes.ImportAll) -> T:
|
|
pass
|
|
|
|
# Statements
|
|
|
|
@abstractmethod
|
|
def visit_block(self, o: mypy.nodes.Block) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_expression_stmt(self, o: mypy.nodes.ExpressionStmt) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_operator_assignment_stmt(self, o: mypy.nodes.OperatorAssignmentStmt) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_while_stmt(self, o: mypy.nodes.WhileStmt) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_return_stmt(self, o: mypy.nodes.ReturnStmt) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_assert_stmt(self, o: mypy.nodes.AssertStmt) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_if_stmt(self, o: mypy.nodes.IfStmt) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_break_stmt(self, o: mypy.nodes.BreakStmt) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_continue_stmt(self, o: mypy.nodes.ContinueStmt) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_pass_stmt(self, o: mypy.nodes.PassStmt) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_raise_stmt(self, o: mypy.nodes.RaiseStmt) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_try_stmt(self, o: mypy.nodes.TryStmt) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_match_stmt(self, o: mypy.nodes.MatchStmt) -> T:
|
|
pass
|
|
|
|
|
|
@trait
|
|
@mypyc_attr(allow_interpreted_subclasses=True)
|
|
class PatternVisitor(Generic[T]):
|
|
@abstractmethod
|
|
def visit_as_pattern(self, o: mypy.patterns.AsPattern) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_or_pattern(self, o: mypy.patterns.OrPattern) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_value_pattern(self, o: mypy.patterns.ValuePattern) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_singleton_pattern(self, o: mypy.patterns.SingletonPattern) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_sequence_pattern(self, o: mypy.patterns.SequencePattern) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_starred_pattern(self, o: mypy.patterns.StarredPattern) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_mapping_pattern(self, o: mypy.patterns.MappingPattern) -> T:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def visit_class_pattern(self, o: mypy.patterns.ClassPattern) -> T:
|
|
pass
|
|
|
|
|
|
@trait
|
|
@mypyc_attr(allow_interpreted_subclasses=True)
|
|
class NodeVisitor(Generic[T], ExpressionVisitor[T], StatementVisitor[T], PatternVisitor[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, then turn on
|
|
empty body checking in mypy_self_check.ini.
|
|
"""
|
|
|
|
# Not in superclasses:
|
|
|
|
def visit_mypy_file(self, o: mypy.nodes.MypyFile) -> T:
|
|
pass
|
|
|
|
# TODO: We have a visit_var method, but no visit_typeinfo or any
|
|
# other non-Statement SymbolNode (accepting those will raise a
|
|
# runtime error). Maybe this should be resolved in some direction.
|
|
def visit_var(self, o: mypy.nodes.Var) -> T:
|
|
pass
|
|
|
|
# Module structure
|
|
|
|
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_type_alias(self, o: mypy.nodes.TypeAlias) -> T:
|
|
pass
|
|
|
|
def visit_placeholder_node(self, o: mypy.nodes.PlaceholderNode) -> 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_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_match_stmt(self, o: mypy.nodes.MatchStmt) -> T:
|
|
pass
|
|
|
|
# Expressions (default no-op implementation)
|
|
|
|
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_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_assert_type_expr(self, o: mypy.nodes.AssertTypeExpr) -> T:
|
|
pass
|
|
|
|
def visit_reveal_expr(self, o: mypy.nodes.RevealExpr) -> T:
|
|
pass
|
|
|
|
def visit_super_expr(self, o: mypy.nodes.SuperExpr) -> T:
|
|
pass
|
|
|
|
def visit_assignment_expr(self, o: mypy.nodes.AssignmentExpr) -> 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_lambda_expr(self, o: mypy.nodes.LambdaExpr) -> 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_paramspec_expr(self, o: mypy.nodes.ParamSpecExpr) -> T:
|
|
pass
|
|
|
|
def visit_type_var_tuple_expr(self, o: mypy.nodes.TypeVarTupleExpr) -> 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_enum_call_expr(self, o: mypy.nodes.EnumCallExpr) -> T:
|
|
pass
|
|
|
|
def visit_typeddict_expr(self, o: mypy.nodes.TypedDictExpr) -> T:
|
|
pass
|
|
|
|
def visit_newtype_expr(self, o: mypy.nodes.NewTypeExpr) -> T:
|
|
pass
|
|
|
|
def visit__promote_expr(self, o: mypy.nodes.PromoteExpr) -> T:
|
|
pass
|
|
|
|
def visit_await_expr(self, o: mypy.nodes.AwaitExpr) -> T:
|
|
pass
|
|
|
|
def visit_temp_node(self, o: mypy.nodes.TempNode) -> T:
|
|
pass
|
|
|
|
# Patterns
|
|
|
|
def visit_as_pattern(self, o: mypy.patterns.AsPattern) -> T:
|
|
pass
|
|
|
|
def visit_or_pattern(self, o: mypy.patterns.OrPattern) -> T:
|
|
pass
|
|
|
|
def visit_value_pattern(self, o: mypy.patterns.ValuePattern) -> T:
|
|
pass
|
|
|
|
def visit_singleton_pattern(self, o: mypy.patterns.SingletonPattern) -> T:
|
|
pass
|
|
|
|
def visit_sequence_pattern(self, o: mypy.patterns.SequencePattern) -> T:
|
|
pass
|
|
|
|
def visit_starred_pattern(self, o: mypy.patterns.StarredPattern) -> T:
|
|
pass
|
|
|
|
def visit_mapping_pattern(self, o: mypy.patterns.MappingPattern) -> T:
|
|
pass
|
|
|
|
def visit_class_pattern(self, o: mypy.patterns.ClassPattern) -> T:
|
|
pass
|