feat(lsp): support postfix snippets in completion

This commit is contained in:
Mathias Fussenegger
2024-05-28 23:20:25 +02:00
committed by Mathias Fußenegger
parent 0df2c6b5d0
commit b2bad0ac91
2 changed files with 102 additions and 49 deletions

View File

@ -129,18 +129,33 @@ end
--- @param item lsp.CompletionItem
--- @return string
local function get_completion_word(item)
if item.textEdit ~= nil and item.textEdit.newText ~= nil and item.textEdit.newText ~= '' then
if item.insertTextFormat == protocol.InsertTextFormat.PlainText then
return item.textEdit.newText
else
return parse_snippet(item.textEdit.newText)
end
elseif item.insertText ~= nil and item.insertText ~= '' then
if item.insertTextFormat == protocol.InsertTextFormat.PlainText then
return item.insertText
else
if item.insertTextFormat == protocol.InsertTextFormat.Snippet then
if item.textEdit then
-- Use label instead of text if text has different starting characters.
-- label is used as abbr (=displayed), but word is used for filtering
-- This is required for things like postfix completion.
-- E.g. in lua:
--
-- local f = {}
-- f@|
-- ▲
-- └─ cursor
--
-- item.textEdit.newText: table.insert(f, $0)
-- label: insert
--
-- Typing `i` would remove the candidate because newText starts with `t`.
local text = item.insertText or item.textEdit.newText
return #text < #item.label and text or item.label
elseif item.insertText and item.insertText ~= '' then
return parse_snippet(item.insertText)
else
return item.label
end
elseif item.textEdit then
return item.textEdit.newText
elseif item.insertText and item.insertText ~= '' then
return item.insertText
end
return item.label
end