린터 아키텍처
이 문서는 @leaysgur의 leaysgur.github.io/posts에서 원본 게시됨.
apps/oxlint
oxlint 바이너리는 apps/oxlint 크레이트의 main.rs를 빌드하여 생성됩니다.
여기서는 인수를 파싱한 후 LintRunner를 실행합니다.
crates/oxc_diagnostics
LintService는 mpsc::channel Sender를 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에 대한 예외 처리 (스크립트 블록 부분적 지원 포함)- 자바스크립트 및 타입스크립트 소스 처리
- 린트 실행 및 결과를
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에 대상 소스에 적용할 규칙을 보유- 각 규칙은 트레잇에 따라 세 가지 유형의 처리를 구현할 수 있음
- 이 세 가지 패턴을 차례로 실행
현재 구현된 규칙에 대해서는 다음 목록을 참조하세요.
새 규칙을 추가할 경우 이 목록을 업데이트해야 합니다.
린터 예제
리포지토리는 린터를 생성하기 위한 최소 코드 구성 제공합니다.
