fix(lsp): do not detach from buffer if there are uninitialized clients (#29029)

Problem: if on_lines is called before the LSP is initialized, the buffer
is detached.
Solution: check for uninitialized clients before detaching.
This commit is contained in:
Ilia Choly 2024-05-27 11:06:03 -04:00 committed by GitHub
parent 8893b7b340
commit 292365fa1b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 30 additions and 1 deletions

View File

@ -577,7 +577,8 @@ local function buf_attach(bufnr)
api.nvim_buf_attach(bufnr, false, {
on_lines = function(_, _, changedtick, firstline, lastline, new_lastline)
if #lsp.get_clients({ bufnr = bufnr }) == 0 then
return true -- detach
-- detach if there are no clients
return #lsp.get_clients({ bufnr = bufnr, _uninitialized = true }) == 0
end
util.buf_versions[bufnr] = changedtick
changetracking.send_changes(bufnr, firstline, lastline, new_lastline)

View File

@ -530,6 +530,34 @@ describe('LSP', function()
]])
end)
it('should allow on_lines + nvim_buf_delete during LSP initialization #28575', function()
clear()
exec_lua(create_server_definition)
exec_lua([[
local initialized = false
local server = _create_server({
handlers = {
initialize = function(method, params, callback)
vim.schedule(function()
callback(nil, { capabilities = {} })
initialized = true
end)
end
}
})
local bufnr = vim.api.nvim_create_buf(false, true)
vim.api.nvim_set_current_buf(bufnr)
local client_id = vim.lsp.start({
name = 'detach-dummy',
cmd = server.cmd,
})
vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, {"hello"})
vim.api.nvim_buf_delete(bufnr, {})
local ok = vim.wait(1000, function() return initialized end)
assert(ok, "lsp did not initialize")
]])
end)
it('client should return settings via workspace/configuration handler', function()
local expected_handlers = {
{ NIL, {}, { method = 'shutdown', client_id = 1 } },