Skip to content

Arquitetura do linter

Artigo original em leaysgur.github.io/posts, por @leaysgur.

apps/oxlint

O binário oxlint compila main.rs da crate apps/oxlint.

Cargo.toml

Analisa argumentos de linha de comando e chama LintRunner.

Fluxo principal

crates/oxc_diagnostics

LintService envia pelo Sender de mpsc::channel resultados ao oxc_diagnostics.

Receber resultados

Formata e exibe com o crate miette.

crates/oxc_linter

LintService:

  • guarda self.runtime como Arc<Runtime>
  • Runtime tem os caminhos a avaliar
  • percorre em paralelo com rayon
  • envia None ao terminar

implementação

Runtime::process_path()

  • infere extensão e tipo de arquivo
  • suporta .[m|c]?[j|t]s ou .[j|t]sx
  • exceções: .vue, .astro, .svelte (blocos script parciais)
  • processa fontes JS/TS
  • dispara lint e envia ao DiagnosticService

process_path

Runtime::process_source()

  • parse → AST
  • SemanticBuilderLintContext → executa Linter

process_source

crates/oxc_semantic — SemanticBuilder

Monta dados semânticos a partir da fonte.

código do builder

Inclui: source_text, nós AST, classes, escopos, comentários, JSDoc, etc.

Ao final retorna SemanticBuilderReturn; só Semantic segue para LintContext.

retorno do builder

crates/oxc_linter — LintContext

context.rs

Wrap do Semantic com getters e diagnostic() para emitir alertas.

crates/oxc_linter — Linter

lib.rs

run() coordena execução — self.rules; cada regra pode ter até três fases tratadas pela trait, executadas em sequência.

Listagem das regras:

rules.rs

Novas regras: atualize essa lista.

Exemplo mínimo

examples/linter.rs