mirror of
https://github.com/denoland/deno.git
synced 2025-08-03 10:33:54 +00:00
feat(lsp): ts language service scopes (#24345)
This commit is contained in:
parent
2a2ff96be1
commit
67dcd6db51
8 changed files with 1265 additions and 357 deletions
|
@ -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| {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue