aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim/lsp/buf.lua
diff options
context:
space:
mode:
authorMathias Fußenegger <mfussenegger@users.noreply.github.com>2023-07-25 16:57:19 +0200
committerGitHub <noreply@github.com>2023-07-25 16:57:19 +0200
commit74bd4aba57d2f1b224abe46a6de82911d14ef6c1 (patch)
treea2bf05478bd48b61d013af3326a91de6b8e1a970 /runtime/lua/vim/lsp/buf.lua
parentaba3ceccb77518b93891af97fe93f5c8734eccf4 (diff)
downloadrneovim-74bd4aba57d2f1b224abe46a6de82911d14ef6c1.tar.gz
rneovim-74bd4aba57d2f1b224abe46a6de82911d14ef6c1.tar.bz2
rneovim-74bd4aba57d2f1b224abe46a6de82911d14ef6c1.zip
fix(lsp): fix multi client handling workspace_folder methods (#18839)
`buf_notify` sends the notification to all clients of a buffer, calling that inside a loop over clients multiplies the amount of notifications.
Diffstat (limited to 'runtime/lua/vim/lsp/buf.lua')
-rw-r--r--runtime/lua/vim/lsp/buf.lua32
1 files changed, 18 insertions, 14 deletions
diff --git a/runtime/lua/vim/lsp/buf.lua b/runtime/lua/vim/lsp/buf.lua
index 02d8d0fa7b..5e0e429021 100644
--- a/runtime/lua/vim/lsp/buf.lua
+++ b/runtime/lua/vim/lsp/buf.lua
@@ -480,11 +480,13 @@ function M.add_workspace_folder(workspace_folder)
print(workspace_folder, ' is not a valid directory')
return
end
- local params = util.make_workspace_params(
- { { uri = vim.uri_from_fname(workspace_folder), name = workspace_folder } },
- {}
- )
- for _, client in pairs(vim.lsp.get_clients({ bufnr = 0 })) do
+ local new_workspace = {
+ uri = vim.uri_from_fname(workspace_folder),
+ name = workspace_folder,
+ }
+ local params = { event = { added = { new_workspace }, removed = {} } }
+ local bufnr = vim.api.nvim_get_current_buf()
+ for _, client in pairs(vim.lsp.get_clients({ bufnr = bufnr })) do
local found = false
for _, folder in pairs(client.workspace_folders or {}) do
if folder.name == workspace_folder then
@@ -494,11 +496,11 @@ function M.add_workspace_folder(workspace_folder)
end
end
if not found then
- vim.lsp.buf_notify(0, 'workspace/didChangeWorkspaceFolders', params)
+ client.notify('workspace/didChangeWorkspaceFolders', params)
if not client.workspace_folders then
client.workspace_folders = {}
end
- table.insert(client.workspace_folders, params.event.added[1])
+ table.insert(client.workspace_folders, new_workspace)
end
end
end
@@ -513,14 +515,16 @@ function M.remove_workspace_folder(workspace_folder)
if not (workspace_folder and #workspace_folder > 0) then
return
end
- local params = util.make_workspace_params(
- {},
- { { uri = vim.uri_from_fname(workspace_folder), name = workspace_folder } }
- )
- for _, client in pairs(vim.lsp.get_clients({ bufnr = 0 })) do
- for idx, folder in pairs(client.workspace_folders or {}) do
+ local workspace = {
+ uri = vim.uri_from_fname(workspace_folder),
+ name = workspace_folder,
+ }
+ local params = { event = { added = {}, removed = { workspace } } }
+ local bufnr = vim.api.nvim_get_current_buf()
+ for _, client in pairs(vim.lsp.get_clients({ bufnr = bufnr })) do
+ for idx, folder in pairs(client.workspace_folders) do
if folder.name == workspace_folder then
- vim.lsp.buf_notify(0, 'workspace/didChangeWorkspaceFolders', params)
+ client.notify('workspace/didChangeWorkspaceFolders', params)
client.workspace_folders[idx] = nil
return
end