From 6b739d0d26b348c065c55eec585a59f2797905c2 Mon Sep 17 00:00:00 2001 From: "Ben Fekih, Hichem" Date: Wed, 1 May 2024 22:10:30 +0200 Subject: [PATCH] signature: use the suggested LSP signature when changed some LSPs does update the active signature and some not. To make both worlds happy, make the active signature more intelligent. 1. SignatureHelp store now the suggested lsp_signature 2. if the lsp_signature changes then use it 3. otherwise use the last signature from the old popup 4. in case the old signature doesn't exist anymore, show the last signature Signed-off-by: Ben Fekih, Hichem --- helix-term/src/handlers/signature_help.rs | 28 +++++++++++++++++------ helix-term/src/ui/lsp.rs | 7 ++++++ 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/helix-term/src/handlers/signature_help.rs b/helix-term/src/handlers/signature_help.rs index 0bb1d3d1694f..4fc00811879d 100644 --- a/helix-term/src/handlers/signature_help.rs +++ b/helix-term/src/handlers/signature_help.rs @@ -238,19 +238,33 @@ pub fn show_signature_help( .collect(); let old_popup = compositor.find_id::>(SignatureHelp::ID); - let mut active_signature = old_popup - .as_ref() - .map(|popup| popup.contents().active_signature()) - .unwrap_or_else(|| response.active_signature.unwrap_or_default() as usize); + let lsp_signature = response.active_signature.map(|s| s as usize); - if active_signature >= signatures.len() { - active_signature = signatures.len() - 1; - } + // take the new suggested lsp signature if changed + // otherwise take the old signature if possible + // otherwise the last one (in case there is less signatures than before) + let active_signature = old_popup + .as_ref() + .map(|popup| { + let old_lsp_sig = popup.contents().lsp_signature(); + let old_sig = popup + .contents() + .active_signature() + .min(signatures.len() - 1); + + if old_lsp_sig != lsp_signature { + lsp_signature.unwrap_or(old_sig) + } else { + old_sig + } + }) + .unwrap_or(lsp_signature.unwrap_or_default()); let contents = SignatureHelp::new( language.to_string(), Arc::clone(&editor.syn_loader), active_signature, + lsp_signature, signatures, ); diff --git a/helix-term/src/ui/lsp.rs b/helix-term/src/ui/lsp.rs index b82f7be294ff..d845be4a7c38 100644 --- a/helix-term/src/ui/lsp.rs +++ b/helix-term/src/ui/lsp.rs @@ -27,6 +27,7 @@ pub struct SignatureHelp { language: String, config_loader: Arc>, active_signature: usize, + lsp_signature: Option, signatures: Vec, } @@ -37,12 +38,14 @@ impl SignatureHelp { language: String, config_loader: Arc>, active_signature: usize, + lsp_signature: Option, signatures: Vec, ) -> Self { Self { language, config_loader, active_signature, + lsp_signature, signatures, } } @@ -51,6 +54,10 @@ impl SignatureHelp { self.active_signature } + pub fn lsp_signature(&self) -> Option { + self.lsp_signature + } + pub fn visible_popup(compositor: &mut Compositor) -> Option<&mut Popup> { compositor.find_id::>(Self::ID) }