Skip to content

Commit e743fe4

Browse files
ilevkivskyigvanrossum
authored andcommitted
Move typevar 'freezing' to analyze_member_access (#2847)
This is a follow-up of PR #2809. This PR makes a more robust fix by moving the relevant piece of code from visit_member_expr to analyze_member_access. The latter, as noted by @JukkaL also used few times outside the former (for example in analyze_super).
1 parent 3675be7 commit e743fe4

File tree

3 files changed

+26
-8
lines changed

3 files changed

+26
-8
lines changed

mypy/checkexpr.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -998,13 +998,6 @@ def analyze_ordinary_member_access(self, e: MemberExpr,
998998
e.name, original_type, e, is_lvalue, False, False,
999999
self.named_type, self.not_ready_callback, self.msg,
10001000
original_type=original_type, chk=self.chk)
1001-
if isinstance(member_type, CallableType):
1002-
for v in member_type.variables:
1003-
v.id.meta_level = 0
1004-
if isinstance(member_type, Overloaded):
1005-
for it in member_type.items():
1006-
for v in it.variables:
1007-
v.id.meta_level = 0
10081001
if is_lvalue:
10091002
return member_type
10101003
else:

mypy/checkmember.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,9 @@ def analyze_member_access(name: str,
8888
else:
8989
signature = bind_self(signature, original_type)
9090
typ = map_instance_to_supertype(typ, method.info)
91-
return expand_type_by_instance(signature, typ)
91+
member_type = expand_type_by_instance(signature, typ)
92+
freeze_type_vars(member_type)
93+
return member_type
9294
else:
9395
# Not a method.
9496
return analyze_member_var_access(name, typ, info, node,
@@ -298,6 +300,16 @@ def analyze_var(name: str, var: Var, itype: Instance, info: TypeInfo, node: Cont
298300
return AnyType()
299301

300302

303+
def freeze_type_vars(member_type: Type) -> None:
304+
if isinstance(member_type, CallableType):
305+
for v in member_type.variables:
306+
v.id.meta_level = 0
307+
if isinstance(member_type, Overloaded):
308+
for it in member_type.items():
309+
for v in it.variables:
310+
v.id.meta_level = 0
311+
312+
301313
def handle_partial_attribute_type(typ: PartialType, is_lvalue: bool, msg: MessageBuilder,
302314
context: Context) -> Type:
303315
if typ.type is None:

test-data/unit/check-incremental.test

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1834,6 +1834,19 @@ class D:
18341834
g = D().m # This should not crash: see https://github.com/python/mypy/issues/2804
18351835
[builtins fixtures/dict.pyi]
18361836

1837+
[case testGenericMethodRestoreMetaLevel3]
1838+
from typing import TypeVar
1839+
T = TypeVar('T')
1840+
1841+
class C:
1842+
def m(self, x: T) -> T:
1843+
return x
1844+
1845+
class D(C):
1846+
def __init__(self) -> None:
1847+
self.d = super().m # This should not crash: see https://github.com/python/mypy/issues/2804
1848+
[builtins fixtures/dict.pyi]
1849+
18371850
[case testIncrementalPerFileFlags]
18381851
# flags: --config-file tmp/mypy.ini
18391852
import a

0 commit comments

Comments
 (0)