@@ -94,6 +94,36 @@ def meet_types(s: Type, t: Type) -> ProperType:
9494 return s
9595 return t
9696
97+ # special casing for dealing with last known values
98+ if is_proper_subtype (s , t , ignore_promotions = True ) and is_proper_subtype (
99+ t , s , ignore_promotions = True
100+ ):
101+ lkv : LiteralType | None
102+ if s .last_known_value is None and t .last_known_value is None :
103+ # Both types have no last known value, so we return the original type.
104+ lkv = None
105+ elif s .last_known_value is None and t .last_known_value is not None :
106+ lkv = t .last_known_value
107+ elif s .last_known_value is not None and t .last_known_value is None :
108+ lkv = s .last_known_value
109+ elif s .last_known_value is not None and t .last_known_value is not None :
110+ lkv_meet = meet_types (s .last_known_value , t .last_known_value )
111+ if isinstance (lkv_meet , UninhabitedType ):
112+ lkv = None
113+ elif isinstance (lkv_meet , LiteralType ):
114+ lkv = lkv_meet
115+ else :
116+ msg = (
117+ f"Unexpected meet result for last known values: "
118+ f"{ s .last_known_value = } and { t .last_known_value = } "
119+ f"resulted in { lkv_meet = } "
120+ )
121+ raise ValueError (msg )
122+ else :
123+ assert False
124+ assert lkv is None or isinstance (lkv , LiteralType )
125+ return t .copy_modified (last_known_value = lkv )
126+
97127 if not isinstance (s , UnboundType ) and not isinstance (t , UnboundType ):
98128 if is_proper_subtype (s , t , ignore_promotions = True ):
99129 return s
@@ -1088,8 +1118,12 @@ def visit_typeddict_type(self, t: TypedDictType) -> ProperType:
10881118 def visit_literal_type (self , t : LiteralType ) -> ProperType :
10891119 if isinstance (self .s , LiteralType ) and self .s == t :
10901120 return t
1091- elif isinstance (self .s , Instance ) and is_subtype (t .fallback , self .s ):
1092- return t
1121+ elif isinstance (self .s , Instance ):
1122+ if is_subtype (t .fallback , self .s ):
1123+ return t
1124+ if self .s .last_known_value is not None :
1125+ return meet_types (self .s .last_known_value , t )
1126+ return self .default (self .s )
10931127 else :
10941128 return self .default (self .s )
10951129
0 commit comments