@@ -3733,30 +3733,7 @@ def find_isinstance_check_helper(self, node: Expression) -> Tuple[TypeMap, TypeM
3733
3733
return {}, {}
3734
3734
expr = node .args [0 ]
3735
3735
if literal (expr ) == LITERAL_TYPE :
3736
- vartype = get_proper_type (type_map [expr ])
3737
- type = get_isinstance_type (node .args [1 ], type_map )
3738
- if isinstance (vartype , UnionType ):
3739
- union_list = []
3740
- for t in get_proper_types (vartype .items ):
3741
- if isinstance (t , TypeType ):
3742
- union_list .append (t .item )
3743
- else :
3744
- # This is an error that should be reported earlier
3745
- # if we reach here, we refuse to do any type inference.
3746
- return {}, {}
3747
- vartype = UnionType (union_list )
3748
- elif isinstance (vartype , TypeType ):
3749
- vartype = vartype .item
3750
- elif (isinstance (vartype , Instance ) and
3751
- vartype .type .fullname == 'builtins.type' ):
3752
- vartype = self .named_type ('builtins.object' )
3753
- else :
3754
- # Any other object whose type we don't know precisely
3755
- # for example, Any or a custom metaclass.
3756
- return {}, {} # unknown type
3757
- yes_map , no_map = conditional_type_map (expr , vartype , type )
3758
- yes_map , no_map = map (convert_to_typetype , (yes_map , no_map ))
3759
- return yes_map , no_map
3736
+ return self .infer_issubclass_maps (node , expr , type_map )
3760
3737
elif refers_to_fullname (node .callee , 'builtins.callable' ):
3761
3738
if len (node .args ) != 1 : # the error will be reported elsewhere
3762
3739
return {}, {}
@@ -4367,6 +4344,39 @@ def push_type_map(self, type_map: 'TypeMap') -> None:
4367
4344
for expr , type in type_map .items ():
4368
4345
self .binder .put (expr , type )
4369
4346
4347
+ def infer_issubclass_maps (self , node : CallExpr ,
4348
+ expr : Expression ,
4349
+ type_map : Dict [Expression , Type ]
4350
+ ) -> Tuple [TypeMap , TypeMap ]:
4351
+ """Infer type restrictions for an expression in issubclass call."""
4352
+ vartype = type_map [expr ]
4353
+ type = get_isinstance_type (node .args [1 ], type_map )
4354
+ if isinstance (vartype , TypeVarType ):
4355
+ vartype = vartype .upper_bound
4356
+ vartype = get_proper_type (vartype )
4357
+ if isinstance (vartype , UnionType ):
4358
+ union_list = []
4359
+ for t in get_proper_types (vartype .items ):
4360
+ if isinstance (t , TypeType ):
4361
+ union_list .append (t .item )
4362
+ else :
4363
+ # This is an error that should be reported earlier
4364
+ # if we reach here, we refuse to do any type inference.
4365
+ return {}, {}
4366
+ vartype = UnionType (union_list )
4367
+ elif isinstance (vartype , TypeType ):
4368
+ vartype = vartype .item
4369
+ elif (isinstance (vartype , Instance ) and
4370
+ vartype .type .fullname == 'builtins.type' ):
4371
+ vartype = self .named_type ('builtins.object' )
4372
+ else :
4373
+ # Any other object whose type we don't know precisely
4374
+ # for example, Any or a custom metaclass.
4375
+ return {}, {} # unknown type
4376
+ yes_map , no_map = conditional_type_map (expr , vartype , type )
4377
+ yes_map , no_map = map (convert_to_typetype , (yes_map , no_map ))
4378
+ return yes_map , no_map
4379
+
4370
4380
4371
4381
def conditional_type_map (expr : Expression ,
4372
4382
current_type : Optional [Type ],
0 commit comments