fix(transpyv): 修正 _PyiClass 的 type_params 局部变量注解(list[ast.AST*]* → list[str]*)

c 源码违规(注解写错,被严格指针规则抓出):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 的类型。Converter._PyiClass 把局部变量注解从 decorator_list
抄错成 list[ast.AST*]* ⇒ `.get()` 被解析到 list[ast.AST*].get,而实参是
list[str]* ⇒ fail-fast:

  调用 650c1c3366d09e39.list[10f3f43ddd447eec.AST*].get 第 0 个实参
  %"650c1c3366d09e39.list[str]"* 不能隐式转为形参
  %"650c1c3366d09e39.list[10f3f43ddd447eec.AST*]"*

已核对全仓其余 8 处 type_params 用点(VpiReader.vp:2253/2274/4345、
Phase2/__init__.vp:317、Phase1Scan.vp:153/318、ClassGenDef.vp:69、
CallGenMixin.vp:415)均写作 list[str]*,本次与之对齐。
This commit is contained in:
TermiNexus committed 2026-09-28 22:54:50 +08:00
1 parent aa52cf157d
commit fddadf9d56
1 file changed
+10 -1
+10 -1
View File
@@ -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, "[")