diff --git a/App/lib/Stub/StubGen/Converter.vp b/App/lib/Stub/StubGen/Converter.vp index 7d076bf..a1a6cd3 100644 --- a/App/lib/Stub/StubGen/Converter.vp +++ b/App/lib/Stub/StubGen/Converter.vp @@ -667,7 +667,16 @@ def _PyiClass(buf: bytes, buf_size: sizet, pos: sizet, # PEP 695 类型参数 (class Foo[T]:) if cls.type_params is not None: - cls_type_params: list[ast.AST*]* = cls.type_params + # ClassDef.type_params 的真身是 rawptr[list[str]](**名字串**列表, + # 见 includes/ast/stmts.vp:475-483 与 parser.vp:3619-3663 的 + # `list[str](ps.pool, 8)`),不是 `list[rawptr[AST]]`(那是 decorator_list + # 的类型)。原注解从 decorator_list 抄错成 list[ast.AST*]* ⇒ .get() 被解析到 + # list[ast.AST*].get,而实参是 list[str]* ⇒ 严格规则下 fail-fast: + # "调用 ...list[AST*].get 第 0 个实参 %"...list[str]"* 不能隐式转为形参 + # %"...list[AST*]"*" + # 全仓其余 8 处 type_params 均为 list[str]*(VpiReader/Phase1Scan/Phase2/ + # ClassGenDef/ClassGenGeneric 等),此处对齐。 + cls_type_params: list[str]* = cls.type_params tpn: sizet = len(cls_type_params) if tpn > 0: pos = _PyiEmit(buf, buf_size, pos, "[")