Skip to content

린터 아키텍처

이 문서는 @leaysgurleaysgur.github.io/posts에서 원본 게시됨.

apps/oxlint

oxlint 바이너리는 apps/oxlint 크레이트의 main.rs를 빌드하여 생성됩니다.

Cargo.toml 구성

여기서는 인수를 파싱한 후 LintRunner를 실행합니다.

린트 실행 흐름

crates/oxc_diagnostics

LintServicempsc::channel Sender를 oxc_diagnostics에 전달하여 린트 결과를 수신합니다.

린트 결과 수신

수신된 메시지를 포맷팅하고 표시합니다. 포맷팅은 miette 크레이트에 의해 수행됩니다.

miette 크레이트 참조

crates/oxc_linter

LintService부터 시작:

  • self.runtimeArc<Runtime>로 보유
  • Runtime은 린트를 위한 경로를 보유
  • 실행 시, rayon을 사용하여 Runtime 경로를 병렬로 반복
  • 완료를 위해 None을 전송

LintService 구현

Runtime: process_path()

  • 경로에서 확장자 및 내용 추론
  • .[m|c]?[j|t]s 또는 .[j|t]sx 확장자 지원
  • .vue, .astro, .svelte에 대한 예외 처리 (스크립트 블록 부분적 지원 포함)
  • 자바스크립트 및 타입스크립트 소스 처리
  • 린트 실행 및 결과를 DiagnosticService에 전송

런타임 경로 처리

Runtime: process_source()

  • 소스를 파서로 처리하여 AST 생성
  • SemanticBuilder로부터 LintContext 생성 및 Linter를 통해 실행

런타임 소스 처리

crates/oxc_semantic: SemanticBuilder

SemanticBuilder는 소스에서 추출된 의미 정보를 생성합니다.

SemanticBuilder 소스

  • source_text: 소스 코드
  • nodes: AST 노드
  • classes: 클래스
  • scopes: 스코프
  • trivias: 주석
  • jsdoc: JSDoc
  • 등등

SemanticBuilder가 빌드될 때, SemanticBuilderReturn을 생성하지만, LintContext에 전달되는 것은 Semantic뿐입니다.

SemanticBuilder 반환값

crates/oxc_linter: LintContext

LintContext 소스

주요 내용으로 Semantic을 포함하는 컨텍스트를 나타냅니다. 각 정보에 대한 접근자와 린트 문제를 알리는 diagnostic() 같은 메서드를 포함합니다.

crates/oxc_linter: Linter

Linter 소스

Linterrun() 함수는 린트 프로세스의 핵심입니다.

  • Linterself.rules에 대상 소스에 적용할 규칙을 보유
  • 각 규칙은 트레잇에 따라 세 가지 유형의 처리를 구현할 수 있음
  • 이 세 가지 패턴을 차례로 실행

현재 구현된 규칙에 대해서는 다음 목록을 참조하세요.

구현된 규칙

새 규칙을 추가할 경우 이 목록을 업데이트해야 합니다.

린터 예제

리포지토리는 린터를 생성하기 위한 최소 코드 구성 제공합니다.

최소 린터 코드