Unnamed repository; edit this file 'description' to name the repository.
signature: use the suggested LSP signature when changed (#10655)
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 <[email protected]>
Hichem 2024-05-03
parent 31273c6 · commit cfca308
-rw-r--r--helix-term/src/handlers/signature_help.rs28
-rw-r--r--helix-term/src/ui/lsp.rs7
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 0bb1d3d1..4fc00811 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::<Popup<SignatureHelp>>(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 b82f7be2..d845be4a 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<ArcSwap<syntax::Loader>>,
active_signature: usize,
+ lsp_signature: Option<usize>,
signatures: Vec<Signature>,
}
@@ -37,12 +38,14 @@ impl SignatureHelp {
language: String,
config_loader: Arc<ArcSwap<syntax::Loader>>,
active_signature: usize,
+ lsp_signature: Option<usize>,
signatures: Vec<Signature>,
) -> 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<usize> {
+ self.lsp_signature
+ }
+
pub fn visible_popup(compositor: &mut Compositor) -> Option<&mut Popup<Self>> {
compositor.find_id::<Popup<Self>>(Self::ID)
}