Unnamed repository; edit this file 'description' to name the repository.
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.
Matouš Dzivjak 2023-02-13
parent 8b09b00 · commit 2bebc50
-rw-r--r--helix-lsp/src/client.rs4
-rw-r--r--helix-term/src/ui/completion.rs21
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",