diff options
author | Nayeem Rahman <nayeemrmn99@gmail.com> | 2024-06-26 23:47:01 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-26 23:47:01 +0100 |
commit | 67dcd6db518446574d3a1e33f4ce536fcdc4fd25 (patch) | |
tree | 23d6aa1d867b1efded9c0e638c89513ca492a44f /cli/lsp/language_server.rs | |
parent | 2a2ff96be13047cb50612fde0f12e5f6df374ad3 (diff) |
feat(lsp): ts language service scopes (#24345)
Diffstat (limited to 'cli/lsp/language_server.rs')
-rw-r--r-- | cli/lsp/language_server.rs | 114 |
1 files changed, 96 insertions, 18 deletions
diff --git a/cli/lsp/language_server.rs b/cli/lsp/language_server.rs index a921584c2..7d8213a24 100644 --- a/cli/lsp/language_server.rs +++ b/cli/lsp/language_server.rs @@ -16,6 +16,7 @@ use deno_graph::Resolution; use deno_runtime::deno_tls::rustls::RootCertStore; use deno_runtime::deno_tls::RootCertStoreProvider; use deno_semver::jsr::JsrPackageReqReference; +use indexmap::Equivalent; use indexmap::IndexSet; use log::error; use serde::Deserialize; @@ -570,7 +571,11 @@ impl Inner { } else { let navigation_tree: tsc::NavigationTree = self .ts_server - .get_navigation_tree(self.snapshot(), specifier.clone()) + .get_navigation_tree( + self.snapshot(), + specifier.clone(), + asset_or_doc.scope().cloned(), + ) .await?; let navigation_tree = Arc::new(navigation_tree); match asset_or_doc { @@ -1065,8 +1070,8 @@ impl Inner { params.text_document.text.into(), file_referrer, ); - self.project_changed([(document.specifier(), ChangeKind::Opened)], false); if document.is_diagnosable() { + self.project_changed([(document.specifier(), ChangeKind::Opened)], false); self.refresh_npm_specifiers().await; self.diagnostics_server.invalidate(&[specifier]); self.send_diagnostics_update(); @@ -1087,11 +1092,21 @@ impl Inner { ) { Ok(document) => { if document.is_diagnosable() { + let old_scopes_with_node_specifier = + self.documents.scopes_with_node_specifier().clone(); + self.refresh_npm_specifiers().await; + let mut config_changed = false; + if !self + .documents + .scopes_with_node_specifier() + .equivalent(&old_scopes_with_node_specifier) + { + config_changed = true; + } self.project_changed( [(document.specifier(), ChangeKind::Modified)], - false, + config_changed, ); - self.refresh_npm_specifiers().await; self.diagnostics_server.invalidate(&[specifier]); self.send_diagnostics_update(); self.send_testing_update(); @@ -1399,7 +1414,7 @@ impl Inner { let mark = self.performance.mark_with_args("lsp.hover", ¶ms); let asset_or_doc = self.get_asset_or_document(&specifier)?; - let file_referrer = asset_or_doc.document().and_then(|d| d.file_referrer()); + let file_referrer = asset_or_doc.file_referrer(); let hover = if let Some((_, dep, range)) = asset_or_doc .get_maybe_dependency(¶ms.text_document_position_params.position) { @@ -1459,7 +1474,12 @@ impl Inner { line_index.offset_tsc(params.text_document_position_params.position)?; let maybe_quick_info = self .ts_server - .get_quick_info(self.snapshot(), specifier.clone(), position) + .get_quick_info( + self.snapshot(), + specifier.clone(), + position, + asset_or_doc.scope().cloned(), + ) .await?; maybe_quick_info.map(|qi| qi.to_hover(line_index, self)) }; @@ -1588,6 +1608,7 @@ impl Inner { &self.config, &specifier, ), + asset_or_doc.scope().cloned(), ) .await; for action in actions { @@ -1682,6 +1703,7 @@ impl Inner { )), params.context.trigger_kind, only, + asset_or_doc.scope().cloned(), ) .await?; let mut refactor_actions = Vec::<CodeAction>::new(); @@ -1732,6 +1754,10 @@ impl Inner { error!("Unable to decode code action data: {:#}", err); LspError::invalid_params("The CodeAction's data is invalid.") })?; + let scope = self + .get_asset_or_document(&code_action_data.specifier) + .ok() + .and_then(|d| d.scope().cloned()); let combined_code_actions = self .ts_server .get_combined_code_fix( @@ -1747,6 +1773,7 @@ impl Inner { &self.config, &code_action_data.specifier, ), + scope, ) .await?; if combined_code_actions.commands.is_some() { @@ -1801,6 +1828,7 @@ impl Inner { &self.config, &action_data.specifier, )), + asset_or_doc.scope().cloned(), ) .await?; code_action.edit = refactor_edit_info.to_workspace_edit(self)?; @@ -1944,6 +1972,7 @@ impl Inner { specifier, line_index.offset_tsc(params.text_document_position_params.position)?, files_to_search, + asset_or_doc.scope().cloned(), ) .await?; @@ -1984,7 +2013,11 @@ impl Inner { specifier.clone(), line_index.offset_tsc(params.text_document_position.position)?, ) - .await?; + .await + .map_err(|err| { + lsp_warn!("Unable to find references: {err}"); + LspError::internal_error() + })?; if let Some(symbols) = maybe_referenced_symbols { let mut results = Vec::new(); @@ -2037,6 +2070,7 @@ impl Inner { self.snapshot(), specifier, line_index.offset_tsc(params.text_document_position_params.position)?, + asset_or_doc.scope().cloned(), ) .await?; @@ -2075,6 +2109,7 @@ impl Inner { self.snapshot(), specifier, line_index.offset_tsc(params.text_document_position_params.position)?, + asset_or_doc.scope().cloned(), ) .await?; @@ -2123,10 +2158,7 @@ impl Inner { .map(|s| s.suggest.include_completions_for_import_statements) .unwrap_or(true) { - let file_referrer = asset_or_doc - .document() - .and_then(|d| d.file_referrer()) - .unwrap_or(&specifier); + let file_referrer = asset_or_doc.file_referrer().unwrap_or(&specifier); response = completions::get_import_completions( &specifier, ¶ms.text_document_position.position, @@ -2158,6 +2190,7 @@ impl Inner { }; let position = line_index.offset_tsc(params.text_document_position.position)?; + let scope = asset_or_doc.scope(); let maybe_completion_info = self .ts_server .get_completions( @@ -2178,6 +2211,7 @@ impl Inner { .fmt_options_for_specifier(&specifier) .options) .into(), + scope.cloned(), ) .await; @@ -2219,6 +2253,10 @@ impl Inner { })?; if let Some(data) = &data.tsc { let specifier = &data.specifier; + let scope = self + .get_asset_or_document(specifier) + .ok() + .and_then(|d| d.scope().cloned()); let result = self .ts_server .get_completion_details( @@ -2240,6 +2278,7 @@ impl Inner { ), ..data.into() }, + scope, ) .await; match result { @@ -2309,7 +2348,11 @@ impl Inner { specifier, line_index.offset_tsc(params.text_document_position_params.position)?, ) - .await?; + .await + .map_err(|err| { + lsp_warn!("{:#}", err); + LspError::internal_error() + })?; let result = if let Some(implementations) = maybe_implementations { let mut links = Vec::new(); @@ -2347,7 +2390,11 @@ impl Inner { let outlining_spans = self .ts_server - .get_outlining_spans(self.snapshot(), specifier) + .get_outlining_spans( + self.snapshot(), + specifier, + asset_or_doc.scope().cloned(), + ) .await?; let response = if !outlining_spans.is_empty() { @@ -2396,7 +2443,11 @@ impl Inner { specifier, line_index.offset_tsc(params.item.selection_range.start)?, ) - .await?; + .await + .map_err(|err| { + lsp_warn!("{:#}", err); + LspError::internal_error() + })?; let maybe_root_path_owned = self .config @@ -2440,6 +2491,7 @@ impl Inner { self.snapshot(), specifier, line_index.offset_tsc(params.item.selection_range.start)?, + asset_or_doc.scope().cloned(), ) .await?; @@ -2487,6 +2539,7 @@ impl Inner { self.snapshot(), specifier, line_index.offset_tsc(params.text_document_position_params.position)?, + asset_or_doc.scope().cloned(), ) .await?; @@ -2549,7 +2602,11 @@ impl Inner { specifier, line_index.offset_tsc(params.text_document_position.position)?, ) - .await?; + .await + .map_err(|err| { + lsp_warn!("{:#}", err); + LspError::internal_error() + })?; if let Some(locations) = maybe_locations { let rename_locations = tsc::RenameLocations { locations }; @@ -2594,6 +2651,7 @@ impl Inner { self.snapshot(), specifier.clone(), line_index.offset_tsc(position)?, + asset_or_doc.scope().cloned(), ) .await?; @@ -2637,6 +2695,7 @@ impl Inner { self.snapshot(), specifier, 0..line_index.text_content_length_utf16().into(), + asset_or_doc.scope().cloned(), ) .await?; @@ -2692,6 +2751,7 @@ impl Inner { specifier, line_index.offset_tsc(params.range.start)? ..line_index.offset_tsc(params.range.end)?, + asset_or_doc.scope().cloned(), ) .await?; @@ -2744,6 +2804,7 @@ impl Inner { specifier, line_index.offset_tsc(params.text_document_position_params.position)?, options, + asset_or_doc.scope().cloned(), ) .await?; @@ -2799,7 +2860,11 @@ impl Inner { ..Default::default() }, ) - .await?, + .await + .map_err(|err| { + lsp_warn!("{:#}", err); + LspError::internal_error() + })?, ); } file_text_changes_to_workspace_edit(&changes, self) @@ -2822,7 +2887,11 @@ impl Inner { file: None, }, ) - .await?; + .await + .map_err(|err| { + error!("{:#}", err); + LspError::invalid_request() + })?; let maybe_symbol_information = if navigate_to_items.is_empty() { None @@ -2849,7 +2918,15 @@ impl Inner { self.ts_server.project_changed( self.snapshot(), modified_scripts, - config_changed, + config_changed.then(|| { + self + .config + .tree + .data_by_scope() + .iter() + .map(|(s, d)| (s.clone(), d.ts_config.clone())) + .collect() + }), ); } @@ -3582,6 +3659,7 @@ impl Inner { &self.config, &specifier, ), + asset_or_doc.scope().cloned(), ) .await?; let maybe_inlay_hints = maybe_inlay_hints.map(|hints| { |