Skip to content

Commit bf77aab

Browse files
authored
Traverse ParamSpec prefix where we should (#19800)
Fixes #18087 I started from fixing an incremental crash from `fixup.py`, but then noticed we don't traverse `ParamSpec` prefix in multiple places where we should, so I fixed most of those as well.
1 parent 309b01e commit bf77aab

File tree

12 files changed

+114
-15
lines changed

12 files changed

+114
-15
lines changed

mypy/checkexpr.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6435,7 +6435,7 @@ def visit_type_var(self, t: TypeVarType) -> bool:
64356435

64366436
def visit_param_spec(self, t: ParamSpecType) -> bool:
64376437
default = [t.default] if t.has_default() else []
6438-
return self.query_types([t.upper_bound, *default])
6438+
return self.query_types([t.upper_bound, *default, t.prefix])
64396439

64406440
def visit_type_var_tuple(self, t: TypeVarTupleType) -> bool:
64416441
default = [t.default] if t.has_default() else []

mypy/erasetype.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ def visit_type_var_tuple(self, t: TypeVarTupleType) -> Type:
222222
return t
223223

224224
def visit_param_spec(self, t: ParamSpecType) -> Type:
225+
# TODO: we should probably preserve prefix here.
225226
if self.erase_id is None or self.erase_id(t.id):
226227
return self.replacement
227228
return t

mypy/fixup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,7 @@ def visit_type_var(self, tvt: TypeVarType) -> None:
347347
def visit_param_spec(self, p: ParamSpecType) -> None:
348348
p.upper_bound.accept(self)
349349
p.default.accept(self)
350+
p.prefix.accept(self)
350351

351352
def visit_type_var_tuple(self, t: TypeVarTupleType) -> None:
352353
t.tuple_fallback.accept(self)

mypy/indirection.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ def visit_type_var(self, t: types.TypeVarType) -> None:
9393
def visit_param_spec(self, t: types.ParamSpecType) -> None:
9494
self._visit(t.upper_bound)
9595
self._visit(t.default)
96+
self._visit(t.prefix)
9697

9798
def visit_type_var_tuple(self, t: types.TypeVarTupleType) -> None:
9899
self._visit(t.upper_bound)

mypy/server/astdiff.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,7 @@ def visit_param_spec(self, typ: ParamSpecType) -> SnapshotItem:
435435
typ.flavor,
436436
snapshot_type(typ.upper_bound),
437437
snapshot_type(typ.default),
438+
snapshot_type(typ.prefix),
438439
)
439440

440441
def visit_type_var_tuple(self, typ: TypeVarTupleType) -> SnapshotItem:

mypy/server/astmerge.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -489,6 +489,7 @@ def visit_type_var(self, typ: TypeVarType) -> None:
489489
def visit_param_spec(self, typ: ParamSpecType) -> None:
490490
typ.upper_bound.accept(self)
491491
typ.default.accept(self)
492+
typ.prefix.accept(self)
492493

493494
def visit_type_var_tuple(self, typ: TypeVarTupleType) -> None:
494495
typ.upper_bound.accept(self)

mypy/server/deps.py

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1037,10 +1037,8 @@ def visit_type_var(self, typ: TypeVarType) -> list[str]:
10371037
triggers = []
10381038
if typ.fullname:
10391039
triggers.append(make_trigger(typ.fullname))
1040-
if typ.upper_bound:
1041-
triggers.extend(self.get_type_triggers(typ.upper_bound))
1042-
if typ.default:
1043-
triggers.extend(self.get_type_triggers(typ.default))
1040+
triggers.extend(self.get_type_triggers(typ.upper_bound))
1041+
triggers.extend(self.get_type_triggers(typ.default))
10441042
for val in typ.values:
10451043
triggers.extend(self.get_type_triggers(val))
10461044
return triggers
@@ -1049,22 +1047,17 @@ def visit_param_spec(self, typ: ParamSpecType) -> list[str]:
10491047
triggers = []
10501048
if typ.fullname:
10511049
triggers.append(make_trigger(typ.fullname))
1052-
if typ.upper_bound:
1053-
triggers.extend(self.get_type_triggers(typ.upper_bound))
1054-
if typ.default:
1055-
triggers.extend(self.get_type_triggers(typ.default))
10561050
triggers.extend(self.get_type_triggers(typ.upper_bound))
1051+
triggers.extend(self.get_type_triggers(typ.default))
1052+
triggers.extend(self.get_type_triggers(typ.prefix))
10571053
return triggers
10581054

10591055
def visit_type_var_tuple(self, typ: TypeVarTupleType) -> list[str]:
10601056
triggers = []
10611057
if typ.fullname:
10621058
triggers.append(make_trigger(typ.fullname))
1063-
if typ.upper_bound:
1064-
triggers.extend(self.get_type_triggers(typ.upper_bound))
1065-
if typ.default:
1066-
triggers.extend(self.get_type_triggers(typ.default))
10671059
triggers.extend(self.get_type_triggers(typ.upper_bound))
1060+
triggers.extend(self.get_type_triggers(typ.default))
10681061
return triggers
10691062

10701063
def visit_unpack_type(self, typ: UnpackType) -> list[str]:

mypy/type_visitor.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,7 @@ def visit_type_var(self, t: TypeVarType, /) -> bool:
525525
return self.query_types([t.upper_bound, t.default] + t.values)
526526

527527
def visit_param_spec(self, t: ParamSpecType, /) -> bool:
528-
return self.query_types([t.upper_bound, t.default])
528+
return self.query_types([t.upper_bound, t.default, t.prefix])
529529

530530
def visit_type_var_tuple(self, t: TypeVarTupleType, /) -> bool:
531531
return self.query_types([t.upper_bound, t.default])

mypy/typeanal.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2615,7 +2615,7 @@ def visit_type_var(self, t: TypeVarType) -> None:
26152615
self.process_types([t.upper_bound, t.default] + t.values)
26162616

26172617
def visit_param_spec(self, t: ParamSpecType) -> None:
2618-
self.process_types([t.upper_bound, t.default])
2618+
self.process_types([t.upper_bound, t.default, t.prefix])
26192619

26202620
def visit_type_var_tuple(self, t: TypeVarTupleType) -> None:
26212621
self.process_types([t.upper_bound, t.default])

mypy/typetraverser.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ def visit_type_var(self, t: TypeVarType, /) -> None:
6464
t.default.accept(self)
6565

6666
def visit_param_spec(self, t: ParamSpecType, /) -> None:
67+
# TODO: do we need to traverse prefix here?
6768
t.default.accept(self)
6869

6970
def visit_parameters(self, t: Parameters, /) -> None:

0 commit comments

Comments
 (0)