Unnamed repository; edit this file 'description' to name the repository.
feat(lsp): Add support for call hierarchy methods
This commit only covers the relevant changes to helix-core and helix-lsp,
the LSP methods are not yet available through commands.
https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_prepareCallHierarchy
| -rw-r--r-- | helix-core/src/syntax/config.rs | 2 | ||||
| -rw-r--r-- | helix-lsp/src/client.rs | 82 |
2 files changed, 84 insertions, 0 deletions
diff --git a/helix-core/src/syntax/config.rs b/helix-core/src/syntax/config.rs index 1288bc98..ad1ddaf0 100644 --- a/helix-core/src/syntax/config.rs +++ b/helix-core/src/syntax/config.rs @@ -319,6 +319,7 @@ pub enum LanguageServerFeature { RenameSymbol, InlayHints, DocumentColors, + CallHierarchy, } impl Display for LanguageServerFeature { @@ -344,6 +345,7 @@ impl Display for LanguageServerFeature { RenameSymbol => "rename-symbol", InlayHints => "inlay-hints", DocumentColors => "document-colors", + CallHierarchy => "call-hierarchy", }; write!(f, "{feature}",) } diff --git a/helix-lsp/src/client.rs b/helix-lsp/src/client.rs index dc58b420..7003ca6f 100644 --- a/helix-lsp/src/client.rs +++ b/helix-lsp/src/client.rs @@ -393,6 +393,13 @@ impl Client { | ColorProviderCapability::Options(_) ) ), + LanguageServerFeature::CallHierarchy => matches!( + capabilities.call_hierarchy_provider, + Some( + CallHierarchyServerCapability::Simple(true) + | CallHierarchyServerCapability::Options(_) + ) + ), } } @@ -706,6 +713,9 @@ impl Client { dynamic_registration: Some(false), resolve_support: None, }), + call_hierarchy: Some(lsp::DynamicRegistrationClientCapabilities { + dynamic_registration: Some(false), + }), ..Default::default() }), window: Some(lsp::WindowClientCapabilities { @@ -1473,6 +1483,78 @@ impl Client { Some(self.call::<lsp::request::DocumentSymbolRequest>(params)) } + pub fn prepare_call_hierarchy( + &self, + text_document: lsp::TextDocumentIdentifier, + position: lsp::Position, + ) -> Option<impl Future<Output = Result<Option<Vec<lsp::CallHierarchyItem>>>>> { + let capabilities = self.capabilities.get().unwrap(); + + match capabilities.call_hierarchy_provider { + Some( + lsp::CallHierarchyServerCapability::Simple(true) + | lsp::CallHierarchyServerCapability::Options(_), + ) => (), + _ => return None, + } + + let params = lsp::CallHierarchyPrepareParams { + text_document_position_params: lsp::TextDocumentPositionParams { + text_document, + position, + }, + work_done_progress_params: lsp::WorkDoneProgressParams::default(), + }; + + Some(self.call::<lsp::request::CallHierarchyPrepare>(params)) + } + + pub fn call_hierarchy_incoming( + &self, + item: lsp::CallHierarchyItem, + ) -> Option<impl Future<Output = Result<Option<Vec<lsp::CallHierarchyIncomingCall>>>>> { + let capabilities = self.capabilities.get().unwrap(); + + match capabilities.call_hierarchy_provider { + Some( + lsp::CallHierarchyServerCapability::Simple(true) + | lsp::CallHierarchyServerCapability::Options(_), + ) => (), + _ => return None, + } + + let params = lsp::CallHierarchyIncomingCallsParams { + item, + work_done_progress_params: lsp::WorkDoneProgressParams::default(), + partial_result_params: lsp::PartialResultParams::default(), + }; + + Some(self.call::<lsp::request::CallHierarchyIncomingCalls>(params)) + } + + pub fn call_hierarchy_outgoing( + &self, + item: lsp::CallHierarchyItem, + ) -> Option<impl Future<Output = Result<Option<Vec<lsp::CallHierarchyOutgoingCall>>>>> { + let capabilities = self.capabilities.get().unwrap(); + + match capabilities.call_hierarchy_provider { + Some( + lsp::CallHierarchyServerCapability::Simple(true) + | lsp::CallHierarchyServerCapability::Options(_), + ) => (), + _ => return None, + } + + let params = lsp::CallHierarchyOutgoingCallsParams { + item, + work_done_progress_params: lsp::WorkDoneProgressParams::default(), + partial_result_params: lsp::PartialResultParams::default(), + }; + + Some(self.call::<lsp::request::CallHierarchyOutgoingCalls>(params)) + } + pub fn prepare_rename( &self, text_document: lsp::TextDocumentIdentifier, |