mirror of
https://github.com/neovim/neovim.git
synced 2026-07-09 19:09:39 +00:00
feat(lsp)!: change handler signature #15504
This commit is contained in:
committed by
Justin M. Keyes
parent
f8e0011534
commit
cd8f6c5fb7
@@ -681,7 +681,7 @@ function lsp.start_client(config)
|
||||
local handler = resolve_handler(method)
|
||||
if handler then
|
||||
-- Method name is provided here for convenience.
|
||||
handler(nil, method, params, client_id)
|
||||
handler(nil, params, {method=method, client_id=client_id})
|
||||
end
|
||||
end
|
||||
|
||||
@@ -695,7 +695,7 @@ function lsp.start_client(config)
|
||||
local handler = resolve_handler(method)
|
||||
if handler then
|
||||
local _ = log.debug() and log.debug("server_request: found handler for", method)
|
||||
return handler(nil, method, params, client_id)
|
||||
return handler(nil, params, {method=method, client_id=client_id})
|
||||
end
|
||||
local _ = log.debug() and log.debug("server_request: no handler found for", method)
|
||||
return nil, lsp.rpc_response_error(protocol.ErrorCodes.MethodNotFound)
|
||||
@@ -894,7 +894,7 @@ function lsp.start_client(config)
|
||||
|
||||
local _ = log.debug() and log.debug(log_prefix, "client.request", client_id, method, params, handler, bufnr)
|
||||
return rpc.request(method, params, function(err, result)
|
||||
handler(err, method, result, client_id, bufnr)
|
||||
handler(err, result, {method=method, client_id=client_id, bufnr=bufnr})
|
||||
end)
|
||||
end
|
||||
|
||||
@@ -915,7 +915,7 @@ function lsp.start_client(config)
|
||||
--@see |vim.lsp.buf_request_sync()|
|
||||
function client.request_sync(method, params, timeout_ms, bufnr)
|
||||
local request_result = nil
|
||||
local function _sync_handler(err, _, result)
|
||||
local function _sync_handler(err, result)
|
||||
request_result = { err = err, result = result }
|
||||
end
|
||||
|
||||
@@ -1274,7 +1274,7 @@ function lsp.buf_request(bufnr, method, params, handler)
|
||||
local unsupported_err = lsp._unsupported_method(method)
|
||||
handler = handler or lsp.handlers[method]
|
||||
if handler then
|
||||
handler(unsupported_err, method, bufnr)
|
||||
handler(unsupported_err, nil, {method=method, bufnr=bufnr})
|
||||
end
|
||||
return
|
||||
end
|
||||
@@ -1314,8 +1314,8 @@ function lsp.buf_request_all(bufnr, method, params, callback)
|
||||
end
|
||||
end)
|
||||
|
||||
local function _sync_handler(err, _, result, client_id)
|
||||
request_results[client_id] = { error = err, result = result }
|
||||
local function _sync_handler(err, result, ctx)
|
||||
request_results[ctx.client_id] = { error = err, result = result }
|
||||
result_count = result_count + 1
|
||||
set_expected_result_count()
|
||||
|
||||
@@ -1421,7 +1421,7 @@ function lsp.omnifunc(findstart, base)
|
||||
local params = util.make_position_params()
|
||||
|
||||
local items = {}
|
||||
lsp.buf_request(bufnr, 'textDocument/completion', params, function(err, _, result)
|
||||
lsp.buf_request(bufnr, 'textDocument/completion', params, function(err, result)
|
||||
if err or not result or vim.fn.mode() ~= "i" then return end
|
||||
local matches = util.text_document_completion_list_to_complete_items(result, prefix)
|
||||
-- TODO(ashkan): is this the best way to do this?
|
||||
@@ -1496,8 +1496,8 @@ end
|
||||
--@param handler (function) See |lsp-handler|
|
||||
--@param override_config (table) Table containing the keys to override behavior of the {handler}
|
||||
function lsp.with(handler, override_config)
|
||||
return function(err, method, params, client_id, bufnr, config)
|
||||
return handler(err, method, params, client_id, bufnr, vim.tbl_deep_extend("force", config or {}, override_config))
|
||||
return function(err, result, ctx, config)
|
||||
return handler(err, result, ctx, vim.tbl_deep_extend("force", config or {}, override_config))
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -422,6 +422,21 @@ function M.clear_references()
|
||||
util.buf_clear_references()
|
||||
end
|
||||
|
||||
--- Requests code actions from all clients and calls the handler exactly once
|
||||
--- with all aggregated results
|
||||
---@private
|
||||
local function code_action_request(params)
|
||||
local bufnr = vim.api.nvim_get_current_buf()
|
||||
local method = 'textDocument/codeAction'
|
||||
vim.lsp.buf_request_all(bufnr, method, params, function(results)
|
||||
local actions = {}
|
||||
for _, r in pairs(results) do
|
||||
vim.list_extend(actions, r.result or {})
|
||||
end
|
||||
vim.lsp.handlers[method](nil, actions, {bufnr=bufnr, method=method})
|
||||
end)
|
||||
end
|
||||
|
||||
--- Selects a code action from the input list that is available at the current
|
||||
--- cursor position.
|
||||
--
|
||||
|
||||
@@ -192,17 +192,17 @@ end
|
||||
|
||||
--- |lsp-handler| for the method `textDocument/codeLens`
|
||||
---
|
||||
function M.on_codelens(err, _, result, client_id, bufnr)
|
||||
function M.on_codelens(err, result, ctx, _)
|
||||
assert(not err, vim.inspect(err))
|
||||
|
||||
M.save(result, bufnr, client_id)
|
||||
M.save(result, ctx.bufnr, ctx.client_id)
|
||||
|
||||
-- Eager display for any resolved (and unresolved) lenses and refresh them
|
||||
-- once resolved.
|
||||
M.display(result, bufnr, client_id)
|
||||
resolve_lenses(result, bufnr, client_id, function()
|
||||
M.display(result, bufnr, client_id)
|
||||
active_refreshes[bufnr] = nil
|
||||
M.display(result, ctx.bufnr, ctx.client_id)
|
||||
resolve_lenses(result, ctx.bufnr, ctx.client_id, function()
|
||||
M.display(result, ctx.bufnr, ctx.client_id)
|
||||
active_refreshes[ctx.bufnr] = nil
|
||||
end)
|
||||
end
|
||||
|
||||
|
||||
@@ -1008,15 +1008,16 @@ end
|
||||
--- - Update diagnostics in InsertMode or wait until InsertLeave
|
||||
--- - severity_sort: (default=false)
|
||||
--- - Sort diagnostics (and thus signs and virtual text)
|
||||
function M.on_publish_diagnostics(_, _, params, client_id, _, config)
|
||||
local uri = params.uri
|
||||
function M.on_publish_diagnostics(_, result, ctx, config)
|
||||
local client_id = ctx.client_id
|
||||
local uri = result.uri
|
||||
local bufnr = vim.uri_to_bufnr(uri)
|
||||
|
||||
if not bufnr then
|
||||
return
|
||||
end
|
||||
|
||||
local diagnostics = params.diagnostics
|
||||
local diagnostics = result.diagnostics
|
||||
|
||||
if config and if_nil(config.severity_sort, false) then
|
||||
table.sort(diagnostics, function(a, b) return a.severity > b.severity end)
|
||||
@@ -1164,8 +1165,41 @@ function M.display(diagnostics, bufnr, client_id, config)
|
||||
save_extmarks(bufnr, client_id)
|
||||
end
|
||||
|
||||
-- }}}
|
||||
-- Diagnostic User Functions {{{
|
||||
--- Redraw diagnostics for the given buffer and client
|
||||
---
|
||||
--- This calls the "textDocument/publishDiagnostics" handler manually using
|
||||
--- the cached diagnostics already received from the server. This can be useful
|
||||
--- for redrawing diagnostics after making changes in diagnostics
|
||||
--- configuration. |lsp-handler-configuration|
|
||||
---
|
||||
---@param bufnr (optional, number): Buffer handle, defaults to current
|
||||
---@param client_id (optional, number): Redraw diagnostics for the given
|
||||
--- client. The default is to redraw diagnostics for all attached
|
||||
--- clients.
|
||||
function M.redraw(bufnr, client_id)
|
||||
bufnr = get_bufnr(bufnr)
|
||||
if not client_id then
|
||||
return vim.lsp.for_each_buffer_client(bufnr, function(client)
|
||||
M.redraw(bufnr, client.id)
|
||||
end)
|
||||
end
|
||||
|
||||
-- We need to invoke the publishDiagnostics handler directly instead of just
|
||||
-- calling M.display so that we can preserve any custom configuration options
|
||||
-- the user may have set with vim.lsp.with.
|
||||
vim.lsp.handlers["textDocument/publishDiagnostics"](
|
||||
nil,
|
||||
{
|
||||
uri = vim.uri_from_bufnr(bufnr),
|
||||
diagnostics = M.get(bufnr, client_id),
|
||||
},
|
||||
{
|
||||
method = "textDocument/publishDiagnostics",
|
||||
client_id = client_id,
|
||||
bufnr = bufnr,
|
||||
}
|
||||
)
|
||||
end
|
||||
|
||||
--- Open a floating window with the diagnostics from {line_nr}
|
||||
---
|
||||
|
||||
@@ -17,21 +17,21 @@ local function err_message(...)
|
||||
api.nvim_command("redraw")
|
||||
end
|
||||
|
||||
--@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#workspace_executeCommand
|
||||
M['workspace/executeCommand'] = function()
|
||||
--see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#workspace_executeCommand
|
||||
M['workspace/executeCommand'] = function(_, _, _, _)
|
||||
-- Error handling is done implicitly by wrapping all handlers; see end of this file
|
||||
end
|
||||
|
||||
-- @msg of type ProgressParams
|
||||
-- Basically a token of type number/string
|
||||
local function progress_handler(_, _, params, client_id)
|
||||
---@private
|
||||
local function progress_handler(_, result, ctx, _)
|
||||
local client_id = ctx.client_id
|
||||
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
|
||||
local val = params.value -- unspecified yet
|
||||
local token = params.token -- string or number
|
||||
local val = result.value -- unspecified yet
|
||||
local token = result.token -- string or number
|
||||
|
||||
|
||||
if val.kind then
|
||||
@@ -62,10 +62,11 @@ end
|
||||
--@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#progress
|
||||
M['$/progress'] = progress_handler
|
||||
|
||||
--@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#window_workDoneProgress_create
|
||||
M['window/workDoneProgress/create'] = function(_, _, params, client_id)
|
||||
--see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#window_workDoneProgress_create
|
||||
M['window/workDoneProgress/create'] = function(_, result, ctx)
|
||||
local client_id = ctx.client_id
|
||||
local client = vim.lsp.get_client_by_id(client_id)
|
||||
local token = params.token -- string or number
|
||||
local token = result.token -- string or number
|
||||
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")
|
||||
@@ -74,12 +75,12 @@ M['window/workDoneProgress/create'] = function(_, _, params, client_id)
|
||||
return vim.NIL
|
||||
end
|
||||
|
||||
--@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#window_showMessageRequest
|
||||
M['window/showMessageRequest'] = function(_, _, params)
|
||||
--see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#window_showMessageRequest
|
||||
M['window/showMessageRequest'] = function(_, result)
|
||||
|
||||
local actions = params.actions
|
||||
print(params.message)
|
||||
local option_strings = {params.message, "\nRequest Actions:"}
|
||||
local actions = result.actions
|
||||
print(result.message)
|
||||
local option_strings = {result.message, "\nRequest Actions:"}
|
||||
for i, action in ipairs(actions) do
|
||||
local title = action.title:gsub('\r\n', '\\r\\n')
|
||||
title = title:gsub('\n', '\\n')
|
||||
@@ -95,8 +96,9 @@ M['window/showMessageRequest'] = function(_, _, params)
|
||||
end
|
||||
end
|
||||
|
||||
--@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#client_registerCapability
|
||||
M['client/registerCapability'] = function(_, _, _, client_id)
|
||||
--see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#client_registerCapability
|
||||
M['client/registerCapability'] = function(_, _, ctx)
|
||||
local client_id = ctx.client_id
|
||||
local warning_tpl = "The language server %s triggers a registerCapability "..
|
||||
"handler despite dynamicRegistration set to false. "..
|
||||
"Report upstream, this warning is harmless"
|
||||
@@ -107,25 +109,25 @@ M['client/registerCapability'] = function(_, _, _, client_id)
|
||||
return vim.NIL
|
||||
end
|
||||
|
||||
--@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_codeAction
|
||||
M['textDocument/codeAction'] = function(_, _, actions)
|
||||
if actions == nil or vim.tbl_isempty(actions) then
|
||||
--see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_codeAction
|
||||
M['textDocument/codeAction'] = function(_, result)
|
||||
if result == nil or vim.tbl_isempty(result) then
|
||||
print("No code actions available")
|
||||
return
|
||||
end
|
||||
|
||||
local option_strings = {"Code Actions:"}
|
||||
for i, action in ipairs(actions) do
|
||||
local option_strings = {"Code actions:"}
|
||||
for i, action in ipairs(result) do
|
||||
local title = action.title:gsub('\r\n', '\\r\\n')
|
||||
title = title:gsub('\n', '\\n')
|
||||
table.insert(option_strings, string.format("%d. %s", i, title))
|
||||
end
|
||||
|
||||
local choice = vim.fn.inputlist(option_strings)
|
||||
if choice < 1 or choice > #actions then
|
||||
if choice < 1 or choice > #result then
|
||||
return
|
||||
end
|
||||
local action_chosen = actions[choice]
|
||||
local action_chosen = result[choice]
|
||||
-- textDocument/codeAction can return either Command[] or CodeAction[].
|
||||
-- If it is a CodeAction, it can have either an edit, a command or both.
|
||||
-- Edits should be executed first
|
||||
@@ -155,29 +157,30 @@ M['workspace/applyEdit'] = function(_, _, workspace_edit)
|
||||
}
|
||||
end
|
||||
|
||||
--@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#workspace_configuration
|
||||
M['workspace/configuration'] = function(_, _, params, client_id)
|
||||
--see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#workspace_configuration
|
||||
M['workspace/configuration'] = function(_, result, ctx)
|
||||
local client_id = ctx.client_id
|
||||
local client = vim.lsp.get_client_by_id(client_id)
|
||||
if not client then
|
||||
err_message("LSP[id=", client_id, "] client has shut down after sending the message")
|
||||
return
|
||||
end
|
||||
if not params.items then
|
||||
if not result.items then
|
||||
return {}
|
||||
end
|
||||
|
||||
local result = {}
|
||||
for _, item in ipairs(params.items) do
|
||||
local response = {}
|
||||
for _, item in ipairs(result.items) do
|
||||
if item.section then
|
||||
local value = util.lookup_section(client.config.settings, item.section) or vim.NIL
|
||||
-- For empty sections with no explicit '' key, return settings as is
|
||||
if value == vim.NIL and item.section == '' then
|
||||
value = client.config.settings or vim.NIL
|
||||
end
|
||||
table.insert(result, value)
|
||||
table.insert(response, value)
|
||||
end
|
||||
end
|
||||
return result
|
||||
return response
|
||||
end
|
||||
|
||||
M['textDocument/publishDiagnostics'] = function(...)
|
||||
@@ -190,52 +193,63 @@ end
|
||||
|
||||
|
||||
|
||||
--@private
|
||||
--- Return a function that converts LSP responses to quickfix items and opens the qflist
|
||||
--
|
||||
--@param map_result function `((resp, bufnr) -> list)` to convert the response
|
||||
--@param entity name of the resource used in a `not found` error message
|
||||
local function response_to_qflist(map_result, entity)
|
||||
return function(_, _, result, _, bufnr)
|
||||
---@private
|
||||
--- Return a function that converts LSP responses to list items and opens the list
|
||||
---
|
||||
--- The returned function has an optional {config} parameter that accepts a table
|
||||
--- with the following keys:
|
||||
---
|
||||
--- loclist: (boolean) use the location list (default is to use the quickfix list)
|
||||
---
|
||||
---@param map_result function `((resp, bufnr) -> list)` to convert the response
|
||||
---@param entity name of the resource used in a `not found` error message
|
||||
local function response_to_list(map_result, entity)
|
||||
return function(_,result, ctx, config)
|
||||
if not result or vim.tbl_isempty(result) then
|
||||
vim.notify('No ' .. entity .. ' found')
|
||||
else
|
||||
util.set_qflist(map_result(result, bufnr))
|
||||
api.nvim_command("copen")
|
||||
config = config or {}
|
||||
if config.loclist then
|
||||
util.set_loclist(map_result(result, ctx.bufnr))
|
||||
api.nvim_command("lopen")
|
||||
else
|
||||
util.set_qflist(map_result(result, ctx.bufnr))
|
||||
api.nvim_command("copen")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
--@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_references
|
||||
M['textDocument/references'] = response_to_qflist(util.locations_to_items, 'references')
|
||||
--see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_references
|
||||
M['textDocument/references'] = response_to_list(util.locations_to_items, 'references')
|
||||
|
||||
--@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_documentSymbol
|
||||
M['textDocument/documentSymbol'] = response_to_qflist(util.symbols_to_items, 'document symbols')
|
||||
--see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_documentSymbol
|
||||
M['textDocument/documentSymbol'] = response_to_list(util.symbols_to_items, 'document symbols')
|
||||
|
||||
--@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#workspace_symbol
|
||||
M['workspace/symbol'] = response_to_qflist(util.symbols_to_items, 'symbols')
|
||||
--see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#workspace_symbol
|
||||
M['workspace/symbol'] = response_to_list(util.symbols_to_items, 'symbols')
|
||||
|
||||
--@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_rename
|
||||
M['textDocument/rename'] = function(_, _, result)
|
||||
--see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_rename
|
||||
M['textDocument/rename'] = function(_, result, _)
|
||||
if not result then return end
|
||||
util.apply_workspace_edit(result)
|
||||
end
|
||||
|
||||
--@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_rangeFormatting
|
||||
M['textDocument/rangeFormatting'] = function(_, _, result)
|
||||
--see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_rangeFormatting
|
||||
M['textDocument/rangeFormatting'] = function(_, result, ctx, _)
|
||||
if not result then return end
|
||||
util.apply_text_edits(result)
|
||||
util.apply_text_edits(result, ctx.bufnr)
|
||||
end
|
||||
|
||||
--@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_formatting
|
||||
M['textDocument/formatting'] = function(_, _, result)
|
||||
--see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_formatting
|
||||
M['textDocument/formatting'] = function(_, result, ctx, _)
|
||||
if not result then return end
|
||||
util.apply_text_edits(result)
|
||||
util.apply_text_edits(result, ctx.bufnr)
|
||||
end
|
||||
|
||||
--@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_completion
|
||||
M['textDocument/completion'] = function(_, _, result)
|
||||
--see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_completion
|
||||
M['textDocument/completion'] = function(_, result, _, _)
|
||||
if vim.tbl_isempty(result or {}) then return end
|
||||
local row, col = unpack(api.nvim_win_get_cursor(0))
|
||||
local line = assert(api.nvim_buf_get_lines(0, row-1, row, false)[1])
|
||||
@@ -260,9 +274,9 @@ end
|
||||
--- - border: (default=nil)
|
||||
--- - Add borders to the floating window
|
||||
--- - See |vim.api.nvim_open_win()|
|
||||
function M.hover(_, method, result, _, _, config)
|
||||
function M.hover(_, result, ctx, config)
|
||||
config = config or {}
|
||||
config.focus_id = method
|
||||
config.focus_id = ctx.method
|
||||
if not (result and result.contents) then
|
||||
-- return { 'No information available' }
|
||||
return
|
||||
@@ -281,13 +295,13 @@ M['textDocument/hover'] = M.hover
|
||||
|
||||
--@private
|
||||
--- Jumps to a location. Used as a handler for multiple LSP methods.
|
||||
--@param _ (not used)
|
||||
--@param method (string) LSP method name
|
||||
--@param result (table) result of LSP method; a location or a list of locations.
|
||||
---@param _ (not used)
|
||||
---@param result (table) result of LSP method; a location or a list of locations.
|
||||
---@param ctx (table) table containing the context of the request, including the method
|
||||
---(`textDocument/definition` can return `Location` or `Location[]`
|
||||
local function location_handler(_, method, result)
|
||||
local function location_handler(_, result, ctx, _)
|
||||
if result == nil or vim.tbl_isempty(result) then
|
||||
local _ = log.info() and log.info(method, 'No location found')
|
||||
local _ = log.info() and log.info(ctx.method, 'No location found')
|
||||
return nil
|
||||
end
|
||||
|
||||
@@ -328,17 +342,19 @@ M['textDocument/implementation'] = location_handler
|
||||
--- - border: (default=nil)
|
||||
--- - Add borders to the floating window
|
||||
--- - See |vim.api.nvim_open_win()|
|
||||
function M.signature_help(_, method, result, _, bufnr, config)
|
||||
function M.signature_help(_, result, ctx, config)
|
||||
config = config or {}
|
||||
config.focus_id = method
|
||||
config.focus_id = ctx.method
|
||||
-- When use `autocmd CompleteDone <silent><buffer> lua vim.lsp.buf.signature_help()` to call signatureHelp handler
|
||||
-- If the completion item doesn't have signatures It will make noise. Change to use `print` that can use `<silent>` to ignore
|
||||
if not (result and result.signatures and result.signatures[1]) then
|
||||
print('No signature help available')
|
||||
return
|
||||
end
|
||||
local ft = api.nvim_buf_get_option(bufnr, 'filetype')
|
||||
local lines = util.convert_signature_help_to_markdown_lines(result, ft)
|
||||
local client = vim.lsp.get_client_by_id(ctx.client_id)
|
||||
local triggers = client.resolved_capabilities.signature_help_trigger_characters
|
||||
local ft = api.nvim_buf_get_option(ctx.bufnr, 'filetype')
|
||||
local lines, hl = util.convert_signature_help_to_markdown_lines(result, ft, triggers)
|
||||
lines = util.trim_empty_lines(lines)
|
||||
if vim.tbl_isempty(lines) then
|
||||
print('No signature help available')
|
||||
@@ -350,10 +366,10 @@ end
|
||||
--@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_signatureHelp
|
||||
M['textDocument/signatureHelp'] = M.signature_help
|
||||
|
||||
--@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_documentHighlight
|
||||
M['textDocument/documentHighlight'] = function(_, _, result, _, bufnr, _)
|
||||
--see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_documentHighlight
|
||||
M['textDocument/documentHighlight'] = function(_, result, ctx, _)
|
||||
if not result then return end
|
||||
util.buf_highlight_references(bufnr, result)
|
||||
util.buf_highlight_references(ctx.bufnr, result)
|
||||
end
|
||||
|
||||
--@private
|
||||
@@ -364,7 +380,7 @@ end
|
||||
--@returns `CallHierarchyIncomingCall[]` if {direction} is `"from"`,
|
||||
--@returns `CallHierarchyOutgoingCall[]` if {direction} is `"to"`,
|
||||
local make_call_hierarchy_handler = function(direction)
|
||||
return function(_, _, result)
|
||||
return function(_, result)
|
||||
if not result then return end
|
||||
local items = {}
|
||||
for _, call_hierarchy_call in pairs(result) do
|
||||
@@ -389,10 +405,11 @@ M['callHierarchy/incomingCalls'] = make_call_hierarchy_handler('from')
|
||||
--@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#callHierarchy/outgoingCalls
|
||||
M['callHierarchy/outgoingCalls'] = make_call_hierarchy_handler('to')
|
||||
|
||||
--@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#window/logMessage
|
||||
M['window/logMessage'] = function(_, _, result, client_id)
|
||||
--see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#window_logMessage
|
||||
M['window/logMessage'] = function(_, result, ctx, _)
|
||||
local message_type = result.type
|
||||
local message = result.message
|
||||
local client_id = ctx.client_id
|
||||
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
|
||||
@@ -410,10 +427,11 @@ M['window/logMessage'] = function(_, _, result, client_id)
|
||||
return result
|
||||
end
|
||||
|
||||
--@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#window/showMessage
|
||||
M['window/showMessage'] = function(_, _, result, client_id)
|
||||
--see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#window_showMessage
|
||||
M['window/showMessage'] = function(_, result, ctx, _)
|
||||
local message_type = result.type
|
||||
local message = result.message
|
||||
local client_id = ctx.client_id
|
||||
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
|
||||
@@ -430,12 +448,14 @@ end
|
||||
|
||||
-- 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, bufnr, config)
|
||||
local _ = log.debug() and log.debug('default_handler', method, {
|
||||
params = params, client_id = client_id, err = err, bufnr = bufnr, config = config
|
||||
M[k] = function(err, result, ctx, config)
|
||||
local _ = log.debug() and log.debug('default_handler', ctx.method, {
|
||||
err = err, result = result, ctx=vim.inspect(ctx), config = config
|
||||
})
|
||||
|
||||
if err then
|
||||
local client = vim.lsp.get_client_by_id(ctx.client_id)
|
||||
local client_name = client and client.name or string.format("client_id=%d", ctx.client_id)
|
||||
-- LSP spec:
|
||||
-- interface ResponseError:
|
||||
-- code: integer;
|
||||
@@ -444,7 +464,7 @@ for k, fn in pairs(M) do
|
||||
return err_message(tostring(err.code) .. ': ' .. err.message)
|
||||
end
|
||||
|
||||
return fn(err, method, params, client_id, bufnr, config)
|
||||
return fn(err, result, ctx, config)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user