local log = require 'vim.lsp.log' local protocol = require 'vim.lsp.protocol' local util = require 'vim.lsp.util' local api = vim.api local M = {} local function err_message(...) api.nvim_err_writeln(table.concat(vim.tbl_flatten{...})) api.nvim_command("redraw") end M['workspace/applyEdit'] = function(_, _, workspace_edit) if not workspace_edit then return end -- TODO(ashkan) Do something more with label? if workspace_edit.label then print("Workspace edit", workspace_edit.label) end util.apply_workspace_edit(workspace_edit.edit) end M['textDocument/publishDiagnostics'] = function(_, _, result) if not result then return end local uri = result.uri local bufnr = vim.uri_to_bufnr(uri) if not bufnr then err_message("LSP.publishDiagnostics: Couldn't find buffer for ", uri) return end util.buf_clear_diagnostics(bufnr) util.buf_diagnostics_save_positions(bufnr, result.diagnostics) util.buf_diagnostics_underline(bufnr, result.diagnostics) util.buf_diagnostics_virtual_text(bufnr, result.diagnostics) -- util.buf_loclist(bufnr, result.diagnostics) end local function log_message(_, _, result, client_id) local message_type = result.type local message = result.message local client = vim.lsp.get_client_by_id(client_id) local client_name = client and client.name or string.format("id=%d", client_id) if not client then err_message("LSP[", client_name, "] client has shut down after sending the message") end if message_type == protocol.MessageType.Error then err_message("LSP[", client_name, "] ", message) else local message_type_name = protocol.MessageType[message_type] api.nvim_out_write(string.format("LSP[%s][%s] %s\n", client_name, message_type_name, message)) end return result end M['window/showMessage'] = log_message M['window/logMessage'] = log_message -- Add boilerplate error validation and logging for all of these. for k, fn in pairs(M) do M[k] = function(err, method, params, client_id) local _ = log.debug() and log.debug('default_callback', method, { params = params, client_id = client_id, err = err }) if err then error(tostring(err)) end return fn(err, method, params, client_id) end end return M -- vim:sw=2 ts=2 et