diff options
author | Mathias Fussenegger <f.mathias@zignar.net> | 2025-01-17 15:27:50 +0100 |
---|---|---|
committer | Mathias Fußenegger <mfussenegger@users.noreply.github.com> | 2025-01-17 18:34:58 +0100 |
commit | b9e6fa7ec81c463d77cc919392b52f6df2d8d304 (patch) | |
tree | 65b38a382a4f9bdb712c2b07d93d79efa80fe1c1 /test/functional | |
parent | 3530182ba491ba8663b40bdff0c044d74e89bb82 (diff) | |
download | rneovim-b9e6fa7ec81c463d77cc919392b52f6df2d8d304.tar.gz rneovim-b9e6fa7ec81c463d77cc919392b52f6df2d8d304.tar.bz2 rneovim-b9e6fa7ec81c463d77cc919392b52f6df2d8d304.zip |
fix(lsp): use filterText as word if textEdit/label doesn't match
Problem:
With language servers like lemminx, completing xml tags like `<mo` first
shows the right candidates (`modules`) but after typing `d` the
candidates disappear.
This is because the server returns:
[...]
filterText = "<module",
label = "module",
textEdit = {
newText = "<module>$1</module>$0",
Which resulted in `module` being used as `word`, and `module` doesn't
match the prefix `<mo`. Typing `d` causes the `complete()` filtering
mechanism to kick in and remove the entry.
Solution:
Use `<module` from the `filterText` as `word` if the textEdit/label
heuristic doesn't match.
Diffstat (limited to 'test/functional')
-rw-r--r-- | test/functional/plugin/lsp/completion_spec.lua | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/test/functional/plugin/lsp/completion_spec.lua b/test/functional/plugin/lsp/completion_spec.lua index 15ac9da657..84c8f5864a 100644 --- a/test/functional/plugin/lsp/completion_spec.lua +++ b/test/functional/plugin/lsp/completion_spec.lua @@ -216,6 +216,38 @@ describe('vim.lsp.completion: item conversion', function() }) end) + it('uses filterText as word if label/newText would not match', function() + local items = { + { + filterText = '<module', + insertTextFormat = 2, + kind = 10, + label = 'module', + sortText = 'module', + textEdit = { + newText = '<module>$1</module>$0', + range = { + start = { + character = 0, + line = 0, + }, + ['end'] = { + character = 0, + line = 0, + }, + }, + }, + }, + } + local expected = { + { + abbr = 'module', + word = '<module', + }, + } + assert_completion_matches('<mo', items, expected) + end) + it('fuzzy matches on label when filterText is missing', function() assert_completion_matches('fo', { { label = 'foo' }, |