mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
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:
parent
8893b7b340
commit
292365fa1b
@ -577,7 +577,8 @@ local function buf_attach(bufnr)
|
|||||||
api.nvim_buf_attach(bufnr, false, {
|
api.nvim_buf_attach(bufnr, false, {
|
||||||
on_lines = function(_, _, changedtick, firstline, lastline, new_lastline)
|
on_lines = function(_, _, changedtick, firstline, lastline, new_lastline)
|
||||||
if #lsp.get_clients({ bufnr = bufnr }) == 0 then
|
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
|
end
|
||||||
util.buf_versions[bufnr] = changedtick
|
util.buf_versions[bufnr] = changedtick
|
||||||
changetracking.send_changes(bufnr, firstline, lastline, new_lastline)
|
changetracking.send_changes(bufnr, firstline, lastline, new_lastline)
|
||||||
|
@ -530,6 +530,34 @@ describe('LSP', function()
|
|||||||
]])
|
]])
|
||||||
end)
|
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()
|
it('client should return settings via workspace/configuration handler', function()
|
||||||
local expected_handlers = {
|
local expected_handlers = {
|
||||||
{ NIL, {}, { method = 'shutdown', client_id = 1 } },
|
{ NIL, {}, { method = 'shutdown', client_id = 1 } },
|
||||||
|
Loading…
Reference in New Issue
Block a user