@@ -191,7 +191,15 @@ def _has_relation(
191191 right : GradualType ,
192192 relation : Literal [Relation .SUBTYPE , Relation .ASSIGNABLE ],
193193 ctx : CanAssignContext ,
194+ * ,
195+ original_left : Optional [GradualType ] = None ,
196+ original_right : Optional [GradualType ] = None ,
194197) -> CanAssign :
198+ if original_right is None :
199+ original_right = right
200+ if original_left is None :
201+ original_left = left
202+
195203 # TypeVarValue
196204 if isinstance (left , TypeVarValue ):
197205 if left == right :
@@ -224,7 +232,7 @@ def _has_relation(
224232 # AnnotatedValue
225233 if isinstance (left , AnnotatedValue ):
226234 left_inner = gradualize (left .value )
227- can_assign = _has_relation (left_inner , right , relation , ctx )
235+ can_assign = _has_relation (left_inner , right , relation , ctx , original_left = left )
228236 if isinstance (can_assign , CanAssignError ):
229237 return can_assign
230238 bounds_maps = [can_assign ]
@@ -234,9 +242,11 @@ def _has_relation(
234242 return custom_can_assign
235243 bounds_maps .append (custom_can_assign )
236244 return unify_bounds_maps (bounds_maps )
237- if isinstance (right , AnnotatedValue ) and not isinstance ( left , MultiValuedValue ) :
245+ if isinstance (right , AnnotatedValue ):
238246 right_inner = gradualize (right .value )
239- can_assign = _has_relation (left , right_inner , relation , ctx )
247+ can_assign = _has_relation (
248+ left , right_inner , relation , ctx , original_right = right
249+ )
240250 if isinstance (can_assign , CanAssignError ):
241251 return can_assign
242252 bounds_maps = [can_assign ]
@@ -247,19 +257,34 @@ def _has_relation(
247257 bounds_maps .append (custom_can_assign )
248258 return unify_bounds_maps (bounds_maps )
249259
260+ # NewTypeValue
261+ if isinstance (left , NewTypeValue ):
262+ if isinstance (right , NewTypeValue ):
263+ if left .newtype is right .newtype :
264+ return {}
265+ else :
266+ return CanAssignError (f"{ right } is not { relation .description } { left } " )
267+ elif isinstance (right , AnyValue ):
268+ pass
269+ else :
270+ return CanAssignError (f"{ right } is not { relation .description } { left } " )
271+ if isinstance (right , NewTypeValue ):
272+ right_inner = gradualize (right .value )
273+ return _has_relation (left , right_inner , relation , ctx , original_right = right )
274+
250275 # IntersectionValue
251276 if isinstance (left , IntersectionValue ):
252277 # Try to simplify first
253278 left = intersect_multi (left .vals , ctx )
254279 if not isinstance (left , IntersectionValue ):
255- return _has_relation (left , right , relation , ctx )
280+ return _has_relation (left , original_right , relation , ctx )
256281 if isinstance (right , IntersectionValue ):
257282 right = intersect_multi (right .vals , ctx )
258283 # Must be a subtype of all the members
259284 bounds_maps = []
260285 errors = []
261286 for val in left .vals :
262- can_assign = _has_relation (gradualize (val ), right , relation , ctx )
287+ can_assign = _has_relation (gradualize (val ), original_right , relation , ctx )
263288 if isinstance (can_assign , CanAssignError ):
264289 errors .append (can_assign )
265290 else :
@@ -272,12 +297,12 @@ def _has_relation(
272297 if isinstance (right , IntersectionValue ):
273298 right = intersect_multi (right .vals , ctx )
274299 if not isinstance (right , IntersectionValue ):
275- return _has_relation (left , right , relation , ctx )
300+ return _has_relation (original_left , right , relation , ctx )
276301 # At least one member must be a subtype
277302 bounds_maps = []
278303 errors = []
279304 for val in right .vals :
280- can_assign = _has_relation (left , gradualize (val ), relation , ctx )
305+ can_assign = _has_relation (original_left , gradualize (val ), relation , ctx )
281306 if isinstance (can_assign , CanAssignError ):
282307 errors .append (can_assign )
283308 else :
@@ -304,7 +329,7 @@ def _has_relation(
304329 errors = []
305330 for val in left .vals :
306331 val = gradualize (val )
307- can_assign = _has_relation (val , right , relation , ctx )
332+ can_assign = _has_relation (val , original_right , relation , ctx )
308333 if isinstance (can_assign , CanAssignError ):
309334 errors .append (can_assign )
310335 else :
@@ -326,7 +351,7 @@ def _has_relation(
326351 bounds_maps = []
327352 for val in right .vals :
328353 val = gradualize (val )
329- can_assign = _has_relation (left , val , relation , ctx )
354+ can_assign = _has_relation (original_left , val , relation , ctx )
330355 if isinstance (can_assign , CanAssignError ):
331356 # Adding an additional layer here isn't helpful
332357 return can_assign
@@ -359,6 +384,7 @@ def _has_relation(
359384 return {} # Any is assignable to everything
360385 else :
361386 assert_never (relation )
387+ assert not isinstance (left , NewTypeValue )
362388
363389 # SyntheticModuleValue
364390 if isinstance (left , SyntheticModuleValue ):
@@ -395,19 +421,6 @@ def _has_relation(
395421 if isinstance (right , ParamSpecKwargsValue ):
396422 return has_relation (left , right .get_fallback_value (), relation , ctx )
397423
398- # NewTypeValue
399- if isinstance (left , NewTypeValue ):
400- if isinstance (right , NewTypeValue ):
401- if left .newtype is right .newtype :
402- return {}
403- else :
404- return CanAssignError (f"{ right } is not { relation .description } { left } " )
405- else :
406- return CanAssignError (f"{ right } is not { relation .description } { left } " )
407- if isinstance (right , NewTypeValue ):
408- right_inner = gradualize (right .value )
409- return _has_relation (left , right_inner , relation , ctx )
410-
411424 # UnboundMethodValue
412425 if isinstance (left , UnboundMethodValue ):
413426 if isinstance (right , UnboundMethodValue ) and left == right :
0 commit comments