diff --git a/App/lib/Stub/StubGen/VpiReader.vp b/App/lib/Stub/StubGen/VpiReader.vp index 1128b5f..2839349 100644 --- a/App/lib/Stub/StubGen/VpiReader.vp +++ b/App/lib/Stub/StubGen/VpiReader.vp @@ -1326,17 +1326,23 @@ def _ParseVpiIntoModuleImpl(pool: memhub.MemBuddy | t.CPtr, is_pkg_init_rt: int = 0 rel_path_rt: str = StubMergerStore.LookupSha1RelPath(src_sha1) if rel_path_rt is not None: - rp_len_rt: t.CSizeT = string.strlen(rel_path_rt) - if rp_len_rt >= 9 \ - and string.strcmp(rel_path_rt + rp_len_rt - 9, "__init__.vp") == 0: + # [FIX] 原判定 strcmp(rel_path + strlen(rel_path) - 9, "__init__.vp") + # 假设 "__init__.vp" 从 len-9 开始;实际包路径 "ast/__init__.vp" + # 长 15,该后缀从索引 4 起(11 字符),len-9=6 指向 "init__.vp" + # → 判定恒 false → 包重导出永不触发(ast.Attribute 未注册根因之一)。 + # 改用 strstr 判定 rel_path 包含 "__init__.vp"(仅包 __init__ 文件命中)。 + if string.strstr(rel_path_rt, "__init__.vp") is not None: is_pkg_init_rt = 1 - # 解析被 from-import 的模块 sha1:相对导入(.exprs)按 StubMergerStore - # 约定去前导点后缀匹配;绝对模块名精确匹配 + # 解析被 from-import 的模块 sha1:相对导入按 parser 表示判定—— + # 前导点存于 level(from .exprs import → level=1, module="exprs", + # 见 includes/ast/stmts.vp ImportFrom.level / parser.vp _parse_from_import), + # module 字段不含前导点。原判定 sifr_mod[0]=='.' 永远不成立 → 走绝对 + # 分支 LookupSha1ByModName("exprs") 查不到 "ast.exprs" → sub_sha1=None + # → 重导出被跳过(ast.Attribute 未注册根因之二)。 sub_sha1_rt: str = None - if sifr_mod[0] != '\0' and sifr_mod[0] == '.': - sub_suffix_rt: str = sifr_mod + 1 - if sub_suffix_rt is not None and sub_suffix_rt[0] != '\0': - sub_sha1_rt = StubMergerStore.LookupSha1ByModNameSuffix(sub_suffix_rt) + if sifr.level > 0: + if sifr_mod is not None and sifr_mod[0] != '\0': + sub_sha1_rt = StubMergerStore.LookupSha1ByModNameSuffix(sifr_mod) else: sub_sha1_rt = StubMergerStore.LookupSha1ByModName(sifr_mod) if sifr.names is not None: