From 73da31787a6c7711e81a43719e2e4c3d6c4466c7 Mon Sep 17 00:00:00 2001 From: Sysix <3897725+Sysix@users.noreply.github.com> Date: Sat, 13 Dec 2025 12:39:25 +0000 Subject: [PATCH] refactor(oxlint/lsp): use fs as param in TsGoLintState, instead of source text (#16667) In the future, the language server wants to lint multiple files at the same time. Refactored the code to accept the RuntimeFS (like the CLI tool) for reading the source text. --- .../src/linter/isolated_lint_handler.rs | 2 +- crates/oxc_linter/src/lint_runner.rs | 3 +-- crates/oxc_linter/src/tsgolint.rs | 15 ++++++++++++--- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/crates/oxc_language_server/src/linter/isolated_lint_handler.rs b/crates/oxc_language_server/src/linter/isolated_lint_handler.rs index f00dde8ee3395..f682596ceae35 100644 --- a/crates/oxc_language_server/src/linter/isolated_lint_handler.rs +++ b/crates/oxc_language_server/src/linter/isolated_lint_handler.rs @@ -125,7 +125,7 @@ impl IsolatedLintHandler { let mut messages: Vec = self .runner - .run_source(&Arc::from(path.as_os_str()), source_text.to_string(), &fs) + .run_source(&Arc::from(path.as_os_str()), &fs) .into_iter() .map(|message| message_to_lsp_diagnostic(message, uri, source_text, rope)) .collect(); diff --git a/crates/oxc_linter/src/lint_runner.rs b/crates/oxc_linter/src/lint_runner.rs index 7eee7b218e0d5..5379059131e99 100644 --- a/crates/oxc_linter/src/lint_runner.rs +++ b/crates/oxc_linter/src/lint_runner.rs @@ -236,14 +236,13 @@ impl LintRunner { pub fn run_source( &self, file: &Arc, - source_text: String, file_system: &(dyn crate::RuntimeFileSystem + Sync + Send), ) -> Vec { let mut messages = self.lint_service.run_source(file_system, vec![Arc::clone(file)]); if let Some(type_aware_linter) = &self.type_aware_linter { let tsgo_messages = - match type_aware_linter.lint_source(file, source_text, self.directives_store.map()) + match type_aware_linter.lint_source(file, file_system, self.directives_store.map()) { Ok(msgs) => msgs, Err(err) => { diff --git a/crates/oxc_linter/src/tsgolint.rs b/crates/oxc_linter/src/tsgolint.rs index 89a4e4a885b01..330a768637b77 100644 --- a/crates/oxc_linter/src/tsgolint.rs +++ b/crates/oxc_linter/src/tsgolint.rs @@ -6,6 +6,7 @@ use std::{ sync::{Arc, Mutex}, }; +use oxc_allocator::Allocator; use rustc_hash::FxHashMap; use serde::{Deserialize, Serialize}; @@ -320,12 +321,20 @@ impl TsGoLintState { pub fn lint_source( &self, path: &Arc, - source_text: String, + file_system: &(dyn crate::RuntimeFileSystem + Sync + Send), disable_directives_map: Arc>>, ) -> Result, String> { let mut resolved_configs: FxHashMap = FxHashMap::default(); let mut source_overrides = FxHashMap::default(); - source_overrides.insert(path.to_string_lossy().to_string(), source_text.clone()); + let allocator = Allocator::default(); + let Ok(source_text) = file_system.read_to_arena_str(Path::new(path.as_ref()), &allocator) + else { + return Err(format!("Failed to read source text for file: {}", path.to_string_lossy())); + }; + + // Clone source_text to own it for the spawned thread + let source_text_owned = source_text.to_string(); + source_overrides.insert(path.to_string_lossy().to_string(), source_text_owned.clone()); let json_input = self.json_input( std::slice::from_ref(path), @@ -383,7 +392,7 @@ impl TsGoLintState { let mut message = Message::from_tsgo_lint_diagnostic( tsgolint_diagnostic, - &source_text, + &source_text_owned, ); message.error.severity = if severity == AllowWarnDeny::Deny {