TermiNexus
25cda80995
fix(tpc): 补齐单/多参泛型类下标注解(list[str] → %"{模板sha1}.list[str]"*)
类别:a 编译器缺陷(机制缺失:两个注解解析器都只认双参定长 list[T, N])。
现场(前序报错):CallGenMixin.vp:149 调 ClassGenGeneric._specialize_generic_class
报「%\"650c1c3366d09e39.list[str]\"* 不能隐式转 i32」——实参侧正确、**形参侧
`type_args: list[str]*` 在符号表里成 i32**。同类:字段
`TypeGenBase.CTypedefNames: list[str] | t.CPtr` 在共享符号表里成 i8*(实测
temp/_shared_sym.json)。
真根因:单参泛型类下标在两处注解解析器里都无人处理,直接落到"未知类型"兜底:
· TypeAnnotationResolver._from_node_subscript(IsListAnnotation 只认双参)
→ `return CTypeInfo()`(空 ⇒ i32 / 与 t.CPtr 合并成 i8*);
· LLVMTypeMapper._resolve_subscript → warn + 'i32'。
而声明端 DeclarationGenerator._get_type_str 的泛型分支(L1393-1423)**一直是对的**
(`%"<模板sha1>.<特化名>"*`),三处规则分裂。
修复(一条规则源 + 两处消费 + 一处物化):
1. SymbolUtils 新增 ResolveGenericClassSpecName / IsGenericClassSubscriptBase ——
与 DeclarationGenerator 泛型分支逐字同口径:
spec = 基名 + '[' + ']['.join(ResolveGenericTypeArgStr(实参)) + ']';
判据=该基名**有类定义**(符号表条目 IsStruct 或任一命名空间命中,实测 list
条目 IsStruct=True,故等价覆盖声明端 non_struct_types ∪ _generic_class_names)。
另加 GetStructSha1MapFromSymtab / GetTCAliasMapFromSymtab(从
SymbolTable.translator 取 Phase2 已挂好的 _struct_sha1_map /
_t_c_imported_names),供实参串跨模块类引用解析('<sha1>.AST')。
2. TypeAnnotationResolver._from_node_subscript 末尾(既有 rawptr/CPtr/CArray/
list[T,N]/tuple 分支**之后**)接入:产出
CTypeInfo(BaseType=CStruct(spec), IsStruct=True, Name=spec)(PtrCount 保持 0,
与本文件既有结构体 promotion 同口径:`X | t.CPtr` 取 max→1 层、
`rawptr[X]` +1→1 层,均与 declare 侧一致)。
3. LLVMTypeMapper._resolve_subscript 同样位置接入:产出 `%struct.<spec>*`
(与 _resolve_name / _resolve_attribute 的类引用同一表示)。
4. BaseGen._get_or_create_struct:特化名(含 '[')先按**基名**查
_struct_sha1_map 取模板 sha1 再拼 IR 名 —— 否则会用**使用方模块** sha1 拼出
'<本模块sha1>.list[str]',与 declare/define 端 '<模板sha1>.list[str]' 分裂。
自测(vast AST):list[str]→'list[str]'、dict[str,int]→'dict[str][int]'、
list[rawptr[AST]]→'list[AST*]'、rawptr[int]/tuple[…]→None(仍由既有分支处理)。
2026-09-29 13:17:36 +08:00
..
2026-09-14 13:42:14 +08:00
2026-09-29 13:17:36 +08:00
2026-09-28 13:57:04 +08:00
2026-09-28 18:25:57 +08:00
2026-09-26 19:27:22 +08:00
2026-09-26 19:27:22 +08:00
2026-09-12 11:51:42 +08:00
2026-09-28 13:49:28 +08:00
2026-09-26 19:27:22 +08:00
2026-08-17 09:36:38 +08:00
2026-08-17 09:36:38 +08:00