@@ -618,9 +618,8 @@ reveal_type(B.a) # N: Revealed type is "Literal[__main__.B.a]?"
618618reveal_type(A.x.name) # N: Revealed type is "Literal['x']?"
619619reveal_type(B.a.name) # N: Revealed type is "Literal['a']?"
620620
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"
624623[builtins fixtures/enum.pyi]
625624
626625[case testAnonymousFunctionalEnum]
@@ -755,12 +754,10 @@ class B2(IntEnum):
755754class B3(IntEnum):
756755 x = 1
757756
758- # TODO: getting B1.x._value_ and B2.x._value_ to have type 'int' requires a typeshed change
759-
760757is_x(reveal_type(B1.x.name)) # N: Revealed type is "Literal['x']"
761758is_x(reveal_type(B1.x._name_)) # N: Revealed type is "Literal['x']"
762759reveal_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 "
764761is_x(reveal_type(B2.x.name)) # N: Revealed type is "Literal['x']"
765762is_x(reveal_type(B2.x._name_)) # N: Revealed type is "Literal['x']"
766763reveal_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']"
770767reveal_type(B3.x.value) # N: Revealed type is "Literal[1]?"
771768reveal_type(B3.x._value_) # N: Revealed type is "Literal[1]?"
772769
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-
776770C1 = IntFlag('C1', 'x')
777771class C2(IntFlag):
778772 x = auto()
@@ -781,8 +775,8 @@ class C3(IntFlag):
781775
782776is_x(reveal_type(C1.x.name)) # N: Revealed type is "Literal['x']"
783777is_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 "
786780is_x(reveal_type(C2.x.name)) # N: Revealed type is "Literal['x']"
787781is_x(reveal_type(C2.x._name_)) # N: Revealed type is "Literal['x']"
788782reveal_type(C2.x.value) # N: Revealed type is "builtins.int"
@@ -800,8 +794,8 @@ class D3(Flag):
800794
801795is_x(reveal_type(D1.x.name)) # N: Revealed type is "Literal['x']"
802796is_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 "
805799is_x(reveal_type(D2.x.name)) # N: Revealed type is "Literal['x']"
806800is_x(reveal_type(D2.x._name_)) # N: Revealed type is "Literal['x']"
807801reveal_type(D2.x.value) # N: Revealed type is "builtins.int"
@@ -2539,3 +2533,105 @@ def check(thing: Things) -> None:
25392533 return None
25402534 return None # E: Statement is unreachable
25412535[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