aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim/lsp/rpc.lua
diff options
context:
space:
mode:
authorMathias Fussenegger <f.mathias@zignar.net>2021-05-23 16:56:02 +0200
committerMathias Fussenegger <f.mathias@zignar.net>2021-05-23 17:04:19 +0200
commit5d4717010c1d8065b356516a0e36503bf2b9de3d (patch)
treec27264ba109503990298f020e421c3932594fd20 /runtime/lua/vim/lsp/rpc.lua
parent3fb3b548a6c2f88e1c0c3298589e153f45e199aa (diff)
downloadrneovim-5d4717010c1d8065b356516a0e36503bf2b9de3d.tar.gz
rneovim-5d4717010c1d8065b356516a0e36503bf2b9de3d.tar.bz2
rneovim-5d4717010c1d8065b356516a0e36503bf2b9de3d.zip
lsp: Only mute RequestCancelled or ContentModified, but not other errors
handlers passed to `lsp_buf_request` weren't called if the server responded with an error that looks like this: "decoded", { error = { code = -32601, message = "No delegateCommandHandler for foo" }, id = 5, jsonrpc = "2.0" } An example where that happens is both eclipse.jdt.ls and the haskell-language-server when invoking a command that doesn't exist: :lua vim.lsp.buf_request( 0, 'workspace/executeCommand', { command = 'foo' }, function(err, _, res) print(vim.inspect(err), vim.inspect(res)) end )
Diffstat (limited to 'runtime/lua/vim/lsp/rpc.lua')
-rw-r--r--runtime/lua/vim/lsp/rpc.lua28
1 files changed, 17 insertions, 11 deletions
diff --git a/runtime/lua/vim/lsp/rpc.lua b/runtime/lua/vim/lsp/rpc.lua
index 0cabd1a0d4..98835d6708 100644
--- a/runtime/lua/vim/lsp/rpc.lua
+++ b/runtime/lua/vim/lsp/rpc.lua
@@ -523,27 +523,33 @@ local function start(cmd, cmd_args, dispatchers, extra_spawn_params)
decoded.error = convert_NIL(decoded.error)
decoded.result = convert_NIL(decoded.result)
+ -- We sent a number, so we expect a number.
+ local result_id = tonumber(decoded.id)
+
-- Do not surface RequestCancelled or ContentModified to users, it is RPC-internal.
if decoded.error then
+ local mute_error = false
if decoded.error.code == protocol.ErrorCodes.RequestCancelled then
local _ = log.debug() and log.debug("Received cancellation ack", decoded)
+ mute_error = true
elseif decoded.error.code == protocol.ErrorCodes.ContentModified then
local _ = log.debug() and log.debug("Received content modified ack", decoded)
+ mute_error = true
end
- local result_id = tonumber(decoded.id)
- -- Clear any callback since this is cancelled now.
- -- This is safe to do assuming that these conditions hold:
- -- - The server will not send a result callback after this cancellation.
- -- - If the server sent this cancellation ACK after sending the result, the user of this RPC
- -- client will ignore the result themselves.
- if result_id then
- message_callbacks[result_id] = nil
+
+ if mute_error then
+ -- Clear any callback since this is cancelled now.
+ -- This is safe to do assuming that these conditions hold:
+ -- - The server will not send a result callback after this cancellation.
+ -- - If the server sent this cancellation ACK after sending the result, the user of this RPC
+ -- client will ignore the result themselves.
+ if result_id then
+ message_callbacks[result_id] = nil
+ end
+ return
end
- return
end
- -- We sent a number, so we expect a number.
- local result_id = tonumber(decoded.id)
local callback = message_callbacks[result_id]
if callback then
message_callbacks[result_id] = nil