@@ -307,3 +307,57 @@ reveal_type(u(2.3, 1)) # E: Revealed type is 'builtins.float*'
307307reveal_type(u(False, 2.2)) # E: Revealed type is 'builtins.float*'
308308reveal_type(u(2.2, False)) # E: Revealed type is 'builtins.float*'
309309[builtins fixtures/primitives.pyi]
310+
311+ [case testSimplifyingUnionWithTypeTypes1]
312+ from typing import TypeVar, Union, Type, Any
313+
314+ T = TypeVar('T')
315+ S = TypeVar('S')
316+ def u(x: T, y: S) -> Union[S, T]: pass
317+
318+ t_o = None # type: Type[object]
319+ t_s = None # type: Type[str]
320+ t_a = None # type: Type[Any]
321+
322+ # Two identical items
323+ reveal_type(u(t_o, t_o)) # E: Revealed type is 'Type[builtins.object]'
324+ reveal_type(u(t_s, t_s)) # E: Revealed type is 'Type[builtins.str]'
325+ reveal_type(u(t_a, t_a)) # E: Revealed type is 'Type[Any]'
326+ reveal_type(u(type, type)) # E: Revealed type is 'def (x: builtins.Any) -> builtins.type'
327+
328+ # One type, other non-type
329+ reveal_type(u(t_s, 1)) # E: Revealed type is 'Union[builtins.int*, Type[builtins.str]]'
330+ reveal_type(u(1, t_s)) # E: Revealed type is 'Union[Type[builtins.str], builtins.int*]'
331+ reveal_type(u(type, 1)) # E: Revealed type is 'Union[builtins.int*, def (x: builtins.Any) -> builtins.type]'
332+ reveal_type(u(1, type)) # E: Revealed type is 'Union[def (x: builtins.Any) -> builtins.type, builtins.int*]'
333+ reveal_type(u(t_a, 1)) # E: Revealed type is 'Union[builtins.int*, Type[Any]]'
334+ reveal_type(u(1, t_a)) # E: Revealed type is 'Union[Type[Any], builtins.int*]'
335+ reveal_type(u(t_o, 1)) # E: Revealed type is 'Union[builtins.int*, Type[builtins.object]]'
336+ reveal_type(u(1, t_o)) # E: Revealed type is 'Union[Type[builtins.object], builtins.int*]'
337+
338+ [case testSimplifyingUnionWithTypeTypes2]
339+ from typing import TypeVar, Union, Type, Any
340+
341+ T = TypeVar('T')
342+ S = TypeVar('S')
343+ def u(x: T, y: S) -> Union[S, T]: pass
344+
345+ t_o = None # type: Type[object]
346+ t_s = None # type: Type[str]
347+ t_a = None # type: Type[Any]
348+
349+ # Union with object
350+ reveal_type(u(t_o, object())) # E: Revealed type is 'builtins.object*'
351+ reveal_type(u(object(), t_o)) # E: Revealed type is 'builtins.object*'
352+ reveal_type(u(t_s, object())) # E: Revealed type is 'builtins.object*'
353+ reveal_type(u(object(), t_s)) # E: Revealed type is 'builtins.object*'
354+ reveal_type(u(t_a, object())) # E: Revealed type is 'builtins.object*'
355+ reveal_type(u(object(), t_a)) # E: Revealed type is 'builtins.object*'
356+
357+ # Union between type objects
358+ reveal_type(u(t_o, t_a)) # E: Revealed type is 'Union[Type[Any], Type[builtins.object]]'
359+ reveal_type(u(t_a, t_o)) # E: Revealed type is 'Union[Type[builtins.object], Type[Any]]'
360+ reveal_type(u(t_s, t_o)) # E: Revealed type is 'Type[builtins.object]'
361+ reveal_type(u(t_o, t_s)) # E: Revealed type is 'Type[builtins.object]'
362+ reveal_type(u(t_o, type)) # E: Revealed type is 'Type[builtins.object]'
363+ reveal_type(u(type, t_o)) # E: Revealed type is 'Type[builtins.object]'
0 commit comments