From f6d39cbc1d8945d69c550994498fa9498f862bc2 Mon Sep 17 00:00:00 2001
From: RoloEdits <RoloEdits@gmail.com>
Date: Sun, 6 Oct 2024 06:54:17 -0700
Subject: [PATCH] refactor(lsp): handle out-of-range `active_signature`
 (#11825)

---
 helix-term/src/ui/lsp.rs | 26 ++++++++++++++++++--------
 1 file changed, 18 insertions(+), 8 deletions(-)

diff --git a/helix-term/src/ui/lsp.rs b/helix-term/src/ui/lsp.rs
index b6491085..48862630 100644
--- a/helix-term/src/ui/lsp.rs
+++ b/helix-term/src/ui/lsp.rs
@@ -96,7 +96,10 @@ impl Component for SignatureHelp {
     fn render(&mut self, area: Rect, surface: &mut Buffer, cx: &mut Context) {
         let margin = Margin::horizontal(1);
 
-        let signature = &self.signatures[self.active_signature];
+        let signature = self
+            .signatures
+            .get(self.active_signature)
+            .unwrap_or_else(|| &self.signatures[0]);
 
         let active_param_span = signature.active_param_range.map(|(start, end)| {
             vec![(
@@ -108,9 +111,13 @@ impl Component for SignatureHelp {
             )]
         });
 
-        let sig = &self.signatures[self.active_signature];
+        let signature = self
+            .signatures
+            .get(self.active_signature)
+            .unwrap_or_else(|| &self.signatures[0]);
+
         let sig_text = crate::ui::markdown::highlighted_code_block(
-            sig.signature.as_str(),
+            signature.signature.as_str(),
             &self.language,
             Some(&cx.editor.theme),
             Arc::clone(&self.config_loader),
@@ -130,7 +137,7 @@ impl Component for SignatureHelp {
         let sig_text_para = Paragraph::new(&sig_text).wrap(Wrap { trim: false });
         sig_text_para.render(sig_text_area, surface);
 
-        if sig.signature_doc.is_none() {
+        if signature.signature_doc.is_none() {
             return;
         }
 
@@ -142,7 +149,7 @@ impl Component for SignatureHelp {
             }
         }
 
-        let sig_doc = match &sig.signature_doc {
+        let sig_doc = match &signature.signature_doc {
             None => return,
             Some(doc) => Markdown::new(doc.clone(), Arc::clone(&self.config_loader)),
         };
@@ -160,12 +167,15 @@ impl Component for SignatureHelp {
         const PADDING: u16 = 2;
         const SEPARATOR_HEIGHT: u16 = 1;
 
-        let sig = &self.signatures[self.active_signature];
+        let signature = self
+            .signatures
+            .get(self.active_signature)
+            .unwrap_or_else(|| &self.signatures[0]);
 
         let max_text_width = viewport.0.saturating_sub(PADDING).clamp(10, 120);
 
         let signature_text = crate::ui::markdown::highlighted_code_block(
-            sig.signature.as_str(),
+            signature.signature.as_str(),
             &self.language,
             None,
             Arc::clone(&self.config_loader),
@@ -174,7 +184,7 @@ impl Component for SignatureHelp {
         let (sig_width, sig_height) =
             crate::ui::text::required_size(&signature_text, max_text_width);
 
-        let (width, height) = match sig.signature_doc {
+        let (width, height) = match signature.signature_doc {
             Some(ref doc) => {
                 let doc_md = Markdown::new(doc.clone(), Arc::clone(&self.config_loader));
                 let doc_text = doc_md.parse(None);