@@ -713,6 +713,7 @@ elif x is Foo.C:
713
713
reveal_type(x) # N: Revealed type is 'Literal[__main__.Foo.C]'
714
714
else:
715
715
reveal_type(x) # No output here: this branch is unreachable
716
+ reveal_type(x) # N: Revealed type is '__main__.Foo'
716
717
717
718
if Foo.A is x:
718
719
reveal_type(x) # N: Revealed type is 'Literal[__main__.Foo.A]'
@@ -722,6 +723,7 @@ elif Foo.C is x:
722
723
reveal_type(x) # N: Revealed type is 'Literal[__main__.Foo.C]'
723
724
else:
724
725
reveal_type(x) # No output here: this branch is unreachable
726
+ reveal_type(x) # N: Revealed type is '__main__.Foo'
725
727
726
728
y: Foo
727
729
if y is Foo.A:
@@ -732,6 +734,7 @@ elif y is Foo.C:
732
734
reveal_type(y) # N: Revealed type is 'Literal[__main__.Foo.C]'
733
735
else:
734
736
reveal_type(y) # No output here: this branch is unreachable
737
+ reveal_type(y) # N: Revealed type is '__main__.Foo'
735
738
736
739
if Foo.A is y:
737
740
reveal_type(y) # N: Revealed type is 'Literal[__main__.Foo.A]'
@@ -741,6 +744,7 @@ elif Foo.C is y:
741
744
reveal_type(y) # N: Revealed type is 'Literal[__main__.Foo.C]'
742
745
else:
743
746
reveal_type(y) # No output here: this branch is unreachable
747
+ reveal_type(y) # N: Revealed type is '__main__.Foo'
744
748
[builtins fixtures/bool.pyi]
745
749
746
750
[case testEnumReachabilityChecksWithOrdering]
@@ -815,12 +819,14 @@ if x is y:
815
819
else:
816
820
reveal_type(x) # N: Revealed type is 'Union[Literal[__main__.Foo.B], Literal[__main__.Foo.C]]'
817
821
reveal_type(y) # N: Revealed type is 'Literal[__main__.Foo.A]'
822
+ reveal_type(x) # N: Revealed type is '__main__.Foo'
818
823
if y is x:
819
824
reveal_type(x) # N: Revealed type is 'Literal[__main__.Foo.A]'
820
825
reveal_type(y) # N: Revealed type is 'Literal[__main__.Foo.A]'
821
826
else:
822
827
reveal_type(x) # N: Revealed type is 'Union[Literal[__main__.Foo.B], Literal[__main__.Foo.C]]'
823
828
reveal_type(y) # N: Revealed type is 'Literal[__main__.Foo.A]'
829
+ reveal_type(x) # N: Revealed type is '__main__.Foo'
824
830
825
831
if x is z:
826
832
reveal_type(x) # N: Revealed type is 'Literal[__main__.Foo.A]'
@@ -830,6 +836,7 @@ else:
830
836
reveal_type(x) # N: Revealed type is 'Union[Literal[__main__.Foo.B], Literal[__main__.Foo.C]]'
831
837
reveal_type(z) # N: Revealed type is 'Literal[__main__.Foo.A]?'
832
838
accepts_foo_a(z)
839
+ reveal_type(x) # N: Revealed type is '__main__.Foo'
833
840
if z is x:
834
841
reveal_type(x) # N: Revealed type is 'Literal[__main__.Foo.A]'
835
842
reveal_type(z) # N: Revealed type is 'Literal[__main__.Foo.A]?'
@@ -838,6 +845,7 @@ else:
838
845
reveal_type(x) # N: Revealed type is 'Union[Literal[__main__.Foo.B], Literal[__main__.Foo.C]]'
839
846
reveal_type(z) # N: Revealed type is 'Literal[__main__.Foo.A]?'
840
847
accepts_foo_a(z)
848
+ reveal_type(x) # N: Revealed type is '__main__.Foo'
841
849
842
850
if y is z:
843
851
reveal_type(y) # N: Revealed type is 'Literal[__main__.Foo.A]'
@@ -909,6 +917,7 @@ if x is Foo.A:
909
917
reveal_type(x) # N: Revealed type is 'Literal[__main__.Foo.A]'
910
918
else:
911
919
reveal_type(x) # N: Revealed type is 'Union[Literal[__main__.Foo.B], Literal[__main__.Foo.C], None]'
920
+ reveal_type(x) # N: Revealed type is 'Union[__main__.Foo, None]'
912
921
[builtins fixtures/bool.pyi]
913
922
914
923
[case testEnumReachabilityWithMultipleEnums]
@@ -928,18 +937,21 @@ if x1 is Foo.A:
928
937
reveal_type(x1) # N: Revealed type is 'Literal[__main__.Foo.A]'
929
938
else:
930
939
reveal_type(x1) # N: Revealed type is 'Union[Literal[__main__.Foo.B], __main__.Bar]'
940
+ reveal_type(x1) # N: Revealed type is 'Union[__main__.Foo, __main__.Bar]'
931
941
932
942
x2: Union[Foo, Bar]
933
943
if x2 is Bar.A:
934
944
reveal_type(x2) # N: Revealed type is 'Literal[__main__.Bar.A]'
935
945
else:
936
946
reveal_type(x2) # N: Revealed type is 'Union[__main__.Foo, Literal[__main__.Bar.B]]'
947
+ reveal_type(x2) # N: Revealed type is 'Union[__main__.Foo, __main__.Bar]'
937
948
938
949
x3: Union[Foo, Bar]
939
950
if x3 is Foo.A or x3 is Bar.A:
940
951
reveal_type(x3) # N: Revealed type is 'Union[Literal[__main__.Foo.A], Literal[__main__.Bar.A]]'
941
952
else:
942
953
reveal_type(x3) # N: Revealed type is 'Union[Literal[__main__.Foo.B], Literal[__main__.Bar.B]]'
954
+ reveal_type(x3) # N: Revealed type is 'Union[__main__.Foo, __main__.Bar]'
943
955
944
956
[builtins fixtures/bool.pyi]
945
957
@@ -1299,3 +1311,25 @@ reveal_type(a._value_) # N: Revealed type is 'Any'
1299
1311
[builtins fixtures/__new__.pyi]
1300
1312
[builtins fixtures/primitives.pyi]
1301
1313
[typing fixtures/typing-medium.pyi]
1314
+
1315
+ [case testEnumNarrowedToTwoLiterals]
1316
+ # Regression test: two literals of an enum would be joined
1317
+ # as the full type, regardless of the amount of elements
1318
+ # the enum contains.
1319
+ from enum import Enum
1320
+ from typing import Union
1321
+ from typing_extensions import Literal
1322
+
1323
+ class Foo(Enum):
1324
+ A = 1
1325
+ B = 2
1326
+ C = 3
1327
+
1328
+ def f(x: Foo):
1329
+ if x is Foo.A:
1330
+ return x
1331
+ if x is Foo.B:
1332
+ pass
1333
+ reveal_type(x) # N: Revealed type is 'Union[Literal[__main__.Foo.B], Literal[__main__.Foo.C]]'
1334
+
1335
+ [builtins fixtures/bool.pyi]
0 commit comments