跳至內容

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.runtimeArc<Runtime>
  • Runtime 持有 lint 的路徑
  • 執行時,它使用 rayon 並行迭代 Runtime 路徑
  • 它會發送一個 None 以完成

LintService 實作

Runtimeprocess_path()

  • 從路徑推斷擴展名和內容
  • 支援 .[m|c]?[j|t]s.[j|t]sx 擴展名
  • 針對 .vue.astro.svelte 的例外情況,並部分支援 script 區塊
  • 處理 JavaScript 和 TypeScript 來源
  • 執行 lint 並將結果發送到 DiagnosticService

Runtime 路徑處理

Runtimeprocess_source()

  • 使用解析器將來源處理為 AST
  • SemanticBuilder 建立 LintContext,並透過 Linter 執行

Runtime 來源處理

crates/oxc_semantic:SemanticBuilder

SemanticBuilder 建構從來源提取的語義資訊。

SemanticBuilder 來源

  • source_text:原始碼
  • nodes:AST 節點
  • classes:類別
  • scopes:範圍
  • trivias:註解
  • jsdoc:JSDoc
  • 等等。

SemanticBuilder 建構時,它會產生 SemanticBuilderReturn,但只有 Semantic 會傳遞給 LintContext

SemanticBuilder 返回

crates/oxc_linter:LintContext

LintContext 來源

代表上下文,以 Semantic 作為主要內容。它包括每個資訊片段的 getter,以及像 diagnostic() 這樣的方法,用於通知 lint 問題。

crates/oxc_linter:Linter

Linter 來源

Linterrun() 函式是 lint 過程的核心。

  • Linterself.rules 中持有要在目標來源上執行的規則
  • 每個規則都可以根據 trait 實作三種類型的處理
  • 它會依序執行這三種模式

如需目前實作的規則,請參閱此清單。

已實作的規則

如需新增規則,請記得更新此清單。

Linter 範例

儲存庫提供了建立 linter 的最小程式碼設定。

最小的 Linter 程式碼

根據 MIT 授權發佈。