@@ -3726,35 +3726,7 @@ def find_isinstance_check(self, node: Expression
37263726 elif refers_to_fullname (node .callee , 'builtins.issubclass' ):
37273727 if len (node .args ) != 2 : # the error will be reported elsewhere
37283728 return {}, {}
3729- expr = node .args [0 ]
3730- if literal (expr ) == LITERAL_TYPE :
3731- vartype = get_proper_type (type_map [expr ])
3732- type = get_isinstance_type (node .args [1 ], type_map )
3733- if (isinstance (vartype , TypeVarType )):
3734- vartype = vartype .upper_bound
3735- vartype = get_proper_type (vartype )
3736- if isinstance (vartype , UnionType ):
3737- union_list = []
3738- for t in get_proper_types (vartype .items ):
3739- if isinstance (t , TypeType ):
3740- union_list .append (t .item )
3741- else :
3742- # This is an error that should be reported earlier
3743- # if we reach here, we refuse to do any type inference.
3744- return {}, {}
3745- vartype = UnionType (union_list )
3746- elif isinstance (vartype , TypeType ):
3747- vartype = vartype .item
3748- elif (isinstance (vartype , Instance ) and
3749- vartype .type .fullname () == 'builtins.type' ):
3750- vartype = self .named_type ('builtins.object' )
3751- else :
3752- # Any other object whose type we don't know precisely
3753- # for example, Any or a custom metaclass.
3754- return {}, {} # unknown type
3755- yes_map , no_map = conditional_type_map (expr , vartype , type )
3756- yes_map , no_map = map (convert_to_typetype , (yes_map , no_map ))
3757- return yes_map , no_map
3729+ return self .infer_issubclass_maps (node , type_map )
37583730 elif refers_to_fullname (node .callee , 'builtins.callable' ):
37593731 if len (node .args ) != 1 : # the error will be reported elsewhere
37603732 return {}, {}
@@ -4197,6 +4169,40 @@ def push_type_map(self, type_map: 'TypeMap') -> None:
41974169 for expr , type in type_map .items ():
41984170 self .binder .put (expr , type )
41994171
4172+ def infer_issubclass_maps (self , node : CallExpr ,
4173+ type_map : Dict [Expression , Type ]
4174+ ) -> Tuple [TypeMap , TypeMap ]:
4175+ expr = node .args [0 ]
4176+ if literal (expr ) == LITERAL_TYPE :
4177+ vartype = type_map [expr ]
4178+ type = get_isinstance_type (node .args [1 ], type_map )
4179+ if (isinstance (vartype , TypeVarType )):
4180+ vartype = vartype .upper_bound
4181+ vartype = get_proper_type (vartype )
4182+ if isinstance (vartype , UnionType ):
4183+ union_list = []
4184+ for t in get_proper_types (vartype .items ):
4185+ if isinstance (t , TypeType ):
4186+ union_list .append (t .item )
4187+ else :
4188+ # This is an error that should be reported earlier
4189+ # if we reach here, we refuse to do any type inference.
4190+ return {}, {}
4191+ vartype = UnionType (union_list )
4192+ elif isinstance (vartype , TypeType ):
4193+ vartype = vartype .item
4194+ elif (isinstance (vartype , Instance ) and
4195+ vartype .type .fullname () == 'builtins.type' ):
4196+ vartype = self .named_type ('builtins.object' )
4197+ else :
4198+ # Any other object whose type we don't know precisely
4199+ # for example, Any or a custom metaclass.
4200+ return {}, {} # unknown type
4201+ yes_map , no_map = conditional_type_map (expr , vartype , type )
4202+ yes_map , no_map = map (convert_to_typetype , (yes_map , no_map ))
4203+ return yes_map , no_map
4204+ return {}, {}
4205+
42004206
42014207def conditional_type_map (expr : Expression ,
42024208 current_type : Optional [Type ],
0 commit comments