navigator.lua/lua/navigator/lspclient/inlay.lua

69 lines
1.9 KiB
Lua
Raw Normal View History

2024-02-02 04:29:27 +00:00
local log = require('vim.lsp.log')
local util = require('vim.lsp.util')
local api = vim.api
local bufstates = {}
return {
on_inlayhint = function(err, result, ctx, _)
if err then
if log.error() then
log.error('inlayhint', err)
end
return
end
local bufnr = assert(ctx.bufnr)
if util.buf_versions[bufnr] ~= ctx.version then
return
end
local client_id = ctx.client_id
if not result then
return
end
local bufstate = bufstates[bufnr]
if not bufstate or not bufstate.enabled then
return
end
if not (bufstate.client_hint and bufstate.version) then
bufstate.client_hint = vim.defaulttable()
bufstate.version = ctx.version
end
local hints_by_client = bufstate.client_hint
local client = assert(vim.lsp.get_client_by_id(client_id))
local new_hints_by_lnum = vim.defaulttable()
local num_unprocessed = #result
if num_unprocessed == 0 then
hints_by_client[client_id] = {}
bufstate.version = ctx.version
api.nvim__buf_redraw_range(bufnr, 0, -1)
return
end
local lines = api.nvim_buf_get_lines(bufnr, 0, -1, false)
---@param position lsp.Position
---@return integer
local function pos_to_byte(position)
local col = position.character
if col > 0 then
local line = lines[position.line + 1] or ''
local ok, convert_result
ok, convert_result = pcall(util._str_byteindex_enc, line, col, client.offset_encoding)
if ok then
return convert_result
end
return math.min(#line, col)
end
return col
end
for _, hint in ipairs(result) do
local lnum = hint.position.line
hint.position.character = pos_to_byte(hint.position)
table.insert(new_hints_by_lnum[lnum], hint)
end
hints_by_client[client_id] = new_hints_by_lnum
bufstate.version = ctx.version
api.nvim__buf_redraw_range(bufnr, 0, -1)
end,
}