fix(TypeGenResolve): 裸名内建类型统一为 t.X/c.X,消 CPtr 与 t.CPtr 的分裂与误报 ERROR

内建伪模块 t/c 没有模块 SHA1(规则 5 的模块名→sha1 表查不到),于是 from t import CPtr 之后的裸名 CPtr 被原样保留,而规则 3 保留的是 t.CPtr ⇒ 同一类型两种票名(list[CPtr] 与 list[t.CPtr] 分裂),并额外刷 ERROR [类型实参归属] 裸类名 CPtr 保留裸名(现场 Test/NewAstTest/App/main.vp,log 里 from_imports 明写 CPtr:t)。新增规则 5.2:from_imports 命中模块 t/c 且 map_t_type 认该名 ⇒ 返回 t.X/c.X(规则 3 已定的规范形)。只对"本名就是 t/c 已知内建类型名"生效,别名写法不猜真实符号名、维持原样。
This commit is contained in:
TermiNexus committed 2026-09-30 22:59:01 +08:00
1 parent 79f044bc47
commit f2f3e5b7bf
1 file changed
+22
+22
View File
@@ -770,6 +770,28 @@ 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
# ---- 5.2 裸名来自内建模块 t/c ⇒ 统一为 "t.X" / "c.X" ----
# 依据:内建伪模块 t/c **没有模块 SHA1**(规则 5 的"模块名 → sha1"表查不到),
# 于是 `from t import CPtr` 之后写的**裸名** `CPtr` 会原样保留,而规则 3 保留的是
# `t.CPtr` ⇒ 同一类型两种票名(`list[CPtr]` vs `list[t.CPtr]` 分裂成两个特化体),
# 并额外刷一条 ERROR [类型实参归属](现场 Test/NewAstTest/App/main.vp 的裸名
# 'CPtr',log 里 from_imports 明写 `CPtr:t`)。
# 规范形取 "t.X"/"c.X"(规则 3 已定的形式),使两种写法同票名。
# 只对"本名就是 t/c 的**已知内建类型名**"生效(map_t_type 命中):别名写法
# (`from t import CPtr as P`)不猜真实符号名,维持原样,避免产出错票名。
if from_imports is not None:
_bi_mod: str = self.Gen.ImportsGen.lookup_from_import(from_imports, type_name, 0)
if _bi_mod is not None:
if (string.strcmp(_bi_mod, "t") == 0 or string.strcmp(_bi_mod, "c") == 0) \
and self.map_t_type(pool, type_name) is not None:
_bi_len: sizet = string.strlen(_bi_mod) + 1 + string.strlen(type_name) + 1
_bi_buf: str = pool.alloc(_bi_len)
if _bi_buf is not None:
_bi_buf[0] = '\0'
string.strcat(_bi_buf, _bi_mod)
string.strcat(_bi_buf, ".")
string.strcat(_bi_buf, type_name)
return _bi_buf
# ---- 5.5 裸名且是已注册类:加**定义模块 SHA1** 前缀 ----
# 规则 5 只查 from_imports(可见性表):**本模块自己声明的类**不在表内 ⇒
# 原样返回裸名 ⇒ 同一类型"本模块内是 list[rawptr[AST]]、被引用模块里是