diff --git a/App/lib/core/Gen/Type/TypeGenResolve.vp b/App/lib/core/Gen/Type/TypeGenResolve.vp index 0b35574..12e142f 100644 --- a/App/lib/core/Gen/Type/TypeGenResolve.vp +++ b/App/lib/core/Gen/Type/TypeGenResolve.vp @@ -722,6 +722,39 @@ novirtual class TypeGenResolve(TypeGenBase.TypeGenBase): string.strcat(g_out, g_arg2) string.strcat(g_out, "]") return g_out + # ---- 1.6 尾随指针星号:先归一基名,再回贴星号(2026-10-01)---- + # parser 把源码 `X*` 展开为 `X | t.CPtr`,但**泛型实参文本**里的星号是原样 + # 带进来的(如字段 `list[ast.ClassDef*]` 的实参段文本就是 "ast.ClassDef*")。 + # 不剥离时规则 4 的 attr 会带上星号变成 "ClassDef*": + # ① `_class_true_def_sha1` 按名查不到 "ClassDef*" ⇒ 真定义模块校正失效 ⇒ + # 留下**包前缀**(现场:ClassGenBase.vp:123 字段票名 + # `list[1abcd5277fa442de.ClassDef*]`,而 ClassGenGeneric.vp:92 构造侧是 + # `list[e70bd9b4487d921d.ClassDef*]` ⇒ TPV 报「指针隐式转指针已禁止」, + # 且该票名在全部产物里从未定义为实体结构体); + # ② 与 TPC 名称域不一致 —— SymbolUtils.ResolveTypeArgStr 的 BinOp 分支明确 + # 规定 `X | t.CPtr` ≡ `rawptr[X]` ≡ `t.CPtr[X]` → `{sha}.X*`(先解析基 + # 类型 X,再 AddPointerLayers 追加星号)。 + # 故统一为:剥掉全部尾随 '*' → 递归归一基名 → 回贴同样多的 '*'。 + # `i8**` / `int*` / `T*` / 已带 SHA1 前缀的文本都逐字不变(基名归一回原样)。 + _st_n: int = 0 + while seg_len > sizet(_st_n) and type_name[seg_len - sizet(_st_n) - 1] == '*': + _st_n += 1 + if _st_n > 0: + _base_len_s: sizet = seg_len - sizet(_st_n) + _base_buf_s: str = pool.alloc(_base_len_s + 1) + if _base_buf_s is not None: + string.strncpy(_base_buf_s, type_name, _base_len_s) + _base_buf_s[_base_len_s] = '\0' + _base_n_s: str = self._norm_type_arg_name(pool, _base_buf_s, from_imports) + if _base_n_s is not None: + _out_s: str = _base_n_s + _si_s: int + for _si_s in range(_st_n): + _out_s = self._ptr_star_text(pool, _out_s) + if _out_s is None: + break + if _out_s is not None: + return _out_s # ---- 2. 已规范化(SHA1 前缀)---- if self._is_sha1_prefixed(type_name) != 0: return type_name