Skip to content

Commit f66199f

Browse files
authored
Propagate TypeVarType column in TypeAnalyser (#15304)
Also use keyword arguments + copy_modified for this in many places
1 parent cbf1665 commit f66199f

File tree

10 files changed

+52
-67
lines changed

10 files changed

+52
-67
lines changed

mypy/checkexpr.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4189,7 +4189,7 @@ def check_lst_expr(self, e: ListExpr | SetExpr | TupleExpr, fullname: str, tag:
41894189
# Used for list and set expressions, as well as for tuples
41904190
# containing star expressions that don't refer to a
41914191
# Tuple. (Note: "lst" stands for list-set-tuple. :-)
4192-
tv = TypeVarType("T", "T", -1, [], self.object_type())
4192+
tv = TypeVarType("T", "T", id=-1, values=[], upper_bound=self.object_type())
41934193
constructor = CallableType(
41944194
[tv],
41954195
[nodes.ARG_STAR],
@@ -4357,8 +4357,8 @@ def visit_dict_expr(self, e: DictExpr) -> Type:
43574357
return dt
43584358

43594359
# Define type variables (used in constructors below).
4360-
kt = TypeVarType("KT", "KT", -1, [], self.object_type())
4361-
vt = TypeVarType("VT", "VT", -2, [], self.object_type())
4360+
kt = TypeVarType("KT", "KT", id=-1, values=[], upper_bound=self.object_type())
4361+
vt = TypeVarType("VT", "VT", id=-2, values=[], upper_bound=self.object_type())
43624362

43634363
# Collect function arguments, watching out for **expr.
43644364
args: list[Expression] = []
@@ -4722,7 +4722,7 @@ def check_generator_or_comprehension(
47224722

47234723
# Infer the type of the list comprehension by using a synthetic generic
47244724
# callable type.
4725-
tv = TypeVarType("T", "T", -1, [], self.object_type())
4725+
tv = TypeVarType("T", "T", id=-1, values=[], upper_bound=self.object_type())
47264726
tv_list: list[Type] = [tv]
47274727
constructor = CallableType(
47284728
tv_list,
@@ -4742,8 +4742,8 @@ def visit_dictionary_comprehension(self, e: DictionaryComprehension) -> Type:
47424742

47434743
# Infer the type of the list comprehension by using a synthetic generic
47444744
# callable type.
4745-
ktdef = TypeVarType("KT", "KT", -1, [], self.object_type())
4746-
vtdef = TypeVarType("VT", "VT", -2, [], self.object_type())
4745+
ktdef = TypeVarType("KT", "KT", id=-1, values=[], upper_bound=self.object_type())
4746+
vtdef = TypeVarType("VT", "VT", id=-2, values=[], upper_bound=self.object_type())
47474747
constructor = CallableType(
47484748
[ktdef, vtdef],
47494749
[nodes.ARG_POS, nodes.ARG_POS],

mypy/copytype.py

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -69,15 +69,7 @@ def visit_instance(self, t: Instance) -> ProperType:
6969
return self.copy_common(t, dup)
7070

7171
def visit_type_var(self, t: TypeVarType) -> ProperType:
72-
dup = TypeVarType(
73-
t.name,
74-
t.fullname,
75-
t.id,
76-
values=t.values,
77-
upper_bound=t.upper_bound,
78-
variance=t.variance,
79-
)
80-
return self.copy_common(t, dup)
72+
return self.copy_common(t, t.copy_modified())
8173

8274
def visit_param_spec(self, t: ParamSpecType) -> ProperType:
8375
dup = ParamSpecType(t.name, t.fullname, t.id, t.flavor, t.upper_bound, prefix=t.prefix)

mypy/plugins/attrs.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -767,7 +767,11 @@ def _add_order(ctx: mypy.plugin.ClassDefContext, adder: MethodAdder) -> None:
767767
# def __lt__(self: AT, other: AT) -> bool
768768
# This way comparisons with subclasses will work correctly.
769769
tvd = TypeVarType(
770-
SELF_TVAR_NAME, ctx.cls.info.fullname + "." + SELF_TVAR_NAME, -1, [], object_type
770+
SELF_TVAR_NAME,
771+
ctx.cls.info.fullname + "." + SELF_TVAR_NAME,
772+
id=-1,
773+
values=[],
774+
upper_bound=object_type,
771775
)
772776
self_tvar_expr = TypeVarExpr(
773777
SELF_TVAR_NAME, ctx.cls.info.fullname + "." + SELF_TVAR_NAME, [], object_type

mypy/plugins/dataclasses.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,11 @@ def transform(self) -> bool:
268268
# the self type.
269269
obj_type = self._api.named_type("builtins.object")
270270
order_tvar_def = TypeVarType(
271-
SELF_TVAR_NAME, info.fullname + "." + SELF_TVAR_NAME, -1, [], obj_type
271+
SELF_TVAR_NAME,
272+
info.fullname + "." + SELF_TVAR_NAME,
273+
id=-1,
274+
values=[],
275+
upper_bound=obj_type,
272276
)
273277
order_return_type = self._api.named_type("builtins.bool")
274278
order_args = [

mypy/semanal.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1075,7 +1075,9 @@ def setup_self_type(self) -> None:
10751075
)
10761076
else:
10771077
return
1078-
info.self_type = TypeVarType("Self", f"{info.fullname}.Self", 0, [], fill_typevars(info))
1078+
info.self_type = TypeVarType(
1079+
"Self", f"{info.fullname}.Self", id=0, values=[], upper_bound=fill_typevars(info)
1080+
)
10791081

10801082
def visit_overloaded_func_def(self, defn: OverloadedFuncDef) -> None:
10811083
self.statement = defn

mypy/semanal_namedtuple.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -544,11 +544,11 @@ def add_field(
544544

545545
assert info.tuple_type is not None # Set by update_tuple_type() above.
546546
tvd = TypeVarType(
547-
SELF_TVAR_NAME,
548-
info.fullname + "." + SELF_TVAR_NAME,
549-
self.api.tvar_scope.new_unique_func_id(),
550-
[],
551-
info.tuple_type,
547+
name=SELF_TVAR_NAME,
548+
fullname=info.fullname + "." + SELF_TVAR_NAME,
549+
id=self.api.tvar_scope.new_unique_func_id(),
550+
values=[],
551+
upper_bound=info.tuple_type,
552552
)
553553
selftype = tvd
554554

mypy/tvar_scope.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,9 @@ def bind_new(self, name: str, tvar_expr: TypeVarLikeExpr) -> TypeVarLikeType:
9090
namespace = ""
9191
if isinstance(tvar_expr, TypeVarExpr):
9292
tvar_def: TypeVarLikeType = TypeVarType(
93-
name,
94-
tvar_expr.fullname,
95-
TypeVarId(i, namespace=namespace),
93+
name=name,
94+
fullname=tvar_expr.fullname,
95+
id=TypeVarId(i, namespace=namespace),
9696
values=tvar_expr.values,
9797
upper_bound=tvar_expr.upper_bound,
9898
variance=tvar_expr.variance,

mypy/typeanal.py

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -343,16 +343,7 @@ def visit_unbound_type_nonoptional(self, t: UnboundType, defining_literal: bool)
343343
f'Type variable "{t.name}" used with arguments', t, code=codes.VALID_TYPE
344344
)
345345
# Change the line number
346-
return TypeVarType(
347-
tvar_def.name,
348-
tvar_def.fullname,
349-
tvar_def.id,
350-
tvar_def.values,
351-
tvar_def.upper_bound,
352-
tvar_def.variance,
353-
line=t.line,
354-
column=t.column,
355-
)
346+
return tvar_def.copy_modified(line=t.line, column=t.column)
356347
if isinstance(sym.node, TypeVarTupleExpr) and (
357348
tvar_def is not None
358349
and self.defining_alias
@@ -1553,13 +1544,14 @@ def anal_type(self, t: Type, nested: bool = True, *, allow_param_spec: bool = Fa
15531544
def anal_var_def(self, var_def: TypeVarLikeType) -> TypeVarLikeType:
15541545
if isinstance(var_def, TypeVarType):
15551546
return TypeVarType(
1556-
var_def.name,
1557-
var_def.fullname,
1558-
var_def.id.raw_id,
1559-
self.anal_array(var_def.values),
1560-
var_def.upper_bound.accept(self),
1561-
var_def.variance,
1562-
var_def.line,
1547+
name=var_def.name,
1548+
fullname=var_def.fullname,
1549+
id=var_def.id.raw_id,
1550+
values=self.anal_array(var_def.values),
1551+
upper_bound=var_def.upper_bound.accept(self),
1552+
variance=var_def.variance,
1553+
line=var_def.line,
1554+
column=var_def.column,
15631555
)
15641556
else:
15651557
return var_def

mypy/types.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -596,14 +596,14 @@ def copy_modified(
596596
column: int = _dummy_int,
597597
) -> TypeVarType:
598598
return TypeVarType(
599-
self.name,
600-
self.fullname,
601-
self.id if id is _dummy else id,
602-
self.values if values is _dummy else values,
603-
self.upper_bound if upper_bound is _dummy else upper_bound,
604-
self.variance,
605-
self.line if line == _dummy_int else line,
606-
self.column if column == _dummy_int else column,
599+
name=self.name,
600+
fullname=self.fullname,
601+
id=self.id if id is _dummy else id,
602+
values=self.values if values is _dummy else values,
603+
upper_bound=self.upper_bound if upper_bound is _dummy else upper_bound,
604+
variance=self.variance,
605+
line=self.line if line == _dummy_int else line,
606+
column=self.column if column == _dummy_int else column,
607607
)
608608

609609
def accept(self, visitor: TypeVisitor[T]) -> T:
@@ -638,12 +638,12 @@ def serialize(self) -> JsonDict:
638638
def deserialize(cls, data: JsonDict) -> TypeVarType:
639639
assert data[".class"] == "TypeVarType"
640640
return TypeVarType(
641-
data["name"],
642-
data["fullname"],
643-
TypeVarId(data["id"], namespace=data["namespace"]),
644-
[deserialize_type(v) for v in data["values"]],
645-
deserialize_type(data["upper_bound"]),
646-
data["variance"],
641+
name=data["name"],
642+
fullname=data["fullname"],
643+
id=TypeVarId(data["id"], namespace=data["namespace"]),
644+
values=[deserialize_type(v) for v in data["values"]],
645+
upper_bound=deserialize_type(data["upper_bound"]),
646+
variance=data["variance"],
647647
)
648648

649649

mypy/typevars.py

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,7 @@ def fill_typevars(typ: TypeInfo) -> Instance | TupleType:
2727
tv: TypeVarLikeType | UnpackType = typ.defn.type_vars[i]
2828
# Change the line number
2929
if isinstance(tv, TypeVarType):
30-
tv = TypeVarType(
31-
tv.name,
32-
tv.fullname,
33-
tv.id,
34-
tv.values,
35-
tv.upper_bound,
36-
tv.variance,
37-
line=-1,
38-
column=-1,
39-
)
30+
tv = tv.copy_modified(line=-1, column=-1)
4031
elif isinstance(tv, TypeVarTupleType):
4132
tv = UnpackType(
4233
TypeVarTupleType(

0 commit comments

Comments
 (0)