From 2bebc5042e5e50a6cd7691f3590184c4499376a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matou=C5=A1=20Dzivjak?= Date: Mon, 13 Feb 2023 03:44:31 +0100 Subject: [PATCH] feat(ui): deprecated completions (#5932) * feat(ui): deprecated completions Mark deprecated completions using strike-through (CROSSED_OUT modifier). The deprection information is taken either from the `deprecated` field of the completion item or from the completion tags. The field seems to be the older way of passing the deprecated information and it was already marked as deprecated for Symbol. In completion item the field is still valid but it seems that the LSP is moving in the general direction of using tags for this kind of information and as such relying on tags as well seems reasonable and future-proof. --- helix-lsp/src/client.rs | 4 ++++ helix-term/src/ui/completion.rs | 21 ++++++++++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/helix-lsp/src/client.rs b/helix-lsp/src/client.rs index 2f5b498d..46772dd2 100644 --- a/helix-lsp/src/client.rs +++ b/helix-lsp/src/client.rs @@ -329,6 +329,10 @@ impl Client { ], }), insert_replace_support: Some(true), + deprecated_support: Some(true), + tag_support: Some(lsp::TagSupport { + value_set: vec![lsp::CompletionItemTag::DEPRECATED], + }), ..Default::default() }), completion_item_kind: Some(lsp::CompletionItemKindCapability { diff --git a/helix-term/src/ui/completion.rs b/helix-term/src/ui/completion.rs index ac434894..3e2f2aea 100644 --- a/helix-term/src/ui/completion.rs +++ b/helix-term/src/ui/completion.rs @@ -1,6 +1,10 @@ use crate::compositor::{Component, Context, Event, EventResult}; -use helix_view::{editor::CompleteAction, ViewId}; -use tui::buffer::Buffer as Surface; +use helix_view::{ + editor::CompleteAction, + theme::{Modifier, Style}, + ViewId, +}; +use tui::{buffer::Buffer as Surface, text::Span}; use std::borrow::Cow; @@ -33,8 +37,19 @@ impl menu::Item for CompletionItem { } fn format(&self, _data: &Self::Data) -> menu::Row { + let deprecated = self.deprecated.unwrap_or_default() + || self.tags.as_ref().map_or(false, |tags| { + tags.contains(&lsp::CompletionItemTag::DEPRECATED) + }); menu::Row::new(vec![ - menu::Cell::from(self.label.as_str()), + menu::Cell::from(Span::styled( + self.label.as_str(), + if deprecated { + Style::default().add_modifier(Modifier::CROSSED_OUT) + } else { + Style::default() + }, + )), menu::Cell::from(match self.kind { Some(lsp::CompletionItemKind::TEXT) => "text", Some(lsp::CompletionItemKind::METHOD) => "method",