ライタのアーキテクチャ
この記事は @leaysgur によって leaysgur.github.io/posts に投稿されました。
apps/oxlint
oxlint バイナリは、apps/oxlint クレートから main.rs をビルドした結果です。
ここでは引数を解析し、その後 LintRunner を実行します。
crates/oxc_diagnostics
LintService は、mpsc::channel の送信者を oxc_diagnostics に渡し、ライタの結果を受け取ります。
受信したメッセージを形式化して表示します。形式化は miette クレートによって行われます。
crates/oxc_linter
LintService から始まります:
self.runtimeとしてArc<Runtime>を保持Runtimeはライティング用のパスを保持- 実行時、
rayonを使用してRuntime内のパスを並列で反復 - 終了時に
Noneを送信
Runtime: process_path()
- パスから拡張子とコンテンツを推論
.[m|c]?[j|t]sまたは.[j|t]sx拡張子をサポート.vue、.astro、.svelteについては例外扱い(scriptブロックに対して部分的なサポート)- JavaScript および TypeScript のソースを処理
- ライティングを実行し、結果を
DiagnosticServiceに送信
Runtime: process_source()
- パーサーでソースを処理し、AST に変換
SemanticBuilderからLintContextを作成し、それをLinterに渡して実行
crates/oxc_semantic: SemanticBuilder
SemanticBuilder は、ソースから抽出された意味的情報を構築します。
source_text: ソースコードnodes: AST ノードclasses: クラスscopes: サイプtrivias: コメントjsdoc: JSDoc- その他
SemanticBuilder が構築を行う際、SemanticBuilderReturn を生成しますが、LintContext に渡されるのは Semantic だけです。
crates/oxc_linter: LintContext
コンテキストを表しており、主に Semantic が本体です。各情報のゲッターと、diagnostic() のようなライティング問題の通知を行うメソッドを含みます。
crates/oxc_linter: Linter
この Linter の run() 関数がライティングプロセスの核となります。
Linterは、self.rulesにターゲットソースに対して実行するルールを保持- 各ルールは、トレイトに従って3種類の処理を実装可能
- これらの3パターンを順次実行
現在実装済みのルールについては、以下のリストをご参照ください。
新しいルールを追加する場合は、このリストも更新することを忘れないでください。
ライタの例
このリポジトリは、ライタを作成するための最小限のコード構成を提供しています。
