backport: fix(lsp): show meaningful error on invalid completion response (#39476)

Problem: vim.NIL is truthy in Lua, so `#(result.items or result)`
crashes on `#vim.NIL` when servers return null.

Solution: skip spec-allowed result=null silently, raise an error
on items=null with the server name.

https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_completion
(cherry picked from commit b9431b340f)

Co-authored-by: glepnir <glephunter@gmail.com>
This commit is contained in:
neovim-backports[bot]
2026-04-28 11:27:50 -04:00
committed by GitHub
parent 24a4bf20c0
commit 378f5f49b3
2 changed files with 25 additions and 1 deletions

View File

@@ -1003,7 +1003,13 @@ local function trigger(bufnr, clients, ctx)
end
local result = response.result
if result and #(result.items or result) > 0 then
if type(result) == 'table' and result.items == vim.NIL then
error(
('%s: completion response has items=null, expected CompletionItem[]'):format(
client and client.name or 'UNKNOWN'
)
)
elseif result and result ~= vim.NIL and #(result.items or result) > 0 then
Context.isIncomplete = Context.isIncomplete or result.isIncomplete
local encoding = client and client.offset_encoding or 'utf-16'
local client_matches, tmp_server_start_boundary