Skip to content

Commit e046a54

Browse files
authored
Fix unsafe default return values in NodeVisitor methods (#18536)
Raise NotImplementedError by default in NodeVisitor visit methods.
1 parent 82f4e88 commit e046a54

File tree

5 files changed

+212
-91
lines changed

5 files changed

+212
-91
lines changed

Diff for: mypy/checker.py

+13
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
FuncBase,
7878
FuncDef,
7979
FuncItem,
80+
GlobalDecl,
8081
IfStmt,
8182
Import,
8283
ImportAll,
@@ -92,6 +93,7 @@
9293
MypyFile,
9394
NameExpr,
9495
Node,
96+
NonlocalDecl,
9597
OperatorAssignmentStmt,
9698
OpExpr,
9799
OverloadedFuncDef,
@@ -7876,6 +7878,17 @@ def warn_deprecated_overload_item(
78767878
if candidate == target:
78777879
self.warn_deprecated(item.func, context)
78787880

7881+
# leafs
7882+
7883+
def visit_pass_stmt(self, o: PassStmt, /) -> None:
7884+
return None
7885+
7886+
def visit_nonlocal_decl(self, o: NonlocalDecl, /) -> None:
7887+
return None
7888+
7889+
def visit_global_decl(self, o: GlobalDecl, /) -> None:
7890+
return None
7891+
78797892

78807893
class CollectArgTypeVarTypes(TypeTraverserVisitor):
78817894
"""Collects the non-nested argument types in a set."""

Diff for: mypy/semanal.py

+33
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,12 @@
9797
AwaitExpr,
9898
Block,
9999
BreakStmt,
100+
BytesExpr,
100101
CallExpr,
101102
CastExpr,
102103
ClassDef,
103104
ComparisonExpr,
105+
ComplexExpr,
104106
ConditionalExpr,
105107
Context,
106108
ContinueStmt,
@@ -114,6 +116,7 @@
114116
Expression,
115117
ExpressionStmt,
116118
FakeExpression,
119+
FloatExpr,
117120
ForStmt,
118121
FuncBase,
119122
FuncDef,
@@ -126,6 +129,7 @@
126129
ImportBase,
127130
ImportFrom,
128131
IndexExpr,
132+
IntExpr,
129133
LambdaExpr,
130134
ListComprehension,
131135
ListExpr,
@@ -193,6 +197,7 @@
193197
MappingPattern,
194198
OrPattern,
195199
SequencePattern,
200+
SingletonPattern,
196201
StarredPattern,
197202
ValuePattern,
198203
)
@@ -7529,6 +7534,34 @@ def parse_dataclass_transform_field_specifiers(self, arg: Expression) -> tuple[s
75297534
names.append(specifier.fullname)
75307535
return tuple(names)
75317536

7537+
# leafs
7538+
def visit_int_expr(self, o: IntExpr, /) -> None:
7539+
return None
7540+
7541+
def visit_str_expr(self, o: StrExpr, /) -> None:
7542+
return None
7543+
7544+
def visit_bytes_expr(self, o: BytesExpr, /) -> None:
7545+
return None
7546+
7547+
def visit_float_expr(self, o: FloatExpr, /) -> None:
7548+
return None
7549+
7550+
def visit_complex_expr(self, o: ComplexExpr, /) -> None:
7551+
return None
7552+
7553+
def visit_ellipsis(self, o: EllipsisExpr, /) -> None:
7554+
return None
7555+
7556+
def visit_temp_node(self, o: TempNode, /) -> None:
7557+
return None
7558+
7559+
def visit_pass_stmt(self, o: PassStmt, /) -> None:
7560+
return None
7561+
7562+
def visit_singleton_pattern(self, o: SingletonPattern, /) -> None:
7563+
return None
7564+
75327565

75337566
def replace_implicit_first_type(sig: FunctionLike, new: Type) -> FunctionLike:
75347567
if isinstance(sig, CallableType):

Diff for: mypy/traverser.py

+82
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
OverloadedFuncDef,
5959
ParamSpecExpr,
6060
PassStmt,
61+
PromoteExpr,
6162
RaiseStmt,
6263
ReturnStmt,
6364
RevealExpr,
@@ -67,6 +68,7 @@
6768
StarExpr,
6869
StrExpr,
6970
SuperExpr,
71+
TempNode,
7072
TryStmt,
7173
TupleExpr,
7274
TypeAlias,
@@ -77,6 +79,7 @@
7779
TypeVarExpr,
7880
TypeVarTupleExpr,
7981
UnaryExpr,
82+
Var,
8083
WhileStmt,
8184
WithStmt,
8285
YieldExpr,
@@ -415,6 +418,85 @@ def visit_import_from(self, o: ImportFrom, /) -> None:
415418
for a in o.assignments:
416419
a.accept(self)
417420

421+
# leaf nodes
422+
def visit_name_expr(self, o: NameExpr, /) -> None:
423+
return None
424+
425+
def visit_str_expr(self, o: StrExpr, /) -> None:
426+
return None
427+
428+
def visit_int_expr(self, o: IntExpr, /) -> None:
429+
return None
430+
431+
def visit_float_expr(self, o: FloatExpr, /) -> None:
432+
return None
433+
434+
def visit_bytes_expr(self, o: BytesExpr, /) -> None:
435+
return None
436+
437+
def visit_ellipsis(self, o: EllipsisExpr, /) -> None:
438+
return None
439+
440+
def visit_var(self, o: Var, /) -> None:
441+
return None
442+
443+
def visit_continue_stmt(self, o: ContinueStmt, /) -> None:
444+
return None
445+
446+
def visit_pass_stmt(self, o: PassStmt, /) -> None:
447+
return None
448+
449+
def visit_break_stmt(self, o: BreakStmt, /) -> None:
450+
return None
451+
452+
def visit_temp_node(self, o: TempNode, /) -> None:
453+
return None
454+
455+
def visit_nonlocal_decl(self, o: NonlocalDecl, /) -> None:
456+
return None
457+
458+
def visit_global_decl(self, o: GlobalDecl, /) -> None:
459+
return None
460+
461+
def visit_import_all(self, o: ImportAll, /) -> None:
462+
return None
463+
464+
def visit_type_var_expr(self, o: TypeVarExpr, /) -> None:
465+
return None
466+
467+
def visit_paramspec_expr(self, o: ParamSpecExpr, /) -> None:
468+
return None
469+
470+
def visit_type_var_tuple_expr(self, o: TypeVarTupleExpr, /) -> None:
471+
return None
472+
473+
def visit_type_alias_expr(self, o: TypeAliasExpr, /) -> None:
474+
return None
475+
476+
def visit_type_alias(self, o: TypeAlias, /) -> None:
477+
return None
478+
479+
def visit_namedtuple_expr(self, o: NamedTupleExpr, /) -> None:
480+
return None
481+
482+
def visit_typeddict_expr(self, o: TypedDictExpr, /) -> None:
483+
return None
484+
485+
def visit_newtype_expr(self, o: NewTypeExpr, /) -> None:
486+
return None
487+
488+
def visit__promote_expr(self, o: PromoteExpr, /) -> None:
489+
return None
490+
491+
def visit_complex_expr(self, o: ComplexExpr, /) -> None:
492+
return None
493+
494+
def visit_enum_call_expr(self, o: EnumCallExpr, /) -> None:
495+
return None
496+
497+
def visit_singleton_pattern(self, o: SingletonPattern, /) -> None:
498+
return None
499+
418500

419501
class ExtendedTraverserVisitor(TraverserVisitor):
420502
"""This is a more flexible traverser.

0 commit comments

Comments
 (0)