From dddaba325482bb894c9471f4a8b542ffdaf768c1 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Tue, 29 Sep 2026 18:38:52 +0800 Subject: [PATCH] =?UTF-8?q?fix(transpyv):=205.5=20=E6=AD=A5=E8=A1=A5?= =?UTF-8?q?=E3=80=8C=E7=B1=BB=E5=AE=9A=E4=B9=89=E4=B8=AD=E3=80=8D=E5=9B=9E?= =?UTF-8?q?=E9=80=80=EF=BC=8C=E5=AD=97=E6=AE=B5=E4=BE=A7=E7=89=B9=E5=8C=96?= =?UTF-8?q?=E5=90=8D=E4=B8=8D=E5=86=8D=E7=95=99=E5=9C=A8=E8=A3=B8=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 类别: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]]"* 上一处(stmts.vp:60)是"形参侧裸名 vs 实参侧带前缀",本处反向:**字段侧** 仍是裸名。字段 children: list[rawptr[AST]] | t.CPtr 写在**类 AST 自己体内** (自引用),解析该字段类型时类正在定义中:find_struct('AST') 按名查不到(登记项 尚未命名)⇒ 5.5 首条查法落空 ⇒ 仍返回裸名;而 :357 的构造调用发生在类已注册之后 ⇒ 带前缀,两侧再度分裂。 改动:5.5 步在 find_struct 未命中 / ModuleSha1 为空时,回退用与 resolve_annotation_type 的 Name 分支**同一处证据**认定本模块类: find_struct_by_module(name, self.Gen.TypeGenBase.CurrentModuleSha1) 命中即以当前 模块 SHA1 加前缀。对同一模块的类,"按名取定义模块 SHA1"与"当前模块身份"给出同一 SHA1,故不引入新分裂。文档串规则表同步补该回退。 --- App/lib/core/Gen/Type/TypeGenResolve.vp | 36 ++++++++++++++++++------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/App/lib/core/Gen/Type/TypeGenResolve.vp b/App/lib/core/Gen/Type/TypeGenResolve.vp index c397805..b8fa60e 100644 --- a/App/lib/core/Gen/Type/TypeGenResolve.vp +++ b/App/lib/core/Gen/Type/TypeGenResolve.vp @@ -279,11 +279,14 @@ novirtual class TypeGenResolve(TypeGenBase.TypeGenBase): 完整模块名 → SHA1;再尝试 mod 直接查 SHA1(无别名 import 的完整路径) 5. 裸名 "Class":经 from_imports 查所属模块 SHA1 5.5 裸名 "Class" 是**本模块/已注册类**但不在 from_imports 里(典型:本模块 - 自己声明的类):经结构体表的登记项取其**定义模块 SHA1**(StructEntry. - ModuleSha1)加前缀。缺这一步会让同一类型"本模块内是裸名、被引用模块里 - 带前缀"分裂成两个特化名(现场:includes/ast/stmts.vp:60 - `_set_parent_list(targets, self)`:源 %"…list[rawptr[d1ed020479454541.AST]]"* - vs 目标 %"…list[rawptr[AST]]"*,被"非基本类型指针不可隐式转换"拦下) + 自己声明的类):先按名取结构体登记项的**定义模块 SHA1**(StructEntry. + ModuleSha1);类正在定义中(自引用字段)按名查不到时,回退用与 Name + 分支同一处证据 find_struct_by_module(name, 当前模块 SHA1) 认定本模块类。 + 缺这一步会让同一类型"本模块内是裸名、被引用模块里带前缀"分裂成两个 + 特化名(现场:includes/ast/stmts.vp:60 `_set_parent_list(targets, self)` + 源 %"…list[rawptr[d1ed020479454541.AST]]"* vs 目标 %"…list[rawptr[AST]]"*; + includes/ast/base.vp:357 `children = list[rawptr[AST]](self.pool, 8)` + 同族反向:字段侧裸名 vs 构造侧带前缀) 6. 仍查不到:返回原串(内置类型名等,保持原样) 返回 None 表示 type_name 为 None。 @@ -501,13 +504,26 @@ novirtual class TypeGenResolve(TypeGenBase.TypeGenBase): # 仅处理**简单裸名**(不含 '[' / '.'):泛型特化名(list[...])与限定名 # 各有自己的分支,不在此重复加工。 if string.strchr(type_name, '[') is None and string.strchr(type_name, '.') is None: + _def_sha1: str = None _bare_entry: GenTypes.StructEntry* = self.Gen.StructGen.find_struct(type_name) if _bare_entry is not None: - _def_sha1: str = _bare_entry.ModuleSha1 - if _def_sha1 is not None: - res_d: str = self._concat_sha1_class(pool, _def_sha1, type_name) - if res_d is not None: - return res_d + _def_sha1 = _bare_entry.ModuleSha1 + if _def_sha1 is None: + # 类**正在定义中**(自引用字段,如 base.vp `AST.children: list[rawptr[AST]]`) + # 时按名查不到/登记项尚无 ModuleSha1 ⇒ 用与 resolve_annotation_type 的 + # Name 分支**同一处证据**认定"本模块类":find_struct_by_module(name, + # 当前模块 SHA1)。缺这条回退时,字段类型留在裸名、而同类在 + # 构造调用(类已注册)处已带 SHA1 ⇒ 同一 list[rawptr[AST]] 又分裂 + # (现场:base.vp:357 `self.children = list[rawptr[AST]](self.pool, 8)`)。 + _cur_sha1: str = self.Gen.TypeGenBase.CurrentModuleSha1 + if _cur_sha1 is not None: + _own_entry: GenTypes.StructEntry* = self.Gen.StructGen.find_struct_by_module(type_name, _cur_sha1) + if _own_entry is not None: + _def_sha1 = _cur_sha1 + if _def_sha1 is not None: + res_d: str = self._concat_sha1_class(pool, _def_sha1, type_name) + if res_d is not None: + return res_d # ---- 6. 查不到:保持原样(内置类型名等)---- return type_name