summaryrefslogtreecommitdiff
path: root/cli/lsp/language_server.rs
diff options
context:
space:
mode:
authorKitson Kelly <me@kitsonkelly.com>2021-11-17 09:23:25 +1100
committerGitHub <noreply@github.com>2021-11-17 09:23:25 +1100
commitcc38580106095b1acf3c307dd6079076fec812e3 (patch)
treeb9df178cbdbc23b94a8a42ee1fe942c0e763bea8 /cli/lsp/language_server.rs
parentfd78953e1c241c8dd14686631a2509aec97f1167 (diff)
fix(lsp): retain module dependencies when parse is invalid (#12782)
Fixes #12753
Diffstat (limited to 'cli/lsp/language_server.rs')
-rw-r--r--cli/lsp/language_server.rs38
1 files changed, 21 insertions, 17 deletions
diff --git a/cli/lsp/language_server.rs b/cli/lsp/language_server.rs
index dbe00861e..e82afd9d0 100644
--- a/cli/lsp/language_server.rs
+++ b/cli/lsp/language_server.rs
@@ -987,17 +987,16 @@ impl Inner {
let asset_or_document = self.get_cached_asset_or_document(&specifier)?;
let line_index = asset_or_document.line_index();
- let req = tsc::RequestMethod::GetNavigationTree(specifier);
- let navigation_tree: tsc::NavigationTree = self
- .ts_server
- .request(self.snapshot()?, req)
- .await
- .map_err(|err| {
- error!("Failed to request to tsserver {}", err);
- LspError::invalid_request()
+ let navigation_tree =
+ self.get_navigation_tree(&specifier).await.map_err(|err| {
+ error!(
+ "Error getting document symbols for \"{}\": {}",
+ specifier, err
+ );
+ LspError::internal_error()
})?;
- let response = if let Some(child_items) = navigation_tree.child_items {
+ let response = if let Some(child_items) = &navigation_tree.child_items {
let mut document_symbols = Vec::<DocumentSymbol>::new();
for item in child_items {
item
@@ -1543,7 +1542,7 @@ impl Inner {
let asset_or_doc = self.get_cached_asset_or_document(&specifier)?;
let line_index = asset_or_doc.line_index();
let req = tsc::RequestMethod::GetReferences((
- specifier,
+ specifier.clone(),
line_index.offset_tsc(params.text_document_position.position)?,
));
let maybe_references: Option<Vec<tsc::ReferenceEntry>> = self
@@ -1563,9 +1562,14 @@ impl Inner {
}
let reference_specifier =
resolve_url(&reference.document_span.file_name).unwrap();
- let asset_or_doc =
- self.get_asset_or_document(&reference_specifier).await?;
- results.push(reference.to_location(asset_or_doc.line_index(), self));
+ let reference_line_index = if reference_specifier == specifier {
+ line_index.clone()
+ } else {
+ let asset_or_doc =
+ self.get_asset_or_document(&reference_specifier).await?;
+ asset_or_doc.line_index()
+ };
+ results.push(reference.to_location(reference_line_index, self));
}
self.performance.measure(mark);
@@ -2157,8 +2161,8 @@ impl Inner {
LspError::invalid_request()
})?;
- let semantic_tokens: SemanticTokens =
- semantic_classification.to_semantic_tokens(line_index);
+ let semantic_tokens =
+ semantic_classification.to_semantic_tokens(line_index)?;
let response = if !semantic_tokens.data.is_empty() {
Some(SemanticTokensResult::Tokens(semantic_tokens))
} else {
@@ -2200,8 +2204,8 @@ impl Inner {
LspError::invalid_request()
})?;
- let semantic_tokens: SemanticTokens =
- semantic_classification.to_semantic_tokens(line_index);
+ let semantic_tokens =
+ semantic_classification.to_semantic_tokens(line_index)?;
let response = if !semantic_tokens.data.is_empty() {
Some(SemanticTokensRangeResult::Tokens(semantic_tokens))
} else {