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 {