feat(lsp): lsp.completion support set deprecated (#29882)

Problem: CompletionItem in lsp spec mentioned the deprecated attribute

Solution: when item has deprecated attribute set hl_group to DiagnosticDeprecated
          in complete function
This commit is contained in:
glepnir
2024-07-31 22:15:34 +08:00
committed by GitHub
parent 573a71469d
commit 4e90bc3023
3 changed files with 74 additions and 1 deletions

View File

@ -253,6 +253,13 @@ function M._lsp_to_complete_items(result, prefix, client_id)
for _, item in ipairs(items) do
if matches(item) then
local word = get_completion_word(item)
local hl_group = ''
if
item.deprecated
or vim.list_contains((item.tags or {}), protocol.CompletionTag.Deprecated)
then
hl_group = 'DiagnosticDeprecated'
end
table.insert(candidates, {
word = word,
abbr = item.label,
@ -262,6 +269,7 @@ function M._lsp_to_complete_items(result, prefix, client_id)
icase = 1,
dup = 1,
empty = 1,
hl_group = hl_group,
user_data = {
nvim = {
lsp = {

View File

@ -99,6 +99,13 @@ local constants = {
TriggerForIncompleteCompletions = 3,
},
-- Completion item tags are extra annotations that tweak the rendering of a
-- completion item
CompletionTag = {
-- Render a completion as obsolete, usually using a strike-out.
Deprecated = 1,
},
-- A document highlight kind.
DocumentHighlightKind = {
-- A textual occurrence.
@ -433,13 +440,16 @@ function protocol.make_client_capabilities()
snippetSupport = true,
commitCharactersSupport = false,
preselectSupport = false,
deprecatedSupport = false,
deprecatedSupport = true,
documentationFormat = { constants.MarkupKind.Markdown, constants.MarkupKind.PlainText },
resolveSupport = {
properties = {
'additionalTextEdits',
},
},
tagSupport = {
valueSet = get_value_set(constants.CompletionTag),
},
},
completionItemKind = {
valueSet = get_value_set(constants.CompletionItemKind),

View File

@ -307,6 +307,7 @@ describe('vim.lsp.completion: item conversion', function()
info = '',
kind = 'Module',
menu = '',
hl_group = '',
word = 'this_thread',
}
local result = complete(' std::this|', completion_list)
@ -362,6 +363,7 @@ describe('vim.lsp.completion: item conversion', function()
info = '',
kind = 'Module',
menu = '',
hl_group = '',
word = 'this_thread',
}
local result = complete(' std::this|is', completion_list)
@ -529,6 +531,14 @@ describe('vim.lsp.completion: protocol', function()
{
label = 'hello',
},
{
label = 'hercules',
tags = { 1 }, -- 1 represents Deprecated tag
},
{
label = 'hero',
deprecated = true,
},
},
})
@ -545,6 +555,7 @@ describe('vim.lsp.completion: protocol', function()
info = '',
kind = 'Unknown',
menu = '',
hl_group = '',
user_data = {
nvim = {
lsp = {
@ -557,6 +568,50 @@ describe('vim.lsp.completion: protocol', function()
},
word = 'hello',
},
{
abbr = 'hercules',
dup = 1,
empty = 1,
icase = 1,
info = '',
kind = 'Unknown',
menu = '',
hl_group = 'DiagnosticDeprecated',
user_data = {
nvim = {
lsp = {
client_id = 1,
completion_item = {
label = 'hercules',
tags = { 1 },
},
},
},
},
word = 'hercules',
},
{
abbr = 'hero',
dup = 1,
empty = 1,
icase = 1,
info = '',
kind = 'Unknown',
menu = '',
hl_group = 'DiagnosticDeprecated',
user_data = {
nvim = {
lsp = {
client_id = 1,
completion_item = {
label = 'hero',
deprecated = true,
},
},
},
},
word = 'hero',
},
}, matches)
end)
end)