diff --git a/App/lib/core/Gen/Type/TypeGenResolve.vp b/App/lib/core/Gen/Type/TypeGenResolve.vp index 49a092a..c397805 100644 --- a/App/lib/core/Gen/Type/TypeGenResolve.vp +++ b/App/lib/core/Gen/Type/TypeGenResolve.vp @@ -278,7 +278,13 @@ novirtual class TypeGenResolve(TypeGenBase.TypeGenBase): 4. "mod.Class"(Attribute):mod 是 import 别名时先经 from_imports 反查 完整模块名 → SHA1;再尝试 mod 直接查 SHA1(无别名 import 的完整路径) 5. 裸名 "Class":经 from_imports 查所属模块 SHA1 - 6. 均查不到:返回原串(当前模块自身类 / 内置类型名,保持原样) + 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]]"*,被"非基本类型指针不可隐式转换"拦下) + 6. 仍查不到:返回原串(内置类型名等,保持原样) 返回 None 表示 type_name 为 None。 """ @@ -484,7 +490,25 @@ novirtual class TypeGenResolve(TypeGenBase.TypeGenBase): res_c: str = self._concat_sha1_class(pool, sha1c, type_name) if res_c is not None: return res_c - # ---- 6. 查不到:保持原样 ---- + # ---- 5.5 裸名且是已注册类:加**定义模块 SHA1** 前缀 ---- + # 规则 5 只查 from_imports(可见性表):**本模块自己声明的类**不在表内 ⇒ + # 原样返回裸名 ⇒ 同一类型"本模块内是 list[rawptr[AST]]、被引用模块里是 + # list[rawptr<定义模块SHA1>.AST]"⇒ 同一特化分裂成两个结构体名(现场: + # includes/ast/stmts.vp:60 `_set_parent_list(targets, self)` 源 + # %"…list[rawptr[d1ed020479454541.AST]]"* vs 目标 %"…list[rawptr[AST]]"*, + # 被"非基本类型指针不可隐式转换"拦下)。取结构体表登记的定义模块 SHA1 + # (与当前模块无关)⇒ 各模块得到同一票名。 + # 仅处理**简单裸名**(不含 '[' / '.'):泛型特化名(list[...])与限定名 + # 各有自己的分支,不在此重复加工。 + if string.strchr(type_name, '[') is None and string.strchr(type_name, '.') is 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 + # ---- 6. 查不到:保持原样(内置类型名等)---- return type_name def _str_contains_ident(self, s: str, ident: str) -> int: