Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'helix-term/src/ui/lsp/signature_help.rs')
| -rw-r--r-- | helix-term/src/ui/lsp/signature_help.rs | 211 |
1 files changed, 0 insertions, 211 deletions
diff --git a/helix-term/src/ui/lsp/signature_help.rs b/helix-term/src/ui/lsp/signature_help.rs deleted file mode 100644 index 8df525af..00000000 --- a/helix-term/src/ui/lsp/signature_help.rs +++ /dev/null @@ -1,211 +0,0 @@ -use std::sync::Arc; - -use arc_swap::ArcSwap; -use helix_core::syntax::{self, OverlayHighlights}; -use helix_view::graphics::{Margin, Rect, Style}; -use helix_view::input::Event; -use tui::buffer::Buffer; -use tui::layout::Alignment; -use tui::text::Text; -use tui::widgets::{BorderType, Paragraph, Widget, Wrap}; - -use crate::compositor::{Component, Compositor, Context, EventResult}; - -use crate::alt; -use crate::ui::Markdown; - -use crate::ui::Popup; - -pub struct Signature { - pub signature: String, - pub signature_doc: Option<String>, - /// Part of signature text - pub active_param_range: Option<(usize, usize)>, -} - -pub struct SignatureHelp { - language: String, - config_loader: Arc<ArcSwap<syntax::Loader>>, - active_signature: usize, - lsp_signature: Option<usize>, - signatures: Vec<Signature>, -} - -impl SignatureHelp { - pub const ID: &'static str = "signature-help"; - - pub fn new( - 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, - } - } - - pub fn active_signature(&self) -> usize { - 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) - } - - fn signature_index(&self) -> String { - format!("({}/{})", self.active_signature + 1, self.signatures.len()) - } -} - -impl Component for SignatureHelp { - fn handle_event(&mut self, event: &Event, _cx: &mut Context) -> EventResult { - let Event::Key(event) = event else { - return EventResult::Ignored(None); - }; - - if self.signatures.len() <= 1 { - return EventResult::Ignored(None); - } - - match event { - alt!('p') => { - self.active_signature = self - .active_signature - .checked_sub(1) - .unwrap_or(self.signatures.len() - 1); - EventResult::Consumed(None) - } - alt!('n') => { - self.active_signature = (self.active_signature + 1) % self.signatures.len(); - EventResult::Consumed(None) - } - _ => EventResult::Ignored(None), - } - } - - fn render(&mut self, area: Rect, surface: &mut Buffer, cx: &mut Context) { - let margin = Margin::all(1); - let area = area.inner(margin); - - 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)| { - let highlight = cx - .editor - .theme - .find_highlight_exact("ui.selection") - .unwrap(); - OverlayHighlights::single(highlight, start..end) - }); - - let signature = self - .signatures - .get(self.active_signature) - .unwrap_or_else(|| &self.signatures[0]); - - let sig_text = crate::ui::markdown::highlighted_code_block( - signature.signature.as_str(), - &self.language, - Some(&cx.editor.theme), - &self.config_loader.load(), - active_param_span, - ); - - if self.signatures.len() > 1 { - let signature_index = self.signature_index(); - let text = Text::from(signature_index); - let paragraph = Paragraph::new(&text).alignment(Alignment::Right); - paragraph.render(area.with_height(1).clip_right(1), surface); - } - - let sig_text_para = Paragraph::new(&sig_text) - .wrap(Wrap { trim: false }) - .scroll((cx.scroll.unwrap_or_default() as u16, 0)); - let (_, sig_text_height) = sig_text_para.required_size(area.width); - let sig_text_area = area.with_height(sig_text_height.min(area.height)); - let sig_text_area = sig_text_area.intersection(surface.area); - sig_text_para.render(sig_text_area, surface); - - if signature.signature_doc.is_none() { - return; - } - - let sep_style = Style::default(); - let borders = BorderType::line_symbols(BorderType::Plain); - for x in sig_text_area.left()..sig_text_area.right() { - if let Some(cell) = surface.get_mut(x, sig_text_area.bottom()) { - cell.set_symbol(borders.horizontal).set_style(sep_style); - } - } - - let sig_doc = match &signature.signature_doc { - None => return, - Some(doc) => Markdown::new(doc.clone(), Arc::clone(&self.config_loader)), - }; - let sig_doc = sig_doc.parse(Some(&cx.editor.theme)); - let sig_doc_area = area - .clip_top(sig_text_area.height + 2) - .clip_bottom(u16::from(cx.editor.popup_border())); - let sig_doc_para = Paragraph::new(&sig_doc) - .wrap(Wrap { trim: false }) - .scroll((cx.scroll.unwrap_or_default() as u16, 0)); - sig_doc_para.render(sig_doc_area, surface); - } - - fn required_size(&mut self, viewport: (u16, u16)) -> Option<(u16, u16)> { - const PADDING: u16 = 2; - const SEPARATOR_HEIGHT: u16 = 1; - - 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( - signature.signature.as_str(), - &self.language, - None, - &self.config_loader.load(), - None, - ); - let sig_text_para = Paragraph::new(&signature_text).wrap(Wrap { trim: false }); - let (sig_width, sig_height) = sig_text_para.required_size(max_text_width); - - 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); - let (doc_width, doc_height) = - crate::ui::text::required_size(&doc_text, max_text_width); - ( - sig_width.max(doc_width), - sig_height + SEPARATOR_HEIGHT + doc_height, - ) - } - None => (sig_width, sig_height), - }; - - let sig_index_width = if self.signatures.len() > 1 { - self.signature_index().len() + 1 - } else { - 0 - }; - - Some((width + PADDING + sig_index_width as u16, height + PADDING)) - } -} |