From 91626bac4974150cfac4ca10c9e83d82633540df Mon Sep 17 00:00:00 2001 From: Nayeem Rahman Date: Thu, 30 Nov 2023 16:23:47 +0000 Subject: perf(lsp): avoid redundant getNavigationTree() calls (#21396) --- cli/lsp/language_server.rs | 66 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 20 deletions(-) (limited to 'cli/lsp/language_server.rs') diff --git a/cli/lsp/language_server.rs b/cli/lsp/language_server.rs index f8adb6bb6..5ee2ef776 100644 --- a/cli/lsp/language_server.rs +++ b/cli/lsp/language_server.rs @@ -2147,34 +2147,60 @@ impl Inner { .normalize_url(¶ms.text_document.uri, LspUrlKind::File); if !self.is_diagnosable(&specifier) || !self.config.specifier_enabled(&specifier) - || !self.config.enabled_code_lens_for_specifier(&specifier) { return Ok(None); } let mark = self.performance.mark("code_lens", Some(¶ms)); let asset_or_doc = self.get_asset_or_document(&specifier)?; - let navigation_tree = - self.get_navigation_tree(&specifier).await.map_err(|err| { - error!("Error getting code lenses for \"{}\": {}", specifier, err); - LspError::internal_error() - })?; - let parsed_source = asset_or_doc.maybe_parsed_source().and_then(|r| r.ok()); - let line_index = asset_or_doc.line_index(); - let code_lenses = code_lens::collect( - &specifier, - parsed_source, - &self.config, - line_index, - &navigation_tree, - ) - .await - .map_err(|err| { - error!("Error getting code lenses for \"{}\": {}", specifier, err); - LspError::internal_error() - })?; + let settings = self.config.workspace_settings_for_specifier(&specifier); + let mut code_lenses = Vec::new(); + if settings.code_lens.test + && self.config.specifier_enabled_for_test(&specifier) + { + if let Some(Ok(parsed_source)) = asset_or_doc.maybe_parsed_source() { + code_lenses.extend( + code_lens::collect_test(&specifier, parsed_source).map_err( + |err| { + error!( + "Error getting test code lenses for \"{}\": {}", + &specifier, err + ); + LspError::internal_error() + }, + )?, + ); + } + } + if settings.code_lens.implementations || settings.code_lens.references { + let navigation_tree = + self.get_navigation_tree(&specifier).await.map_err(|err| { + error!("Error getting code lenses for \"{}\": {}", specifier, err); + LspError::internal_error() + })?; + let line_index = asset_or_doc.line_index(); + code_lenses.extend( + code_lens::collect_tsc( + &specifier, + &settings.code_lens, + line_index, + &navigation_tree, + ) + .await + .map_err(|err| { + error!( + "Error getting ts code lenses for \"{}\": {}", + &specifier, err + ); + LspError::internal_error() + })?, + ); + } self.performance.measure(mark); + if code_lenses.is_empty() { + return Ok(None); + } Ok(Some(code_lenses)) } -- cgit v1.2.3