@@ -191,7 +191,15 @@ def _has_relation(
191
191
right: GradualType,
192
192
relation: Literal[Relation.SUBTYPE, Relation.ASSIGNABLE],
193
193
ctx: CanAssignContext,
194
+ *,
195
+ original_left: Optional[GradualType] = None,
196
+ original_right: Optional[GradualType] = None,
194
197
) -> CanAssign:
198
+ if original_right is None:
199
+ original_right = right
200
+ if original_left is None:
201
+ original_left = left
202
+
195
203
# TypeVarValue
196
204
if isinstance(left, TypeVarValue):
197
205
if left == right:
@@ -224,7 +232,7 @@ def _has_relation(
224
232
# AnnotatedValue
225
233
if isinstance(left, AnnotatedValue):
226
234
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 )
228
236
if isinstance(can_assign, CanAssignError):
229
237
return can_assign
230
238
bounds_maps = [can_assign]
@@ -234,9 +242,11 @@ def _has_relation(
234
242
return custom_can_assign
235
243
bounds_maps.append(custom_can_assign)
236
244
return unify_bounds_maps(bounds_maps)
237
- if isinstance(right, AnnotatedValue) and not isinstance(left, MultiValuedValue) :
245
+ if isinstance(right, AnnotatedValue):
238
246
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
+ )
240
250
if isinstance(can_assign, CanAssignError):
241
251
return can_assign
242
252
bounds_maps = [can_assign]
@@ -247,19 +257,34 @@ def _has_relation(
247
257
bounds_maps.append(custom_can_assign)
248
258
return unify_bounds_maps(bounds_maps)
249
259
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
+
250
275
# IntersectionValue
251
276
if isinstance(left, IntersectionValue):
252
277
# Try to simplify first
253
278
left = intersect_multi(left.vals, ctx)
254
279
if not isinstance(left, IntersectionValue):
255
- return _has_relation(left, right , relation, ctx)
280
+ return _has_relation(left, original_right , relation, ctx)
256
281
if isinstance(right, IntersectionValue):
257
282
right = intersect_multi(right.vals, ctx)
258
283
# Must be a subtype of all the members
259
284
bounds_maps = []
260
285
errors = []
261
286
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)
263
288
if isinstance(can_assign, CanAssignError):
264
289
errors.append(can_assign)
265
290
else:
@@ -272,12 +297,12 @@ def _has_relation(
272
297
if isinstance(right, IntersectionValue):
273
298
right = intersect_multi(right.vals, ctx)
274
299
if not isinstance(right, IntersectionValue):
275
- return _has_relation(left , right, relation, ctx)
300
+ return _has_relation(original_left , right, relation, ctx)
276
301
# At least one member must be a subtype
277
302
bounds_maps = []
278
303
errors = []
279
304
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)
281
306
if isinstance(can_assign, CanAssignError):
282
307
errors.append(can_assign)
283
308
else:
@@ -304,7 +329,7 @@ def _has_relation(
304
329
errors = []
305
330
for val in left.vals:
306
331
val = gradualize(val)
307
- can_assign = _has_relation(val, right , relation, ctx)
332
+ can_assign = _has_relation(val, original_right , relation, ctx)
308
333
if isinstance(can_assign, CanAssignError):
309
334
errors.append(can_assign)
310
335
else:
@@ -326,7 +351,7 @@ def _has_relation(
326
351
bounds_maps = []
327
352
for val in right.vals:
328
353
val = gradualize(val)
329
- can_assign = _has_relation(left , val, relation, ctx)
354
+ can_assign = _has_relation(original_left , val, relation, ctx)
330
355
if isinstance(can_assign, CanAssignError):
331
356
# Adding an additional layer here isn't helpful
332
357
return can_assign
@@ -359,6 +384,7 @@ def _has_relation(
359
384
return {} # Any is assignable to everything
360
385
else:
361
386
assert_never(relation)
387
+ assert not isinstance(left, NewTypeValue)
362
388
363
389
# SyntheticModuleValue
364
390
if isinstance(left, SyntheticModuleValue):
@@ -395,19 +421,6 @@ def _has_relation(
395
421
if isinstance(right, ParamSpecKwargsValue):
396
422
return has_relation(left, right.get_fallback_value(), relation, ctx)
397
423
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
-
411
424
# UnboundMethodValue
412
425
if isinstance(left, UnboundMethodValue):
413
426
if isinstance(right, UnboundMethodValue) and left == right:
0 commit comments