@@ -59,6 +59,76 @@ reveal_type(Truth.true.name) # N: Revealed type is 'Literal['true']?'
59
59
reveal_type(Truth.false.value) # N: Revealed type is 'builtins.bool'
60
60
[builtins fixtures/bool.pyi]
61
61
62
+ [case testEnumValueExtended]
63
+ from enum import Enum
64
+ class Truth(Enum):
65
+ true = True
66
+ false = False
67
+
68
+ def infer_truth(truth: Truth) -> None:
69
+ reveal_type(truth.value) # N: Revealed type is 'builtins.bool'
70
+ [builtins fixtures/bool.pyi]
71
+
72
+ [case testEnumValueAllAuto]
73
+ from enum import Enum, auto
74
+ class Truth(Enum):
75
+ true = auto()
76
+ false = auto()
77
+
78
+ def infer_truth(truth: Truth) -> None:
79
+ reveal_type(truth.value) # N: Revealed type is 'builtins.int'
80
+ [builtins fixtures/primitives.pyi]
81
+
82
+ [case testEnumValueSomeAuto]
83
+ from enum import Enum, auto
84
+ class Truth(Enum):
85
+ true = 8675309
86
+ false = auto()
87
+
88
+ def infer_truth(truth: Truth) -> None:
89
+ reveal_type(truth.value) # N: Revealed type is 'builtins.int'
90
+ [builtins fixtures/primitives.pyi]
91
+
92
+ [case testEnumValueExtraMethods]
93
+ from enum import Enum, auto
94
+ class Truth(Enum):
95
+ true = True
96
+ false = False
97
+
98
+ def foo(self) -> str:
99
+ return 'bar'
100
+
101
+ def infer_truth(truth: Truth) -> None:
102
+ reveal_type(truth.value) # N: Revealed type is 'builtins.bool'
103
+ [builtins fixtures/bool.pyi]
104
+
105
+ [case testEnumValueCustomAuto]
106
+ from enum import Enum, auto
107
+ class AutoName(Enum):
108
+
109
+ # In `typeshed`, this is a staticmethod and has more arguments,
110
+ # but I have lied a bit to keep the test stubs lean.
111
+ def _generate_next_value_(self) -> str:
112
+ return "name"
113
+
114
+ class Truth(AutoName):
115
+ true = auto()
116
+ false = auto()
117
+
118
+ def infer_truth(truth: Truth) -> None:
119
+ reveal_type(truth.value) # N: Revealed type is 'builtins.str'
120
+ [builtins fixtures/primitives.pyi]
121
+
122
+ [case testEnumValueInhomogenous]
123
+ from enum import Enum
124
+ class Truth(Enum):
125
+ true = 'True'
126
+ false = 0
127
+
128
+ def cannot_infer_truth(truth: Truth) -> None:
129
+ reveal_type(truth.value) # N: Revealed type is 'Any'
130
+ [builtins fixtures/bool.pyi]
131
+
62
132
[case testEnumUnique]
63
133
import enum
64
134
@enum.unique
@@ -497,8 +567,8 @@ reveal_type(A1.x.value) # N: Revealed type is 'Any'
497
567
reveal_type(A1.x._value_) # N: Revealed type is 'Any'
498
568
is_x(reveal_type(A2.x.name)) # N: Revealed type is 'Literal['x']'
499
569
is_x(reveal_type(A2.x._name_)) # N: Revealed type is 'Literal['x']'
500
- reveal_type(A2.x.value) # N: Revealed type is 'Any '
501
- reveal_type(A2.x._value_) # N: Revealed type is 'Any '
570
+ reveal_type(A2.x.value) # N: Revealed type is 'builtins.int '
571
+ reveal_type(A2.x._value_) # N: Revealed type is 'builtins.int '
502
572
is_x(reveal_type(A3.x.name)) # N: Revealed type is 'Literal['x']'
503
573
is_x(reveal_type(A3.x._name_)) # N: Revealed type is 'Literal['x']'
504
574
reveal_type(A3.x.value) # N: Revealed type is 'builtins.int'
@@ -519,7 +589,7 @@ reveal_type(B1.x._value_) # N: Revealed type is 'Any'
519
589
is_x(reveal_type(B2.x.name)) # N: Revealed type is 'Literal['x']'
520
590
is_x(reveal_type(B2.x._name_)) # N: Revealed type is 'Literal['x']'
521
591
reveal_type(B2.x.value) # N: Revealed type is 'builtins.int'
522
- reveal_type(B2.x._value_) # N: Revealed type is 'Any '
592
+ reveal_type(B2.x._value_) # N: Revealed type is 'builtins.int '
523
593
is_x(reveal_type(B3.x.name)) # N: Revealed type is 'Literal['x']'
524
594
is_x(reveal_type(B3.x._name_)) # N: Revealed type is 'Literal['x']'
525
595
reveal_type(B3.x.value) # N: Revealed type is 'builtins.int'
@@ -540,8 +610,8 @@ reveal_type(C1.x.value) # N: Revealed type is 'Any'
540
610
reveal_type(C1.x._value_) # N: Revealed type is 'Any'
541
611
is_x(reveal_type(C2.x.name)) # N: Revealed type is 'Literal['x']'
542
612
is_x(reveal_type(C2.x._name_)) # N: Revealed type is 'Literal['x']'
543
- reveal_type(C2.x.value) # N: Revealed type is 'Any '
544
- reveal_type(C2.x._value_) # N: Revealed type is 'Any '
613
+ reveal_type(C2.x.value) # N: Revealed type is 'builtins.int '
614
+ reveal_type(C2.x._value_) # N: Revealed type is 'builtins.int '
545
615
is_x(reveal_type(C3.x.name)) # N: Revealed type is 'Literal['x']'
546
616
is_x(reveal_type(C3.x._name_)) # N: Revealed type is 'Literal['x']'
547
617
reveal_type(C3.x.value) # N: Revealed type is 'builtins.int'
@@ -559,8 +629,8 @@ reveal_type(D1.x.value) # N: Revealed type is 'Any'
559
629
reveal_type(D1.x._value_) # N: Revealed type is 'Any'
560
630
is_x(reveal_type(D2.x.name)) # N: Revealed type is 'Literal['x']'
561
631
is_x(reveal_type(D2.x._name_)) # N: Revealed type is 'Literal['x']'
562
- reveal_type(D2.x.value) # N: Revealed type is 'Any '
563
- reveal_type(D2.x._value_) # N: Revealed type is 'Any '
632
+ reveal_type(D2.x.value) # N: Revealed type is 'builtins.int '
633
+ reveal_type(D2.x._value_) # N: Revealed type is 'builtins.int '
564
634
is_x(reveal_type(D3.x.name)) # N: Revealed type is 'Literal['x']'
565
635
is_x(reveal_type(D3.x._name_)) # N: Revealed type is 'Literal['x']'
566
636
reveal_type(D3.x.value) # N: Revealed type is 'builtins.int'
@@ -578,8 +648,8 @@ class E3(Parent):
578
648
579
649
is_x(reveal_type(E2.x.name)) # N: Revealed type is 'Literal['x']'
580
650
is_x(reveal_type(E2.x._name_)) # N: Revealed type is 'Literal['x']'
581
- reveal_type(E2.x.value) # N: Revealed type is 'Any '
582
- reveal_type(E2.x._value_) # N: Revealed type is 'Any '
651
+ reveal_type(E2.x.value) # N: Revealed type is 'builtins.int '
652
+ reveal_type(E2.x._value_) # N: Revealed type is 'builtins.int '
583
653
is_x(reveal_type(E3.x.name)) # N: Revealed type is 'Literal['x']'
584
654
is_x(reveal_type(E3.x._name_)) # N: Revealed type is 'Literal['x']'
585
655
reveal_type(E3.x.value) # N: Revealed type is 'builtins.int'
0 commit comments