From 4eca4b3079bf53de874959270d0b3471d320debc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ole=20Kr=C3=BCger?= Date: Tue, 31 Jan 2023 11:38:53 +0100 Subject: [PATCH] Support goto-declaration LSP command (#5646) --- helix-lsp/src/client.rs | 25 +++++++++++++++++++++++++ helix-term/src/commands.rs | 1 + helix-term/src/commands/lsp.rs | 25 +++++++++++++++++++++++++ helix-term/src/keymap/default.rs | 1 + 4 files changed, 52 insertions(+) diff --git a/helix-lsp/src/client.rs b/helix-lsp/src/client.rs index dd2581c6d..6827f568d 100644 --- a/helix-lsp/src/client.rs +++ b/helix-lsp/src/client.rs @@ -886,6 +886,31 @@ pub fn goto_definition( )) } + pub fn goto_declaration( + &self, + text_document: lsp::TextDocumentIdentifier, + position: lsp::Position, + work_done_token: Option, + ) -> Option>> { + let capabilities = self.capabilities.get().unwrap(); + + // Return early if the server does not support goto-declaration. + match capabilities.declaration_provider { + Some( + lsp::DeclarationCapability::Simple(true) + | lsp::DeclarationCapability::RegistrationOptions(_) + | lsp::DeclarationCapability::Options(_), + ) => (), + _ => return None, + } + + Some(self.goto_request::( + text_document, + position, + work_done_token, + )) + } + pub fn goto_type_definition( &self, text_document: lsp::TextDocumentIdentifier, diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index 365d5b659..47ef1ff14 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -285,6 +285,7 @@ pub fn doc(&self) -> &str { select_mode, "Enter selection extend mode", exit_select_mode, "Exit selection mode", goto_definition, "Goto definition", + goto_declaration, "Goto declaration", add_newline_above, "Add newline above", add_newline_below, "Add newline below", goto_type_definition, "Goto type definition", diff --git a/helix-term/src/commands/lsp.rs b/helix-term/src/commands/lsp.rs index 578eb6084..d12aa436d 100644 --- a/helix-term/src/commands/lsp.rs +++ b/helix-term/src/commands/lsp.rs @@ -914,6 +914,31 @@ fn to_locations(definitions: Option) -> Vec future, + None => { + cx.editor + .set_error("Language server does not support goto-declaration"); + return; + } + }; + + cx.callback( + future, + move |editor, compositor, response: Option| { + let items = to_locations(response); + goto_impl(editor, compositor, items, offset_encoding); + }, + ); +} + pub fn goto_definition(cx: &mut Context) { let (view, doc) = current!(cx.editor); let language_server = language_server!(cx.editor, doc); diff --git a/helix-term/src/keymap/default.rs b/helix-term/src/keymap/default.rs index ef93dee08..d48e6935e 100644 --- a/helix-term/src/keymap/default.rs +++ b/helix-term/src/keymap/default.rs @@ -44,6 +44,7 @@ pub fn default() -> HashMap { "l" => goto_line_end, "s" => goto_first_nonwhitespace, "d" => goto_definition, + "D" => goto_declaration, "y" => goto_type_definition, "r" => goto_reference, "i" => goto_implementation,