Linter 架构
本文最初发布在 leaysgur.github.io/posts 上,作者是 @leaysgur。
apps/oxlint
oxlint 二进制文件是通过从 apps/oxlint crate 构建 main.rs 的结果。
在此,它解析参数,然后运行 LintRunner。
crates/oxc_diagnostics
LintService 将 mpsc::channel Sender 传递给 oxc_diagnostics 以接收 lint 结果。
它格式化并显示接收到的消息。格式化由 miette crate 完成。
crates/oxc_linter
从 LintService 开始
- 将
self.runtime作为Arc<Runtime>持有 Runtime持有用于 linting 的路径- 在运行时,它使用
rayon并行迭代Runtime路径 - 它发送一个
None来完成
Runtime: process_path()
- 推导出路径中的扩展名和内容
- 支持
.[m|c]?[j|t]s或.[j|t]sx扩展名 - 对
.vue、.astro和.svelte的例外情况,script块提供部分支持 - 处理 JavaScript 和 TypeScript 源代码
- 执行代码检查并向
DiagnosticService发送结果。
运行时:process_source()
- 使用解析器将源代码处理成 AST
- 从
SemanticBuilder创建LintContext并通过Linter运行
crates/oxc_semantic: SemanticBuilder
SemanticBuilder 构建从源代码中提取出的语义信息。
source_text:源代码节点:AST 节点类:类作用域:作用域trivias:注释jsdoc:JSDoc- 等。
当 SemanticBuilder 构建时,它生成 SemanticBuilderReturn,但只有 Semantic 会传递给 LintContext。
crates/oxc_linter: LintContext
表示上下文,以 Semantic 为主体。它包括用于每一个信息片段的 getter 和一些用于通知代码检查问题的方法,如 diagnostic()。
crates/oxc_linter: Linter
此 Linter 的 run() 函数是代码检查流程的核心。
Linter在self.rules中保存要在目标源代码上执行的规则- 根据该特性,每个规则可以实现三种类型的处理
- 它顺序执行这三种模式
有关当前实现的规则,请参阅此列表。
添加新规则时,别忘记更新此列表。
Linter 示例
此存储库提供了用于创建 linter 的最少代码配置。