@@ -618,9 +618,8 @@ reveal_type(B.a) # N: Revealed type is "Literal[__main__.B.a]?"
618
618
reveal_type(A.x.name) # N: Revealed type is "Literal['x']?"
619
619
reveal_type(B.a.name) # N: Revealed type is "Literal['a']?"
620
620
621
- # TODO: The revealed type should be 'int' here
622
- reveal_type(A.x.value) # N: Revealed type is "Any"
623
- reveal_type(B.a.value) # N: Revealed type is "Any"
621
+ reveal_type(A.x.value) # N: Revealed type is "builtins.int"
622
+ reveal_type(B.a.value) # N: Revealed type is "builtins.int"
624
623
[builtins fixtures/enum.pyi]
625
624
626
625
[case testAnonymousFunctionalEnum]
@@ -755,12 +754,10 @@ class B2(IntEnum):
755
754
class B3(IntEnum):
756
755
x = 1
757
756
758
- # TODO: getting B1.x._value_ and B2.x._value_ to have type 'int' requires a typeshed change
759
-
760
757
is_x(reveal_type(B1.x.name)) # N: Revealed type is "Literal['x']"
761
758
is_x(reveal_type(B1.x._name_)) # N: Revealed type is "Literal['x']"
762
759
reveal_type(B1.x.value) # N: Revealed type is "builtins.int"
763
- reveal_type(B1.x._value_) # N: Revealed type is "Any "
760
+ reveal_type(B1.x._value_) # N: Revealed type is "builtins.int "
764
761
is_x(reveal_type(B2.x.name)) # N: Revealed type is "Literal['x']"
765
762
is_x(reveal_type(B2.x._name_)) # N: Revealed type is "Literal['x']"
766
763
reveal_type(B2.x.value) # N: Revealed type is "builtins.int"
@@ -770,9 +767,6 @@ is_x(reveal_type(B3.x._name_)) # N: Revealed type is "Literal['x']"
770
767
reveal_type(B3.x.value) # N: Revealed type is "Literal[1]?"
771
768
reveal_type(B3.x._value_) # N: Revealed type is "Literal[1]?"
772
769
773
- # TODO: C1.x.value and C2.x.value should also be of type 'int'
774
- # This requires either a typeshed change or a plugin refinement
775
-
776
770
C1 = IntFlag('C1', 'x')
777
771
class C2(IntFlag):
778
772
x = auto()
@@ -781,8 +775,8 @@ class C3(IntFlag):
781
775
782
776
is_x(reveal_type(C1.x.name)) # N: Revealed type is "Literal['x']"
783
777
is_x(reveal_type(C1.x._name_)) # N: Revealed type is "Literal['x']"
784
- reveal_type(C1.x.value) # N: Revealed type is "Any "
785
- reveal_type(C1.x._value_) # N: Revealed type is "Any "
778
+ reveal_type(C1.x.value) # N: Revealed type is "builtins.int "
779
+ reveal_type(C1.x._value_) # N: Revealed type is "builtins.int "
786
780
is_x(reveal_type(C2.x.name)) # N: Revealed type is "Literal['x']"
787
781
is_x(reveal_type(C2.x._name_)) # N: Revealed type is "Literal['x']"
788
782
reveal_type(C2.x.value) # N: Revealed type is "builtins.int"
@@ -800,8 +794,8 @@ class D3(Flag):
800
794
801
795
is_x(reveal_type(D1.x.name)) # N: Revealed type is "Literal['x']"
802
796
is_x(reveal_type(D1.x._name_)) # N: Revealed type is "Literal['x']"
803
- reveal_type(D1.x.value) # N: Revealed type is "Any "
804
- reveal_type(D1.x._value_) # N: Revealed type is "Any "
797
+ reveal_type(D1.x.value) # N: Revealed type is "builtins.int "
798
+ reveal_type(D1.x._value_) # N: Revealed type is "builtins.int "
805
799
is_x(reveal_type(D2.x.name)) # N: Revealed type is "Literal['x']"
806
800
is_x(reveal_type(D2.x._name_)) # N: Revealed type is "Literal['x']"
807
801
reveal_type(D2.x.value) # N: Revealed type is "builtins.int"
@@ -2539,3 +2533,105 @@ def check(thing: Things) -> None:
2539
2533
return None
2540
2534
return None # E: Statement is unreachable
2541
2535
[builtins fixtures/enum.pyi]
2536
+
2537
+ [case testSunderValueTypeEllipsis]
2538
+ from foo.bar import (
2539
+ Basic, FromStub, InheritedInt, InheritedStr, InheritedFlag,
2540
+ InheritedIntFlag, Wrapper
2541
+ )
2542
+
2543
+ reveal_type(Basic.FOO) # N: Revealed type is "Literal[foo.bar.Basic.FOO]?"
2544
+ reveal_type(Basic.FOO.value) # N: Revealed type is "Literal[1]?"
2545
+ reveal_type(Basic.FOO._value_) # N: Revealed type is "builtins.int"
2546
+
2547
+ reveal_type(FromStub.FOO) # N: Revealed type is "Literal[foo.bar.FromStub.FOO]?"
2548
+ reveal_type(FromStub.FOO.value) # N: Revealed type is "builtins.int"
2549
+ reveal_type(FromStub.FOO._value_) # N: Revealed type is "builtins.int"
2550
+
2551
+ reveal_type(Wrapper.Nested.FOO) # N: Revealed type is "Literal[foo.bar.Wrapper.Nested.FOO]?"
2552
+ reveal_type(Wrapper.Nested.FOO.value) # N: Revealed type is "builtins.int"
2553
+ reveal_type(Wrapper.Nested.FOO._value_) # N: Revealed type is "builtins.int"
2554
+
2555
+ reveal_type(InheritedInt.FOO) # N: Revealed type is "Literal[foo.bar.InheritedInt.FOO]?"
2556
+ reveal_type(InheritedInt.FOO.value) # N: Revealed type is "builtins.int"
2557
+ reveal_type(InheritedInt.FOO._value_) # N: Revealed type is "builtins.int"
2558
+
2559
+ reveal_type(InheritedStr.FOO) # N: Revealed type is "Literal[foo.bar.InheritedStr.FOO]?"
2560
+ reveal_type(InheritedStr.FOO.value) # N: Revealed type is "builtins.str"
2561
+ reveal_type(InheritedStr.FOO._value_) # N: Revealed type is "builtins.str"
2562
+
2563
+ reveal_type(InheritedFlag.FOO) # N: Revealed type is "Literal[foo.bar.InheritedFlag.FOO]?"
2564
+ reveal_type(InheritedFlag.FOO.value) # N: Revealed type is "builtins.int"
2565
+ reveal_type(InheritedFlag.FOO._value_) # N: Revealed type is "builtins.int"
2566
+
2567
+ reveal_type(InheritedIntFlag.FOO) # N: Revealed type is "Literal[foo.bar.InheritedIntFlag.FOO]?"
2568
+ reveal_type(InheritedIntFlag.FOO.value) # N: Revealed type is "builtins.int"
2569
+ reveal_type(InheritedIntFlag.FOO._value_) # N: Revealed type is "builtins.int"
2570
+
2571
+ [file foo/__init__.pyi]
2572
+ [file foo/bar/__init__.pyi]
2573
+ from enum import Enum, IntEnum, StrEnum, Flag, IntFlag
2574
+
2575
+ class Basic(Enum):
2576
+ _value_: int
2577
+ FOO = 1
2578
+
2579
+ class FromStub(Enum):
2580
+ _value_: int
2581
+ FOO = ...
2582
+
2583
+ class Wrapper:
2584
+ class Nested(Enum):
2585
+ _value_: int
2586
+ FOO = ...
2587
+
2588
+ class InheritedInt(IntEnum):
2589
+ FOO = ...
2590
+
2591
+ class InheritedStr(StrEnum):
2592
+ FOO = ...
2593
+
2594
+ class InheritedFlag(Flag):
2595
+ FOO = ...
2596
+
2597
+ class InheritedIntFlag(IntFlag):
2598
+ FOO = ...
2599
+ [builtins fixtures/enum.pyi]
2600
+
2601
+ [case testSunderValueTypeEllipsisNonStub]
2602
+ from enum import Enum, StrEnum
2603
+
2604
+ class Basic(Enum):
2605
+ _value_: int
2606
+ FOO = 1
2607
+
2608
+ reveal_type(Basic.FOO) # N: Revealed type is "Literal[__main__.Basic.FOO]?"
2609
+ reveal_type(Basic.FOO.value) # N: Revealed type is "Literal[1]?"
2610
+ reveal_type(Basic.FOO._value_) # N: Revealed type is "builtins.int"
2611
+
2612
+ # TODO: this and below should produce diagnostics, Ellipsis is not assignable to int
2613
+ # Now we do not check members against _value_ at all.
2614
+
2615
+ class FromStub(Enum):
2616
+ _value_: int
2617
+ FOO = ...
2618
+
2619
+ reveal_type(FromStub.FOO) # N: Revealed type is "Literal[__main__.FromStub.FOO]?"
2620
+ reveal_type(FromStub.FOO.value) # N: Revealed type is "builtins.ellipsis"
2621
+ reveal_type(FromStub.FOO._value_) # N: Revealed type is "builtins.int"
2622
+
2623
+ class InheritedStr(StrEnum):
2624
+ FOO = ...
2625
+
2626
+ reveal_type(InheritedStr.FOO) # N: Revealed type is "Literal[__main__.InheritedStr.FOO]?"
2627
+ reveal_type(InheritedStr.FOO.value) # N: Revealed type is "builtins.ellipsis"
2628
+ reveal_type(InheritedStr.FOO._value_) # N: Revealed type is "builtins.ellipsis"
2629
+
2630
+ class Wrapper:
2631
+ class Nested(StrEnum):
2632
+ FOO = ...
2633
+
2634
+ reveal_type(Wrapper.Nested.FOO) # N: Revealed type is "Literal[__main__.Wrapper.Nested.FOO]?"
2635
+ reveal_type(Wrapper.Nested.FOO.value) # N: Revealed type is "builtins.ellipsis"
2636
+ reveal_type(Wrapper.Nested.FOO._value_) # N: Revealed type is "builtins.ellipsis"
2637
+ [builtins fixtures/enum.pyi]
0 commit comments