fix(core): 泛型特化翻译并入模板模块 imports,消除跨模块误报

This commit is contained in:
TermiNexus committed 2026-08-07 22:36:22 +08:00
1 parent adff2f35c4
commit 9322ac469f
1 file changed
+42 -1
+42 -1
View File
@@ -13,6 +13,7 @@ import lib.core.Handles.HandlesType as HandlesType
import lib.core.Handles.HandlesStruct as HandlesStruct import lib.core.Handles.HandlesStruct as HandlesStruct
import lib.core.Handles.HandlesVar as HandlesVar import lib.core.Handles.HandlesVar as HandlesVar
import lib.core.Handles.HandlesEnum as HandlesEnum import lib.core.Handles.HandlesEnum as HandlesEnum
import lib.core.StubMerger as StubMerger
# 枚举成员临时数组最大数量(本地常量) # 枚举成员临时数组最大数量(本地常量)
@@ -2218,6 +2219,38 @@ def _cache_spec(pool: memhub.MemBuddy | t.CPtr, spec_key: str, spec_name: str):
_spec_count += 1 _spec_count += 1
# ============================================================
# _merge_template_imports - 特化翻译前并入模板模块的 imports
#
# 泛型特化(_specialize_generic_class)用触发方文件的 Translator 翻译
# 模板方法体,但模板方法体引用的模块(如 _list.vp 的 append 里
# string.memcpy 依赖 string)来自模板文件自身的 import。若不并入,
# 跨模块 fast-fail 检查会把 string.memcpy 误报为"模块 string 未导入"。
# 调用方负责在特化翻译后恢复 trans._imported_modules。
# ============================================================
def _merge_template_imports(trans: HT.Translator | t.CPtr,
template_sha1: str) -> None:
"""将模板模块的 imports 并入 trans._imported_modules(空格分隔)"""
if trans is None or template_sha1 is None:
return
tdeps: str = StubMerger.LookupIncludesDeps(template_sha1)
if tdeps is None or tdeps[0] == '\0':
return
cur: str = trans._imported_modules
if cur is None or cur[0] == '\0':
trans._imported_modules = tdeps
return
cur_len: t.CSizeT = string.strlen(cur)
td_len: t.CSizeT = string.strlen(tdeps)
merged: str = trans.Pool.alloc(cur_len + td_len + 2)
if merged is None:
return
string.strcpy(merged, cur)
merged[cur_len] = ' '
string.strcpy(merged + cur_len + 1, tdeps)
trans._imported_modules = merged
def _specialize_generic_class(trans: HT.Translator | t.CPtr, def _specialize_generic_class(trans: HT.Translator | t.CPtr,
class_name: str, class_name: str,
type_args: list[str] | t.CPtr) -> str: type_args: list[str] | t.CPtr) -> str:
@@ -2287,11 +2320,14 @@ def _specialize_generic_class(trans: HT.Translator | t.CPtr,
trans.GenericTypeArgs = type_args trans.GenericTypeArgs = type_args
HandlesType.set_generic_context(tp_names_pre, type_args) HandlesType.set_generic_context(tp_names_pre, type_args)
saved_ms_pre: str = trans.ModuleSha1 saved_ms_pre: str = trans.ModuleSha1
saved_imp_pre: str = trans._imported_modules
template_sha1_pre: str = _find_generic_template_sha1(class_name) template_sha1_pre: str = _find_generic_template_sha1(class_name)
if template_sha1_pre is not None: if template_sha1_pre is not None:
trans.ModuleSha1 = template_sha1_pre trans.ModuleSha1 = template_sha1_pre
_merge_template_imports(trans, template_sha1_pre)
_translate_oop_methods(trans, spec_cd_pre, pre_existing.Ty, spec_name, 0) _translate_oop_methods(trans, spec_cd_pre, pre_existing.Ty, spec_name, 0)
trans.ModuleSha1 = saved_ms_pre trans.ModuleSha1 = saved_ms_pre
trans._imported_modules = saved_imp_pre
trans.GenericTypeParamNames = None trans.GenericTypeParamNames = None
trans.GenericTypeArgs = None trans.GenericTypeArgs = None
HandlesType.clear_generic_context() HandlesType.clear_generic_context()
@@ -2361,13 +2397,18 @@ def _specialize_generic_class(trans: HT.Translator | t.CPtr,
# 切换 trans.ModuleSha1 为泛型模板定义模块的 SHA1, # 切换 trans.ModuleSha1 为泛型模板定义模块的 SHA1,
# 使结构体类型名和方法定义名都用定义模块的 SHA1 前缀, # 使结构体类型名和方法定义名都用定义模块的 SHA1 前缀,
# 与调用端 get_struct_sha1(class_name) 查到的 SHA1 一致。 # 与调用端 get_struct_sha1(class_name) 查到的 SHA1 一致。
# 同时并入模板模块的 imports(见 _merge_template_imports 注释),
# 避免模板方法体内的跨模块调用被误报"模块未导入"。
saved_module_sha1: str = trans.ModuleSha1 saved_module_sha1: str = trans.ModuleSha1
saved_imported: str = trans._imported_modules
template_sha1: str = _find_generic_template_sha1(class_name) template_sha1: str = _find_generic_template_sha1(class_name)
if template_sha1 is not None: if template_sha1 is not None:
trans.ModuleSha1 = template_sha1 trans.ModuleSha1 = template_sha1
_merge_template_imports(trans, template_sha1)
translate_class_def(trans, spec_cd) translate_class_def(trans, spec_cd)
# 恢复原始 ModuleSha1 # 恢复原始 ModuleSha1 与 imports
trans.ModuleSha1 = saved_module_sha1 trans.ModuleSha1 = saved_module_sha1
trans._imported_modules = saved_imported
# 8. 清除 type_map 上下文 # 8. 清除 type_map 上下文
trans.GenericTypeParamNames = None trans.GenericTypeParamNames = None