feat(tpv): Phase A 依赖未就绪诊断补全——列出缺失 text.ll 的直接依赖

PhaseA-DBG 警告补充本文件直接依赖中 text.ll 仍缺失的模块(含 SHA1),
精确定位是哪个依赖未完成(通常其自身依赖链上某文件先失败);全部直接
依赖已就绪仍 pending 时提示缺失在传递依赖/MRO/vpi 侧。最终 Phase A
错误提示补充定位指引。
This commit is contained in:
TermiNexus committed 2026-08-23 12:54:21 +08:00
1 parent 2e6c37294d
commit 0ffe99e722
1 file changed
+65 -3
+65 -3
View File
@@ -708,10 +708,70 @@ def RunMultiFileProject(mb: memhub.MemBuddy | t.CPtr,
stdlib.free(im_mod_buf)
if tr_a._deps_pending != 0:
# 依赖模块 text.ll 未生成(同项目文件顺序),不写盘,下遍重试
# 诊断增强:遍历本文件直接依赖,列出 text.ll 仍缺失的模块
# (含 SHA1)——精确定位是哪个依赖未完成(通常是其自身依赖链
# 上某个文件先失败,text.ll 从未落盘)。全部直接依赖已就绪仍
# pending 时,说明缺失在传递依赖/MRO/vpi 侧,据此缩小排查范围。
fb_dp: str = VLogger.fmt_buf()
if fb_dp is not None:
viperlib.snprintf(fb_dp, 1024,
"Phase A 依赖未就绪,下遍重试: %s", ent.Path)
miss_dp: bytes = stdlib.malloc(768)
if miss_dp is not None:
miss_dp[0] = '\0'
md_cnt: int = 0
if tr_a._imported_modules is not None:
im_dp_len: t.CSizeT = string.strlen(tr_a._imported_modules)
im_dp_pos: t.CSizeT = 0
while im_dp_pos < im_dp_len:
im_dp_start: t.CSizeT = im_dp_pos
while im_dp_pos < im_dp_len and tr_a._imported_modules[im_dp_pos] != ' ':
im_dp_pos += 1
im_dp_mod_len: t.CSizeT = im_dp_pos - im_dp_start
if im_dp_pos < im_dp_len:
im_dp_pos += 1
if im_dp_mod_len == 0:
continue
im_dp_buf: bytes = stdlib.malloc(im_dp_mod_len + 1)
if im_dp_buf is None:
continue
string.strncpy(im_dp_buf, tr_a._imported_modules + im_dp_start, im_dp_mod_len)
im_dp_buf[im_dp_mod_len] = '\0'
im_dp_sha1: str = StubMergerStore.LookupSha1ByModName(im_dp_buf)
im_dp_missing: int = 1
if im_dp_sha1 is not None:
im_dp_txt: str = StubMergerCollect._sliced_path(
temp_dir, td_len_pa, im_dp_sha1, "text.ll")
if im_dp_txt is not None:
im_dp_f: fileio.File | t.CPtr = fileio.File(im_dp_txt, fileio.MODE.R)
if not im_dp_f.closed:
im_dp_f.close()
im_dp_missing = 0
stdlib.free(im_dp_txt)
if im_dp_missing != 0:
if md_cnt > 0 and string.strlen(miss_dp) < 700:
string.strcat(miss_dp, ", ")
if string.strlen(miss_dp) < 700:
if im_dp_sha1 is not None:
viperlib.snprintf(miss_dp + string.strlen(miss_dp),
768 - string.strlen(miss_dp),
"%s(%s)", im_dp_buf, im_dp_sha1)
else:
viperlib.snprintf(miss_dp + string.strlen(miss_dp),
768 - string.strlen(miss_dp),
"%s(sha1?)", im_dp_buf)
md_cnt += 1
stdlib.free(im_dp_buf)
if md_cnt > 0:
viperlib.snprintf(fb_dp, 1024,
"Phase A 依赖未就绪,下遍重试: %s | 缺失 text.ll 的直接依赖: %s",
ent.Path, miss_dp)
else:
viperlib.snprintf(fb_dp, 1024,
"Phase A 依赖未就绪,下遍重试: %s | 直接依赖 text.ll 均已生成"
"(缺失可能在传递依赖/MRO/vpi 侧)", ent.Path)
stdlib.free(miss_dp)
else:
viperlib.snprintf(fb_dp, 1024,
"Phase A 依赖未就绪,下遍重试: %s", ent.Path)
# --nowarn-register 亦抑制此类 Phase A 依赖重试 WARN(刷屏收敛)
if VLogger.nowarn_register() == 0:
VLogger.warning(fb_dp, "PhaseA-DBG")
@@ -795,7 +855,9 @@ def RunMultiFileProject(mb: memhub.MemBuddy | t.CPtr,
fb_err: str = VLogger.fmt_buf()
if fb_err is not None:
viperlib.snprintf(fb_err, 1024,
"Phase A 无法完成翻译: %s(请检查依赖模块是否已编译/注册)", ent_err.Path)
"Phase A 无法完成翻译: %s(请检查依赖模块是否已编译/注册;"
"缺失依赖明细见上方 PhaseA-DBG 警告,若被 --nowarn-register 抑制请去掉该参数重跑)",
ent_err.Path)
VLogger.error(fb_err, "PhaseA")
stdlib.free(done_flags)
VLogger.error("Phase A 多遍收敛失败,终止编译", "PhaseA")