Skip to content

Commit

Permalink
Fix unsafe default return values in NodeVisitor methods (#18536)
Browse files Browse the repository at this point in the history
Raise NotImplementedError by default in NodeVisitor visit methods.
  • Loading branch information
A5rocks authored Jan 28, 2025
1 parent 82f4e88 commit e046a54
Show file tree
Hide file tree
Showing 5 changed files with 212 additions and 91 deletions.
13 changes: 13 additions & 0 deletions mypy/checker.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@
FuncBase,
FuncDef,
FuncItem,
GlobalDecl,
IfStmt,
Import,
ImportAll,
Expand All @@ -92,6 +93,7 @@
MypyFile,
NameExpr,
Node,
NonlocalDecl,
OperatorAssignmentStmt,
OpExpr,
OverloadedFuncDef,
Expand Down Expand Up @@ -7876,6 +7878,17 @@ def warn_deprecated_overload_item(
if candidate == target:
self.warn_deprecated(item.func, context)

# leafs

def visit_pass_stmt(self, o: PassStmt, /) -> None:
return None

def visit_nonlocal_decl(self, o: NonlocalDecl, /) -> None:
return None

def visit_global_decl(self, o: GlobalDecl, /) -> None:
return None


class CollectArgTypeVarTypes(TypeTraverserVisitor):
"""Collects the non-nested argument types in a set."""
Expand Down
33 changes: 33 additions & 0 deletions mypy/semanal.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,10 +97,12 @@
AwaitExpr,
Block,
BreakStmt,
BytesExpr,
CallExpr,
CastExpr,
ClassDef,
ComparisonExpr,
ComplexExpr,
ConditionalExpr,
Context,
ContinueStmt,
Expand All @@ -114,6 +116,7 @@
Expression,
ExpressionStmt,
FakeExpression,
FloatExpr,
ForStmt,
FuncBase,
FuncDef,
Expand All @@ -126,6 +129,7 @@
ImportBase,
ImportFrom,
IndexExpr,
IntExpr,
LambdaExpr,
ListComprehension,
ListExpr,
Expand Down Expand Up @@ -193,6 +197,7 @@
MappingPattern,
OrPattern,
SequencePattern,
SingletonPattern,
StarredPattern,
ValuePattern,
)
Expand Down Expand Up @@ -7529,6 +7534,34 @@ def parse_dataclass_transform_field_specifiers(self, arg: Expression) -> tuple[s
names.append(specifier.fullname)
return tuple(names)

# leafs
def visit_int_expr(self, o: IntExpr, /) -> None:
return None

def visit_str_expr(self, o: StrExpr, /) -> None:
return None

def visit_bytes_expr(self, o: BytesExpr, /) -> None:
return None

def visit_float_expr(self, o: FloatExpr, /) -> None:
return None

def visit_complex_expr(self, o: ComplexExpr, /) -> None:
return None

def visit_ellipsis(self, o: EllipsisExpr, /) -> None:
return None

def visit_temp_node(self, o: TempNode, /) -> None:
return None

def visit_pass_stmt(self, o: PassStmt, /) -> None:
return None

def visit_singleton_pattern(self, o: SingletonPattern, /) -> None:
return None


def replace_implicit_first_type(sig: FunctionLike, new: Type) -> FunctionLike:
if isinstance(sig, CallableType):
Expand Down
82 changes: 82 additions & 0 deletions mypy/traverser.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
OverloadedFuncDef,
ParamSpecExpr,
PassStmt,
PromoteExpr,
RaiseStmt,
ReturnStmt,
RevealExpr,
Expand All @@ -67,6 +68,7 @@
StarExpr,
StrExpr,
SuperExpr,
TempNode,
TryStmt,
TupleExpr,
TypeAlias,
Expand All @@ -77,6 +79,7 @@
TypeVarExpr,
TypeVarTupleExpr,
UnaryExpr,
Var,
WhileStmt,
WithStmt,
YieldExpr,
Expand Down Expand Up @@ -415,6 +418,85 @@ def visit_import_from(self, o: ImportFrom, /) -> None:
for a in o.assignments:
a.accept(self)

# leaf nodes
def visit_name_expr(self, o: NameExpr, /) -> None:
return None

def visit_str_expr(self, o: StrExpr, /) -> None:
return None

def visit_int_expr(self, o: IntExpr, /) -> None:
return None

def visit_float_expr(self, o: FloatExpr, /) -> None:
return None

def visit_bytes_expr(self, o: BytesExpr, /) -> None:
return None

def visit_ellipsis(self, o: EllipsisExpr, /) -> None:
return None

def visit_var(self, o: Var, /) -> None:
return None

def visit_continue_stmt(self, o: ContinueStmt, /) -> None:
return None

def visit_pass_stmt(self, o: PassStmt, /) -> None:
return None

def visit_break_stmt(self, o: BreakStmt, /) -> None:
return None

def visit_temp_node(self, o: TempNode, /) -> None:
return None

def visit_nonlocal_decl(self, o: NonlocalDecl, /) -> None:
return None

def visit_global_decl(self, o: GlobalDecl, /) -> None:
return None

def visit_import_all(self, o: ImportAll, /) -> None:
return None

def visit_type_var_expr(self, o: TypeVarExpr, /) -> None:
return None

def visit_paramspec_expr(self, o: ParamSpecExpr, /) -> None:
return None

def visit_type_var_tuple_expr(self, o: TypeVarTupleExpr, /) -> None:
return None

def visit_type_alias_expr(self, o: TypeAliasExpr, /) -> None:
return None

def visit_type_alias(self, o: TypeAlias, /) -> None:
return None

def visit_namedtuple_expr(self, o: NamedTupleExpr, /) -> None:
return None

def visit_typeddict_expr(self, o: TypedDictExpr, /) -> None:
return None

def visit_newtype_expr(self, o: NewTypeExpr, /) -> None:
return None

def visit__promote_expr(self, o: PromoteExpr, /) -> None:
return None

def visit_complex_expr(self, o: ComplexExpr, /) -> None:
return None

def visit_enum_call_expr(self, o: EnumCallExpr, /) -> None:
return None

def visit_singleton_pattern(self, o: SingletonPattern, /) -> None:
return None


class ExtendedTraverserVisitor(TraverserVisitor):
"""This is a more flexible traverser.
Expand Down
Loading

0 comments on commit e046a54

Please sign in to comment.