summaryrefslogtreecommitdiff
path: root/cli/lsp/language_server.rs
diff options
context:
space:
mode:
authorNayeem Rahman <nayeemrmn99@gmail.com>2024-06-26 23:47:01 +0100
committerGitHub <noreply@github.com>2024-06-26 23:47:01 +0100
commit67dcd6db518446574d3a1e33f4ce536fcdc4fd25 (patch)
tree23d6aa1d867b1efded9c0e638c89513ca492a44f /cli/lsp/language_server.rs
parent2a2ff96be13047cb50612fde0f12e5f6df374ad3 (diff)
feat(lsp): ts language service scopes (#24345)
Diffstat (limited to 'cli/lsp/language_server.rs')
-rw-r--r--cli/lsp/language_server.rs114
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", &params);
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(&params.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,
&params.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| {