使用rustc_interface进行类型检查
rustc_span
Rust 编译器中用于源代码位置跟踪和定位的库。它提供了对源代码位置、跟踪、范围和跨文件的操作和查询的功能。这个库对于诊断、错误信息、编译器插件、代码检查等任务非常有用。
主要功能:
-
源代码位置 (Span) 的表示
rustc_span::Span 是一个表示源代码的位置范围和位置信息的结构体。它包含了文件名称、行号、列号以及start-end 的字节偏移等信息。Span 可以用于定位和标识源代码的特定部分 -
范围操作和查询
Span 结构体提供各种方法来处理和查询范围。可以合并不同的 Span、切割 Span、比较和检查 Span 是否重叠等。这些操作对于分析、处理和表示源代码位置和范围非常有用 -
错误信息和诊断
rustc_span 提供了错误信息和诊断报告的功能。可以使用 rustc_span::DiagnosticBuilder 来创建和生成错误、警告、提示等诊断消息,并将其与对应的 Span 相关联。这使得编译器能够在给出错误消息时同时提供程序的准确位置 -
文件和文件位置的操作
rustc_span 提供了一些操作文件和文件位置的功能。可以使用 rustc_span::source_map::SourceMap 来处理文件和文件位置,如获取文件路径、读取文件内容、将文件位置转换为 Span 等
通过使用 rustc_span 库,可以在编写编译器插件、代码检查工具或任何需要源代码位置信息的任务中准确地跟踪、定位和操作源代码。
对于静态分析、错误检测、调试等功能非常有用。
rustc_span::source_map
Types for tracking pieces of source code within a crate.
跟踪一个crate中的代码片段的类型
SourceMap 跟踪单个 crate 中使用的所有源代码,从整数字节位置映射到原始源代码位置(from integer byte positions to the original source code location)。
在 crate 解析期间解析的每一位源代码(通常是文件、内存中的字符串或宏扩展的各个位)覆盖 SourceMap 中的连续字节范围(cover a continuous range of bytes in the SourceMap),并由 SourceFiles 表示(are represented by SourceFiles)。
字节位置存储在 Span 中并在编译器中普遍使用(used pervasively in the compiler)。它们是 SourceMap 中的绝对位置(absolute positions),可以根据请求转换为行和列信息、源代码片段(source code snippets)等。
rustc_span::source_map::SourceMap
pub struct SourceMap {
files: RwLock<SourceMapFiles>,
file_loader: IntoDynSyncSend<Box<dyn FileLoader + Sync + Send>>,
path_mapping: FilePathMapping,
hash_kind: SourceFileHashAlgorithm,
}
rustc_interface::interface::Config
pub struct Config {
pub opts: Options, // 这里的Options不是Option,它是 rustc_session::options::Options,是一个结构体
pub crate_cfg: Vec<String>,
pub crate_check_cfg: Vec<String>,
pub input: Input,
pub output_dir: Option<PathBuf>,
pub output_file: Option<OutFileName>,
pub ice_file: Option<PathBuf>,
pub file_loader: Option<Box<dyn FileLoader + Send + Sync>>,
pub locale_resources: &'static [&'static str],
pub lint_caps: FxHashMap<LintId, Level>,
pub parse_sess_created: Option<Box<dyn FnOnce(&mut ParseSess) + Send>>,
pub hash_untracked_state: Option<Box<dyn FnOnce(&Session, &mut StableHasher) + Send>>,
pub register_lints: Option<Box<dyn Fn(&Session, &mut LintStore) + Send + Sync>>,
pub override_queries: Option<fn(_: &Session, _: &mut Providers)>,
pub make_codegen_backend: Option<Box<dyn FnOnce(&Options) -> Box<dyn CodegenBackend> + Send>>,
pub registry: