summaryrefslogtreecommitdiff
path: root/cli/lsp/language_server.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/lsp/language_server.rs')
-rw-r--r--cli/lsp/language_server.rs55
1 files changed, 55 insertions, 0 deletions
diff --git a/cli/lsp/language_server.rs b/cli/lsp/language_server.rs
index fb2b04214..a0d0ee0ad 100644
--- a/cli/lsp/language_server.rs
+++ b/cli/lsp/language_server.rs
@@ -1622,6 +1622,54 @@ impl Inner {
}
}
+ async fn goto_type_definition(
+ &mut self,
+ params: GotoTypeDefinitionParams,
+ ) -> LspResult<Option<GotoTypeDefinitionResponse>> {
+ let specifier = self
+ .url_map
+ .normalize_url(&params.text_document_position_params.text_document.uri);
+ if !self.is_diagnosable(&specifier)
+ || !self.config.specifier_enabled(&specifier)
+ {
+ return Ok(None);
+ }
+
+ let mark = self.performance.mark("goto_definition", Some(&params));
+ let asset_or_doc = self.get_cached_asset_or_document(&specifier)?;
+ let line_index = asset_or_doc.line_index();
+ let req = tsc::RequestMethod::GetTypeDefinition {
+ specifier,
+ position: line_index
+ .offset_tsc(params.text_document_position_params.position)?,
+ };
+ let maybe_definition_info: Option<Vec<tsc::DefinitionInfo>> = self
+ .ts_server
+ .request(self.snapshot()?, req)
+ .await
+ .map_err(|err| {
+ error!("Unable to get type definition from TypeScript: {}", err);
+ LspError::internal_error()
+ })?;
+
+ let response = if let Some(definition_info) = maybe_definition_info {
+ let mut location_links = Vec::new();
+ for info in definition_info {
+ if let Some(link) =
+ info.document_span.to_link(line_index.clone(), self).await
+ {
+ location_links.push(link);
+ }
+ }
+ Some(GotoTypeDefinitionResponse::Link(location_links))
+ } else {
+ None
+ };
+
+ self.performance.measure(mark);
+ Ok(response)
+ }
+
async fn completion(
&mut self,
params: CompletionParams,
@@ -2428,6 +2476,13 @@ impl lspower::LanguageServer for LanguageServer {
self.0.lock().await.goto_definition(params).await
}
+ async fn goto_type_definition(
+ &self,
+ params: GotoTypeDefinitionParams,
+ ) -> LspResult<Option<GotoTypeDefinitionResponse>> {
+ self.0.lock().await.goto_type_definition(params).await
+ }
+
async fn completion(
&self,
params: CompletionParams,