Skip to content

Commit 46c5182

Browse files
committed
[stubgen] Fix crash on literal class-level keywords
1 parent 3da16bd commit 46c5182

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

mypy/stubgen.py

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

307-
def visit_str_expr(self, node: StrExpr) -> str:
307+
def _visit_literal_node(self, node: StrExpr | BytesExpr | IntExpr | FloatExpr | ComplexExpr) -> str:
308308
return repr(node.value)
309309

310+
def visit_str_expr(self, node: StrExpr) -> str:
311+
return self._visit_literal_node(node)
312+
313+
def visit_bytes_expr(self, node: BytesExpr) -> str:
314+
return f"b{self._visit_literal_node(node)}"
315+
316+
def visit_int_expr(self, node: IntExpr) -> str:
317+
return self._visit_literal_node(node)
318+
319+
def visit_float_expr(self, node: FloatExpr) -> str:
320+
return self._visit_literal_node(node)
321+
322+
def visit_complex_expr(self, node: ComplexExpr) -> str:
323+
return self._visit_literal_node(node)
324+
310325
def visit_index_expr(self, node: IndexExpr) -> str:
311326
base_fullname = self.stubgen.get_fullname(node.base)
312327
if base_fullname == "typing.Union":
@@ -804,7 +819,8 @@ def get_base_types(self, cdef: ClassDef) -> list[str]:
804819
for name, value in cdef.keywords.items():
805820
if name == "metaclass":
806821
continue # handled separately
807-
base_types.append(f"{name}={value.accept(p)}")
822+
processed_value = value.accept(p) or "..." # at least, don't crash
823+
base_types.append(f"{name}={processed_value}")
808824
return base_types
809825

810826
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)