8000 Special-case joining Type[] with builtins.type. · python/mypy@786ef96 · GitHub
[go: up one dir, main page]

Skip to content

Commit 786ef96

Browse files
author
Guido van Rossum
committed
Special-case joining Type[] with builtins.type.
Also add tests.
1 parent 6029c9d commit 786ef96

File tree

3 files changed

+23
-7
lines changed

3 files changed

+23
-7
lines changed

mypy/meet.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,8 @@ def visit_instance(self, t: Instance) -> Type:
185185
return self.s
186186
else:
187187
return NoneTyp()
188+
elif isinstance(self.s, TypeType):
189+
return meet_types(t, self.s)
188190
else:
189191
return self.default(self.s)
190192

@@ -210,9 +212,13 @@ def visit_partial_type(self, t: PartialType) -> Type:
210212

211213
def visit_type_type(self, t: TypeType) -> Type:
212214
if isinstance(self.s, TypeType):
213-
return TypeType(self.meet(t.item, self.s.item), line=t.line)
215+
typ = self.meet(t.item, self.s.item)
216+
if not isinstance(typ, NoneTyp):
217+
typ = TypeType(typ, line=t.line)
218+
return typ
219+
elif isinstance(self.s, Instance) and self.s.type.fullname() == 'builtins.type':
220+
return t
214221
else:
215-
# XXX Other cases, e.g. type <--> Type[]?
216222
return NoneTyp()
217223

218224
def meet(self, s, t):

mypy/test/testtypes.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ def test_erase_with_type_object(self):
179179

180180
def test_erase_with_type_type(self):
181181
self.assert_erase(self.fx.type_a, self.fx.type_a)
182-
self.assert_erase(self.fx.type_t, TypeType(self.fx.anyt))
182+
self.assert_erase(self.fx.type_t, self.fx.type_any)
183183

184184
def assert_erase(self, orig, result):
185185
assert_equal(str(erase_type(orig)), str(result))
@@ -497,11 +497,11 @@ def test_simple_type_objects(self):
497497

498498
def test_type_type(self):
499499
self.assert_join(self.fx.type_a, self.fx.type_b, self.fx.type_a)
500-
self.assert_join(self.fx.type_b, TypeType(self.fx.anyt), TypeType(self.fx.anyt))
500+
self.assert_join(self.fx.type_b, self.fx.type_any, self.fx.type_any)
501501
self.assert_join(self.fx.type_b, self.fx.type_type, self.fx.type_type)
502502
self.assert_join(self.fx.type_b, self.fx.type_c, self.fx.type_a)
503503
self.assert_join(self.fx.type_c, self.fx.type_d, TypeType(self.fx.o))
504-
self.assert_join(self.fx.type_type, TypeType(self.fx.anyt), self.fx.type_type)
504+
self.assert_join(self.fx.type_type, self.fx.type_any, self.fx.type_type)
505505
self.assert_join(self.fx.type_b, self.fx.anyt, self.fx.anyt)
506506

507507
# There are additional test cases in check-inference.test.
@@ -691,13 +691,13 @@ def test_meet_interface_types(self):
691691
self.assert_meet(self.fx.f, self.fx.f2, self.fx.nonet)
692692
self.assert_meet(self.fx.f, self.fx.f3, self.fx.f3)
693693

694-
def test_join_interface_and_class_types(self):
694+
def test_meet_interface_and_class_types(self):
695695
self.assert_meet(self.fx.o, self.fx.f, self.fx.f)
696696
self.assert_meet(self.fx.a, self.fx.f, self.fx.nonet)
697697

698698
self.assert_meet(self.fx.e, self.fx.f, self.fx.e)
699699

700-
def test_join_class_types_with_shared_interfaces(self):
700+
def test_meet_class_types_with_shared_interfaces(self):
701701
# These have nothing special with respect to meets, unlike joins. These
702702
# are for completeness only.
703703
self.assert_meet(self.fx.e, self.fx.e2, self.fx.nonet)
@@ -712,6 +712,15 @@ def test_meet_with_generic_interfaces(self):
712712
self.assert_meet(fx.gfa, fx.gfa, fx.gfa)
713713
self.assert_meet(fx.gfb, fx.m1, fx.nonet)
714714

715+
def test_type_type(self):
716+
self.assert_meet(self.fx.type_a, self.fx.type_b, self.fx.type_b)
717+
self.assert_meet(self.fx.type_b, self.fx.type_any, self.fx.type_b)
718+
self.assert_meet(self.fx.type_b, self.fx.type_type, self.fx.type_b)
719+
self.assert_meet(self.fx.type_b, self.fx.type_c, self.fx.nonet)
720+
self.assert_meet(self.fx.type_c, self.fx.type_d, self.fx.nonet)
721+
self.assert_meet(self.fx.type_type, self.fx.type_any, self.fx.type_any)
722+
self.assert_meet(self.fx.type_b, self.fx.anyt, self.fx.type_b)
723+
715724
# FIX generic interfaces + ranges
716725

717726
def assert_meet(self, s, t, meet):

mypy/typefixture.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ def __init__(self, variance: int=COVARIANT) -> None:
146146
self.type_c = TypeType(self.c)
147147
self.type_d = TypeType(self.d)
148148
self.type_t = TypeType(self.t)
149+
self.type_any = TypeType(self.anyt)
149150

150151
# Helper methods
151152

0 commit comments

Comments
 (0)
0