|
7 | 7 | UninhabitedType, TypeType, TypeOfAny, Overloaded, FunctionLike, LiteralType,
|
8 | 8 | ProperType, get_proper_type, get_proper_types, TypeAliasType, TypeGuardType
|
9 | 9 | )
|
10 |
| -from mypy.sametypes import is_same_type |
11 | 10 | from mypy.subtypes import is_equivalent, is_subtype, is_callable_compatible, is_proper_subtype
|
12 | 11 | from mypy.erasetype import erase_type
|
13 | 12 | from mypy.maptype import map_instance_to_supertype
|
@@ -71,17 +70,15 @@ def narrow_declared_type(declared: Type, narrowed: Type) -> Type:
|
71 | 70 | for x in narrowed.relevant_items()])
|
72 | 71 | elif isinstance(narrowed, AnyType):
|
73 | 72 | return narrowed
|
| 73 | + elif isinstance(narrowed, TypeVarType) and is_subtype(narrowed.upper_bound, declared): |
| 74 | + return narrowed |
74 | 75 | elif isinstance(declared, TypeType) and isinstance(narrowed, TypeType):
|
75 | 76 | return TypeType.make_normalized(narrow_declared_type(declared.item, narrowed.item))
|
76 | 77 | elif (isinstance(declared, TypeType)
|
77 | 78 | and isinstance(narrowed, Instance)
|
78 | 79 | and narrowed.type.is_metaclass()):
|
79 | 80 | # We'd need intersection types, so give up.
|
80 | 81 | return declared
|
81 |
| - elif isinstance(narrowed, TypeVarType): |
82 |
| - if is_same_type(narrowed.upper_bound, meet_types(narrowed.upper_bound, declared)): |
83 |
| - return narrowed |
84 |
| - return meet_types(declared, narrowed) |
85 | 82 | elif isinstance(declared, (Instance, TupleType, TypeType, LiteralType)):
|
86 | 83 | return meet_types(declared, narrowed)
|
87 | 84 | elif isinstance(declared, TypedDictType) and isinstance(narrowed, Instance):
|
|
0 commit comments