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 的最少代码配置。