feat(lsp): return table from lsp/ files on runtimepath (#31663)

Problem: LSP configs on the runtimepath must have the same name as the
LSP server and must also explicitly set the name in vim.lsp.config. This
is redundant and creates a footgun where a user may accidentally use the
wrong name when assigning to the vim.lsp.config table.

Solution: Return a table from lsp/ runtimepath files instead
This commit is contained in:
Gregory Anders
2024-12-21 08:27:27 -06:00
committed by GitHub
parent 382eb878bc
commit 130b5fd85f
3 changed files with 20 additions and 14 deletions

View File

@@ -450,16 +450,20 @@ function lsp._resolve_config(name)
if not econfig.resolved_config then
-- Resolve configs from lsp/*.lua
-- Calls to vim.lsp.config in lsp/* have a lower precedence than calls from other sites.
local orig_configs = lsp.config._configs
lsp.config._configs = {}
pcall(vim.cmd.runtime, { ('lsp/%s.lua'):format(name), bang = true })
local rtp_configs = lsp.config._configs
lsp.config._configs = orig_configs
local rtp_config = {} ---@type vim.lsp.Config
for _, v in ipairs(api.nvim_get_runtime_file(('lsp/%s.lua'):format(name), true)) do
local config = assert(loadfile(v))() ---@type any?
if type(config) == 'table' then
rtp_config = vim.tbl_deep_extend('force', rtp_config, config)
else
log.warn(string.format('%s does not return a table, ignoring', v))
end
end
local config = vim.tbl_deep_extend(
'force',
lsp.config._configs['*'] or {},
rtp_configs[name] or {},
rtp_config,
lsp.config._configs[name] or {}
)