diff options
author | Kitson Kelly <me@kitsonkelly.com> | 2021-11-17 09:23:25 +1100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-17 09:23:25 +1100 |
commit | cc38580106095b1acf3c307dd6079076fec812e3 (patch) | |
tree | b9df178cbdbc23b94a8a42ee1fe942c0e763bea8 /cli/lsp/language_server.rs | |
parent | fd78953e1c241c8dd14686631a2509aec97f1167 (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.rs | 38 |
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 { |