8000 Fix crash on invalid enum in method (#16511) · python/mypy@5489fd3 · GitHub
[go: up one dir, main page]

Skip to content

Commit 5489fd3

Browse files
authored
Fix crash on invalid enum in method (#16511)
Fixes #16163 Fix is straightforward: I simply copy the logic we have for invalid TypedDicts/NamedTuples.
1 parent 8c8aa10 commit 5489fd3

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

mypy/semanal_enum.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,16 +106,19 @@ class A(enum.Enum):
106106
items, values, ok = self.parse_enum_call_args(call, fullname.split(".")[-1])
107107
if not ok:
108108
# Error. Construct dummy return value.
109-
info = self.build_enum_call_typeinfo(var_name, [], fullname, node.line)
109+
name = var_name
110+
if is_func_scope:
111+
name += "@" + str(call.line)
112+
info = self.build_enum_call_typeinfo(name, [], fullname, node.line)
110113
else:
111114
name = cast(StrExpr, call.args[0]).value
112115
if name != var_name or is_func_scope:
113116
# Give it a unique name derived from the line number.
114117
name += "@" + str(call.line)
115118
info = self.build_enum_call_typeinfo(name, items, fullname, call.line)
116-
# Store generated TypeInfo under both names, see semanal_namedtuple for more details.
117-
if name != var_name or is_func_scope:
118-
self.api.add_symbol_skip_local(name, info)
119+
# Store generated TypeInfo under both names, see semanal_namedtuple for more details.
120+
if name != var_name or is_func_scope:
121+
self.api.add_symbol_skip_local(name, info)
119122
call.analyzed = EnumCallExpr(info, items, values)
120123
call.analyzed.set_line(call)
121124
info.line = node.line

test-data/unit/check-incremental.test

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6560,3 +6560,26 @@ class C:
65606560
[out]
65616561
[out2]
65626562
tmp/a.py:3: note: Revealed type is "TypedDict('b.C.Hidden@5', {'x': builtins.int})"
6563+
6564+
[case testNoIncrementalCrashOnInvalidEnumMethod]
6565+
import a
6566+
[file a.py]
6567+
from lib import TheClass
6568+
[file a.py.2]
6569+
from lib import TheClass
6570+
x: TheClass
6571+
reveal_type(x.enum_type)
6572+
[file lib.py]
6573+
import enum
6574+
6575+
class TheClass:
6576+
def __init__(self) -> None:
6577+
names = ["foo"]
6578+
pyenum = enum.Enum('Blah', { # type: ignore[misc]
6579+
x.upper(): x
6580+
for x in names
6581+
})
6582+
self.enum_type = pyenum
6583+
[out]
6584+
[out2]
6585+
tmp/a.py:3: note: Revealed type is "def (value: builtins.object) -> lib.TheClass.pyenum@6"

0 commit comments

Comments
 (0)
0