跳至内容

Linter 架构

本文最初发布在 leaysgur.github.io/posts 上,作者是 @leaysgur

apps/oxlint

oxlint 二进制文件是通过从 apps/oxlint crate 构建 main.rs 的结果。

Cargo.toml 配置

在此,它解析参数,然后运行 LintRunner

Lint 执行流

crates/oxc_diagnostics

LintServicempsc::channel Sender 传递给 oxc_diagnostics 以接收 lint 结果。

接收 Lint 结果

它格式化并显示接收到的消息。格式化由 miette crate 完成。

miette crate 参考资料

crates/oxc_linter

LintService 开始

  • self.runtime 作为 Arc<Runtime> 持有
  • Runtime 持有用于 linting 的路径
  • 在运行时,它使用 rayon 并行迭代 Runtime 路径
  • 它发送一个 None 来完成

LintService 实现

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 构建从源代码中提取出的语义信息。

SemanticBuilder 源代码

  • source_text:源代码
  • 节点:AST 节点
  • :类
  • 作用域:作用域
  • trivias:注释
  • jsdoc:JSDoc
  • 等。

SemanticBuilder 构建时,它生成 SemanticBuilderReturn,但只有 Semantic 会传递给 LintContext

SemanticBuilder 返回

crates/oxc_linter: LintContext

LintContext 源代码

表示上下文,以 Semantic 为主体。它包括用于每一个信息片段的 getter 和一些用于通知代码检查问题的方法,如 diagnostic()

crates/oxc_linter: Linter

Linter 源代码

Linterrun() 函数是代码检查流程的核心。

  • Linterself.rules 中保存要在目标源代码上执行的规则
  • 根据该特性,每个规则可以实现三种类型的处理
  • 它顺序执行这三种模式

有关当前实现的规则,请参阅此列表。

已实现的规则

添加新规则时,别忘记更新此列表。

Linter 示例

此存储库提供了用于创建 linter 的最少代码配置。

最小 Linter 代码

在 MIT 许可证下发布。