rustc_span::SourceMap::lookup_source_file返回错误本地路径问题求助
获取Rustc函数定义真实文件路径的问题与解决
问题1:返回不存在路径的原因
这是因为rustup安装的rustc源码采用了路径重映射机制:
- 通过rustup安装
rustc-src组件时,源码实际存储在lib/rustlib/rustc-src/rust/目录下 - 但rustc在编译自身时,会使用虚拟逻辑路径
lib/rustlib/src/rust/引用源码(这是rustc构建系统的约定) SourceMap中存储的是编译时的逻辑路径,而非文件系统的实际物理路径,所以直接取出的路径在本地环境中不存在
问题2:当前实现的问题与替代方案
你手动匹配RealFileName的方式没有利用rustc内置的路径重映射逻辑,容易遗漏特殊情况。推荐两种更可靠的实现方式:
方案1:使用RealFileName内置的local_path方法
RealFileName提供了local_path()方法,会自动处理重映射规则,直接返回真实本地路径:
let filename = file.name.clone(); let path_of_file = match filename { FileName::Real(real_file) => Ok(real_file.local_path()), _ => Err(format!("非真实文件: {:?}", filename)), };
方案2:直接调用FileMap的path方法
SourceMap返回的FileMap结构体自带path()方法,会自动返回经过重映射后的真实路径,无需手动处理FileName枚举:
let path_of_file = source_map.path(file);
额外校验建议
如果需要确认路径有效性,可以结合标准库的路径检查:
if let Ok(path) = path_of_file { if !path.exists() { eprintln!("路径不存在: {:?}", path); eprintln!("当前重映射配置: {:?}", source_map.remap_path()); } }
内容的提问来源于stack exchange,提问作者Endericedragon
相关产品推荐
相关产品推荐

