|
|
|
local lsp = vim.lsp
|
|
|
|
local util = lsp.util
|
|
|
|
local nutils = require('navigator.util')
|
|
|
|
local api = vim.api
|
|
|
|
local log = nutils.log
|
|
|
|
local M = {}
|
|
|
|
|
|
|
|
function M.handler(err, result, ctx, config)
|
|
|
|
config = config or {}
|
|
|
|
config.focus_id = ctx.method
|
|
|
|
if api.nvim_get_current_buf() ~= ctx.bufnr then
|
|
|
|
-- Ignore result since buffer changed. This happens for slow language servers.
|
|
|
|
return
|
|
|
|
end
|
|
|
|
local failed = false
|
|
|
|
if err then
|
|
|
|
vim.notify('no hover info ' .. err)
|
|
|
|
failed = true
|
|
|
|
end
|
|
|
|
if not result or not result.contents then
|
|
|
|
if config.silent ~= true then
|
|
|
|
vim.notify('No hover information available')
|
|
|
|
end
|
|
|
|
failed = true
|
|
|
|
end
|
|
|
|
local bufnr = ctx.bufnr
|
|
|
|
-- get filetype for bufnr
|
|
|
|
local ft = api.nvim_buf_get_option(bufnr, 'filetype')
|
|
|
|
if failed then
|
|
|
|
if _NgConfigValues.lsp.hover.ft then
|
|
|
|
local fallback_fn = _NgConfigValues.hover.ft or ''
|
|
|
|
if type(fallback_fn) == 'function' then
|
|
|
|
fallback_fn(ctx, config)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return -- return early as no valid hover info lets fallback to other sources
|
|
|
|
end
|
|
|
|
local format = 'markdown'
|
|
|
|
local contents ---@type string[]
|
|
|
|
if type(result.contents) == 'table' and result.contents.kind == 'plaintext' then
|
|
|
|
format = 'plaintext'
|
|
|
|
contents = vim.split(result.contents.value or '', '\n', { trimempty = true })
|
|
|
|
else
|
|
|
|
contents = util.convert_input_to_markdown_lines(result.contents)
|
|
|
|
end
|
|
|
|
if vim.tbl_isempty(contents) then
|
|
|
|
if config.silent ~= true then
|
|
|
|
vim.notify('No information available')
|
|
|
|
end
|
|
|
|
return
|
|
|
|
end
|
|
|
|
return util.open_floating_preview(contents, format, config)
|
|
|
|
end
|
|
|
|
|
|
|
|
return M
|