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
持有 lint 的路徑- 執行時,它使用
rayon
並行迭代Runtime
路徑 - 它會發送一個
None
以完成
Runtime
:process_path()
- 從路徑推斷擴展名和內容
- 支援
.[m|c]?[j|t]s
或.[j|t]sx
擴展名 - 針對
.vue
、.astro
和.svelte
的例外情況,並部分支援script
區塊 - 處理 JavaScript 和 TypeScript 來源
- 執行 lint 並將結果發送到
DiagnosticService
Runtime
:process_source()
- 使用解析器將來源處理為 AST
- 從
SemanticBuilder
建立LintContext
,並透過Linter
執行
crates/oxc_semantic:SemanticBuilder
SemanticBuilder
建構從來源提取的語義資訊。
source_text
:原始碼nodes
:AST 節點classes
:類別scopes
:範圍trivias
:註解jsdoc
:JSDoc- 等等。
當 SemanticBuilder
建構時,它會產生 SemanticBuilderReturn
,但只有 Semantic
會傳遞給 LintContext
。
crates/oxc_linter:LintContext
代表上下文,以 Semantic
作為主要內容。它包括每個資訊片段的 getter,以及像 diagnostic()
這樣的方法,用於通知 lint 問題。
crates/oxc_linter:Linter
此 Linter
的 run()
函式是 lint 過程的核心。
Linter
在self.rules
中持有要在目標來源上執行的規則- 每個規則都可以根據 trait 實作三種類型的處理
- 它會依序執行這三種模式
如需目前實作的規則,請參閱此清單。
如需新增規則,請記得更新此清單。
Linter 範例
儲存庫提供了建立 linter 的最小程式碼設定。