From e7a7bf8a79ba69247e581f51a9535b5437642a11 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Sat, 6 Feb 2021 13:39:01 +0100 Subject: fix(lsp): fix asset cache lookup regression Commit 2828690fc ("fix(lsp): fix deadlocks, use one big mutex") from last month introduced a regression in asset cache lookups where results of lazy caching were lost due to operating on a copy of the asset cache. This commit fixes that by copying the asset from the copy to the real cache. --- cli/lsp/language_server.rs | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) (limited to 'cli/lsp/language_server.rs') diff --git a/cli/lsp/language_server.rs b/cli/lsp/language_server.rs index 0fa7f9d68..82ee2a0dd 100644 --- a/cli/lsp/language_server.rs +++ b/cli/lsp/language_server.rs @@ -146,11 +146,7 @@ impl Inner { Err(anyhow!("asset is missing: {}", specifier)) } } else { - let mut state_snapshot = self.snapshot(); - if let Some(asset) = - tsc::get_asset(&specifier, &self.ts_server, &mut state_snapshot) - .await? - { + if let Some(asset) = self.get_asset(&specifier).await? { Ok(asset.line_index) } else { Err(anyhow!("asset is missing: {}", specifier)) @@ -508,6 +504,17 @@ impl Inner { ) -> Option { self.documents.version(&specifier) } + + async fn get_asset( + &mut self, + specifier: &ModuleSpecifier, + ) -> Result, AnyError> { + let mut state_snapshot = self.snapshot(); + let maybe_asset = + tsc::get_asset(&specifier, &self.ts_server, &mut state_snapshot).await?; + self.assets.insert(specifier.clone(), maybe_asset.clone()); + Ok(maybe_asset) + } } // lspower::LanguageServer methods. This file's LanguageServer delegates to us. @@ -1773,11 +1780,10 @@ impl Inner { None } } else { - let mut state_snapshot = self.snapshot(); - if let Some(asset) = - tsc::get_asset(&specifier, &self.ts_server, &mut state_snapshot) - .await - .map_err(|_| LspError::internal_error())? + if let Some(asset) = self + .get_asset(&specifier) + .await + .map_err(|_| LspError::internal_error())? { Some(asset.text) } else { -- cgit v1.2.3