Skip to content

Commit 5b46f1c

Browse files
authored
[stubgen] Fix crash on literal class-level keywords (#17663)
Closes #17661
1 parent f0c394a commit 5b46f1c

File tree

2 files changed

+30
-2
lines changed

2 files changed

+30
-2
lines changed

mypy/stubgen.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -305,9 +305,26 @@ def visit_name_expr(self, node: NameExpr) -> str:
305305
def visit_member_expr(self, o: MemberExpr) -> str:
306306
return self._visit_ref_expr(o)
307307

308-
def visit_str_expr(self, node: StrExpr) -> str:
308+
def _visit_literal_node(
309+
self, node: StrExpr | BytesExpr | IntExpr | FloatExpr | ComplexExpr
310+
) -> str:
309311
return repr(node.value)
310312

313+
def visit_str_expr(self, node: StrExpr) -> str:
314+
return self._visit_literal_node(node)
315+
316+
def visit_bytes_expr(self, node: BytesExpr) -> str:
317+
return f"b{self._visit_literal_node(node)}"
318+
319+
def visit_int_expr(self, node: IntExpr) -> str:
320+
return self._visit_literal_node(node)
321+
322+
def visit_float_expr(self, node: FloatExpr) -> str:
323+
return self._visit_literal_node(node)
324+
325+
def visit_complex_expr(self, node: ComplexExpr) -> str:
326+
return self._visit_literal_node(node)
327+
311328
def visit_index_expr(self, node: IndexExpr) -> str:
312329
base_fullname = self.stubgen.get_fullname(node.base)
313330
if base_fullname == "typing.Union":
@@ -805,7 +822,8 @@ def get_base_types(self, cdef: ClassDef) -> list[str]:
805822
for name, value in cdef.keywords.items():
806823
if name == "metaclass":
807824
continue # handled separately
808-
base_types.append(f"{name}={value.accept(p)}")
825+
processed_value = value.accept(p) or "..." # at least, don't crash
826+
base_types.append(f"{name}={processed_value}")
809827
return base_types
810828

811829
def get_class_decorators(self, cdef: ClassDef) -> list[str]:

test-data/unit/stubgen.test

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4405,3 +4405,13 @@ Y = int | None
44054405
Z = Incomplete
44064406
W = int | str | None
44074407
R = type[int | str] | None
4408+
4409+
[case testClassInheritanceWithKeywordsConstants]
4410+
class Test(Whatever, a=1, b='b', c=True, d=1.5, e=None, f=1j, g=b'123'): ...
4411+
[out]
4412+
class Test(Whatever, a=1, b='b', c=True, d=1.5, e=None, f=1j, g=b'123'): ...
4413+
4414+
[case testClassInheritanceWithKeywordsDynamic]
4415+
class Test(Whatever, keyword=SomeName * 2, attr=SomeName.attr): ...
4416+
[out]
4417+
class Test(Whatever, keyword=SomeName * 2, attr=SomeName.attr): ...

0 commit comments

Comments
 (0)