diff options
author | Mathias Fußenegger <mfussenegger@users.noreply.github.com> | 2024-06-02 09:54:15 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-02 09:54:15 +0200 |
commit | 19be3d26830ced203631045f2f622e75e6d857a7 (patch) | |
tree | 2b68c87663e010eaf6d0369ebb20932cb9d18991 | |
parent | 24cb9ba6d32918beaba5a2109f5f8d8009cd097d (diff) | |
download | rneovim-19be3d26830ced203631045f2f622e75e6d857a7.tar.gz rneovim-19be3d26830ced203631045f2f622e75e6d857a7.tar.bz2 rneovim-19be3d26830ced203631045f2f622e75e6d857a7.zip |
fix(lsp): trim trailing whitespace from completion words (#29122)
the `complete()` mechanism doesn't play nicely with trailing newlines or
tabs. A newline causes it to insert a null character, showing up as
`^@`.
-rw-r--r-- | runtime/lua/vim/lsp/completion.lua | 3 | ||||
-rw-r--r-- | test/functional/plugin/lsp/completion_spec.lua | 35 |
2 files changed, 37 insertions, 1 deletions
diff --git a/runtime/lua/vim/lsp/completion.lua b/runtime/lua/vim/lsp/completion.lua index b77bf3e3c2..f8e17ae2f0 100644 --- a/runtime/lua/vim/lsp/completion.lua +++ b/runtime/lua/vim/lsp/completion.lua @@ -153,7 +153,8 @@ local function get_completion_word(item) return item.label end elseif item.textEdit then - return item.textEdit.newText + local word = item.textEdit.newText + return word:match('^(%S*)') or word elseif item.insertText and item.insertText ~= '' then return item.insertText end diff --git a/test/functional/plugin/lsp/completion_spec.lua b/test/functional/plugin/lsp/completion_spec.lua index d7755dd0c4..d8a3e0acbd 100644 --- a/test/functional/plugin/lsp/completion_spec.lua +++ b/test/functional/plugin/lsp/completion_spec.lua @@ -126,6 +126,41 @@ describe('vim.lsp.completion: item conversion', function() eq(expected, result) end) + it('trims trailing newline or tab from textEdit', function() + local range0 = { + start = { line = 0, character = 0 }, + ['end'] = { line = 0, character = 0 }, + } + local items = { + { + detail = 'ansible.builtin', + filterText = 'lineinfile ansible.builtin.lineinfile builtin ansible', + kind = 7, + label = 'ansible.builtin.lineinfile', + sortText = '2_ansible.builtin.lineinfile', + textEdit = { + newText = 'ansible.builtin.lineinfile:\n ', + range = range0, + }, + }, + } + local result = complete('|', items) + result = vim.tbl_map(function(x) + return { + abbr = x.abbr, + word = x.word, + } + end, result.items) + + local expected = { + { + abbr = 'ansible.builtin.lineinfile', + word = 'ansible.builtin.lineinfile:', + }, + } + eq(expected, result) + end) + it('prefers wordlike components for snippets', function() -- There are two goals here: -- |