summaryrefslogtreecommitdiff
path: root/lua
diff options
context:
space:
mode:
authorkylo252 <[email protected]>2021-12-08 08:15:56 +0100
committerGitHub <[email protected]>2021-12-08 08:15:56 +0100
commite4752692e5f547ef9780161a3ecfc4c3b4552cc5 (patch)
tree6096db73d85bd37838bc9bf888be3472b481b36e /lua
parent6505826f0bb8da045a91b579714df911bbca55b0 (diff)
fix(lsp): prevent repeated setup call (#2048)
Check if the manager `autocomd` has already been configured, since some servers can take a while to initialize.
Diffstat (limited to 'lua')
-rw-r--r--lua/lvim/lsp/manager.lua17
1 files changed, 16 insertions, 1 deletions
diff --git a/lua/lvim/lsp/manager.lua b/lua/lvim/lsp/manager.lua
index ca4dc285..7a35f1ff 100644
--- a/lua/lvim/lsp/manager.lua
+++ b/lua/lvim/lsp/manager.lua
@@ -45,13 +45,28 @@ local function buf_try_add(server_name, bufnr)
require("lspconfig")[server_name].manager.try_add_wrapper(bufnr)
end
+-- check if the manager autocomd has already been configured since some servers can take a while to initialize
+-- this helps guarding against a data-race condition where a server can get configured twice
+-- which seems to occur only when attaching to single-files
+local function client_is_configured(server_name, ft)
+ ft = ft or vim.bo.filetype
+ local active_autocmds = vim.split(vim.fn.execute("autocmd FileType " .. ft), "\n")
+ for _, result in ipairs(active_autocmds) do
+ if result:match(server_name) then
+ return true
+ end
+ end
+ return false
+end
+
---Setup a language server by providing a name
---@param server_name string name of the language server
---@param user_config table [optional] when available it will take predence over any default configurations
function M.setup(server_name, user_config)
vim.validate { name = { server_name, "string" } }
- if lvim_lsp_utils.is_client_active(server_name) then
+ if lvim_lsp_utils.is_client_active(server_name) or client_is_configured(server_name) then
+ Log:debug(string.format("[%q] is already configured. Ignoring repeated setup call.", server_name))
return
end