LSP: Fix nil settings handling in workspace/configuration (#13708)

The `workspace/configuration` handler could fail with the following
error if `config.settings` is nil:

    runtime/lua/vim/lsp/util.lua:1432: attempt to index local 'settings' (a nil value)"

This ensures that `config.settings` is always initialized to an empty
table.
This commit is contained in:
Mathias Fußenegger
2021-01-18 19:33:10 +01:00
committed by GitHub
parent 51936126d3
commit 3f63100d5b
3 changed files with 18 additions and 0 deletions

View File

@@ -229,6 +229,7 @@ local function validate_client_config(config)
before_init = { config.before_init, "f", true }; before_init = { config.before_init, "f", true };
offset_encoding = { config.offset_encoding, "s", true }; offset_encoding = { config.offset_encoding, "s", true };
flags = { config.flags, "t", true }; flags = { config.flags, "t", true };
settings = { config.settings, "t", true };
} }
-- TODO(remove-callbacks) -- TODO(remove-callbacks)
@@ -458,6 +459,7 @@ function lsp.start_client(config)
local cmd, cmd_args, offset_encoding = cleaned_config.cmd, cleaned_config.cmd_args, cleaned_config.offset_encoding local cmd, cmd_args, offset_encoding = cleaned_config.cmd, cleaned_config.cmd_args, cleaned_config.offset_encoding
config.flags = config.flags or {} config.flags = config.flags or {}
config.settings = config.settings or {}
local client_id = next_client_id() local client_id = next_client_id()

View File

@@ -162,6 +162,7 @@ M['workspace/configuration'] = function(err, _, params, client_id)
local client = vim.lsp.get_client_by_id(client_id) local client = vim.lsp.get_client_by_id(client_id)
if not client then if not client then
err_message("LSP[id=", client_id, "] client has shut down after sending the message") err_message("LSP[id=", client_id, "] client has shut down after sending the message")
return
end end
if err then error(vim.inspect(err)) end if err then error(vim.inspect(err)) end
if not params.items then if not params.items then

View File

@@ -303,6 +303,21 @@ describe('LSP', function()
end; end;
} }
end) end)
it('workspace/configuration returns NIL per section if client was started without config.settings', function()
fake_lsp_server_setup('workspace/configuration no settings')
eq({
NIL,
NIL,
}, exec_lua [[
local params = {
items = {
{section = 'foo'},
{section = 'bar'},
}
}
return vim.lsp.handlers['workspace/configuration'](nil, nil, params, TEST_RPC_CLIENT_ID)
]])
end)
it('should verify capabilities sent', function() it('should verify capabilities sent', function()
local expected_callbacks = { local expected_callbacks = {