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