fix(transpyv): 自引用字段的特化名不再留在裸名(新增"本模块声明类"归属表)
类别:a(编译器缺陷 —— 字段类型在类注册前被冻结成裸名版特化名)
现场(上一轮未修掉的那一处):includes/ast/base.vp:357
if self.children is None: self.children = list[rawptr[AST]](self.pool, 8)
CastError:源 %"7e2b6dda6e423bfb.list[rawptr[d1ed020479454541.AST]]"*
→ 目标 %"7e2b6dda6e423bfb.list[rawptr[AST]]"*
根因:字段 children: list[rawptr[AST]] | t.CPtr 写在**类 AST 自己体内**(自引用),
其类型在 translate_class_def 的字段循环里解析,而本类的 register_struct 在该函数
**末尾**才执行 ⇒ 解析时 struct 表里没有 AST ⇒ 上一轮 5.5 的两条查法
(find_struct 按名 / find_struct_by_module)全部落空 ⇒ 实参仍留裸名 rawptr[AST],
字段类型被冻结成 list[rawptr[AST]](第一遍 A-pre 即发生);而 :357 的构造调用发生在
类注册之后 ⇒ 带 SHA1 ⇒ 两侧分裂。(同一分裂在 stmts.vp:60 表现为形参侧/实参侧,
本处表现为字段侧/构造侧。)
改动:
1. StructGenMixin 新增"本模块声明类"归属表 ModuleClasses(键 "{模块SHA1}.{类名}")
与 CurDefModuleSha1(正在定义类所属模块 SHA1,登记时同步记录):
- mark_module_class(pool, sha1, name) / is_module_class(pool, sha1, name)
- 键含 SHA1 ⇒ 与翻译顺序/模块切换无关、无需每文件重置,也不会把别的模块的类
错认成本模块。
2. ClassGenDef 类定义入口(add_visible_struct 之后、枚举/联合分派之前)登记
mark_module_class(pool, trans.ModuleSha1, class_name),覆盖 class/enum/union/
renum 全部类种类。
3. TypeGenResolve 规则 5.5 补齐证据链:① 按名取 StructEntry.ModuleSha1;
② struct 表暂无条目时用 CurDefModuleSha1 走 find_struct_by_module;
③ 仍无条目(正是自引用窗口)时查归属表 ⇒ 加 SHA1 前缀。
CurDefModuleSha1 取代 CurrentModuleSha1 作为"当前定义模块"真源——后者在
A-pre/StubMerger 路径未设置或留着上一文件旧值(只有 Translator.ModuleSha1 权威)。
影响面:ABI 可见(特化名);需 TPV 自举重建 + 回归验证。