已关闭
[issue] 独立文件输入仅 lib/main/mod.rs 视为 crate 根,其余入口按子目录规则解析 mod #19
cezarbbb创建于 9月9日关闭于 9月20日
WangZijun
9月18日 评论:
9月18日 评论:
https://gitcode.com/xuanwu/bot-metric/pull/17
结论:
- 问题可以复现:修复前的最小复现与回归测试确认了 issue 描述的行为。
- 问题可以修复:当前分支的针对性测试和全量质量门禁均已验证修复结果。
具体修复:
- 仅把初始的独立
--file app.rs明确视为 crate 根,使mod helper;与 rustc 一样解析同目录文件。 - 发现的子模块继续使用普通路径推断,确保
helper.rs -> helper/nested.rs不会被错误提升为新的 crate 根。 - 增加真实 CLI、嵌套模块、Cargo 行为及边界保护回归测试。


问题概述
--file独立文件输入时,仅 lib.rs / main.rs / mod.rs 被视为 crate 根(mod-rs);其他文件名(如 app.rs)中的mod x;按子目录规则解析(到同名子目录查找),与 rustc 对独立文件的解析行为存在差异(源码位置src/.../collector.rs:719)。首次出现版本:v1.0.0 即存在,v1.1.0 延续。受影响对象:--file独立文件输入。实际影响:非标准命名的独立文件模块解析结果可能与 rustc 不一致,影响 scope=tree / file+modules 下的指标统计范围。本问题涉及输入解析口径。影响范围
--resolve-modules)与 scope=tree / file+modules 的计入范围;报告 input.files 组成--edition并按 rustc 规则组织目录复现步骤
最小源码样例:夹具
fixtures\standalone(app.rs + app/ 子目录模块对,5 个 .rs 文件、26 行)。自包含最小样例如下(构造 mod 解析差异场景,可直接创建后复现;下述命令中的<modcase>即指向该样例目录):app.rs(非 lib.rs/main.rs/mod.rs 命名的入口文件):mod helper; pub fn run() -> u32 { helper::value() }helper.rs(与 app.rs 同目录):pub fn value() -> u32 { 42 }说明:rustc(edition 2018+)将命令行传入的 app.rs 作为 crate 根,
mod helper;解析到同目录 helper.rs;bot-metric 仅将 lib.rs/main.rs/mod.rs 视为 crate 根,对 app.rs 按非 mod-rs 规则解析到app/helper.rs子目录(collector.rs:719),故--resolve-modules下计入的文件集合与 rustc 不一致。BM110 analyze --file <modcase>\app.rs --resolve-modules --format jsonmod声明解析到何处)rustc --edition 2018 --emit=metadata <standalone>\app.rs观察其模块解析预期结果
与 rustc 对独立文件的解析规则一致,或文档明确 bot-metric 的 crate 根判定规则(仅 lib.rs/main.rs/mod.rs)。
实际结果
仅 lib.rs / main.rs / mod.rs 被视为 crate 根;app.rs 中的
mod声明按子目录规则解析(到 app/ 子目录查找),与 rustc 解析存在差异。两平台行为一致。证据:x86_linux\records\batch-02\;arm_linux\records-arm64\batch-02\。证据原文(x86_linux\records\batch-02\t2.4-standalone-file.txt,7 行全文):
证据原文(x86_linux\records\batch-02\t2.5-resolve-modules.txt,7 行全文):
证据原文(arm_linux\records-arm64\batch-02\t2.4-standalone-file.txt,7 行全文):
证据原文(arm_linux\records-arm64\batch-02\t2.5-resolve-modules.txt,9 行全文):
(对照说明:main.rs(mod-rs)
--resolve-modules解析出同目录 util.rs;app.rs(非 mod-rs)仅 scope=file 单文件、mod声明到 app/ 子目录解析——两平台记录一致。)分析环境与范围
--file app.rs --resolve-modules,默认 scope)指标、发现与报告证据
性能与资源证据
附件与提交确认