nbsp revert, lsp_references added
parent
fe0b3d1184
commit
495c133254
@ -0,0 +1,199 @@
|
||||
if not pcall(require, "fzf") then
|
||||
return
|
||||
end
|
||||
|
||||
-- local fzf = require "fzf"
|
||||
-- local fzf_helpers = require("fzf.helpers")
|
||||
-- local path = require "fzf-lua.path"
|
||||
local core = require "fzf-lua.core"
|
||||
local utils = require "fzf-lua.utils"
|
||||
local config = require "fzf-lua.config"
|
||||
|
||||
local M = {}
|
||||
|
||||
local getopts_lsp = function(opts, cfg)
|
||||
opts = config.getopts(opts, cfg, {
|
||||
"cwd", "prompt", "actions", "winopts",
|
||||
"file_icons", "color_icons", "git_icons",
|
||||
"separator"
|
||||
})
|
||||
|
||||
if not opts.timeout then
|
||||
opts.timeout = config.lsp.timeout or 10000
|
||||
end
|
||||
return opts
|
||||
end
|
||||
|
||||
local set_fzf_args = function(opts)
|
||||
local line_placeholder = 2
|
||||
if opts.file_icons == true or opts.git_icons == true then
|
||||
line_placeholder = 3
|
||||
end
|
||||
|
||||
opts.cli_args = "--nth=3 --delimiter='[: \\t]'"
|
||||
opts.preview_args = string.format("--highlight-line={%d}", line_placeholder)
|
||||
opts.preview_offset = string.format("+{%d}-/2", line_placeholder)
|
||||
return opts
|
||||
end
|
||||
|
||||
M.refs_async = function(opts)
|
||||
|
||||
opts = getopts_lsp(opts, config.lsp)
|
||||
|
||||
-- hangs/returns empty if inside the coroutine
|
||||
local params = vim.lsp.util.make_position_params()
|
||||
params.context = { includeDeclaration = true }
|
||||
local results_lsp, lsp_err = vim.lsp.buf_request_sync(0, "textDocument/references", params, opts.timeout)
|
||||
if lsp_err then
|
||||
utils.err("Error finding LSP references: " .. lsp_err)
|
||||
return
|
||||
end
|
||||
|
||||
opts.fzf_fn = function (cb)
|
||||
coroutine.wrap(function ()
|
||||
local co = coroutine.running()
|
||||
local locations = {}
|
||||
for _, server_results in pairs(results_lsp) do
|
||||
if server_results.result then
|
||||
vim.list_extend(locations, vim.lsp.util.locations_to_items(server_results.result) or {})
|
||||
end
|
||||
end
|
||||
|
||||
if vim.tbl_isempty(locations) then
|
||||
utils.info("LSP references is empty.")
|
||||
vim.api.nvim_feedkeys(
|
||||
vim.api.nvim_replace_termcodes("<C-c>", true, false, true),
|
||||
'n', true)
|
||||
return
|
||||
end
|
||||
for _, entry in ipairs(locations) do
|
||||
entry = core.make_entry_lcol(opts, entry)
|
||||
entry = core.make_entry_file(opts, entry)
|
||||
cb(entry, function(err)
|
||||
if err then return end
|
||||
coroutine.resume(co)
|
||||
-- cb(nil) -- to close the pipe to fzf, this removes the loading
|
||||
-- indicator in fzf
|
||||
end)
|
||||
coroutine.yield()
|
||||
end
|
||||
end)()
|
||||
end
|
||||
|
||||
opts = set_fzf_args(opts)
|
||||
return core.fzf_files(opts)
|
||||
end
|
||||
|
||||
local convert_diagnostic_type = function(severity)
|
||||
-- convert from string to int
|
||||
if type(severity) == 'string' then
|
||||
-- make sure that e.g. error is uppercased to Error
|
||||
return vim.lsp.protocol.DiagnosticSeverity[severity:gsub("^%l", string.upper)]
|
||||
end
|
||||
-- otherwise keep original value, incl. nil
|
||||
return severity
|
||||
end
|
||||
|
||||
local filter_diag_severity = function(opts, severity)
|
||||
if opts.severity ~= nil then
|
||||
return opts.severity == severity
|
||||
elseif opts.severity_limit ~= nil then
|
||||
return severity <= opts.severity_limit
|
||||
elseif opts.severity_bound ~= nil then
|
||||
return severity >= opts.severity_bound
|
||||
else
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
local diagnostics_to_tbl = function(opts)
|
||||
opts = opts or {}
|
||||
local items = {}
|
||||
local lsp_type_diagnostic = vim.lsp.protocol.DiagnosticSeverity
|
||||
local current_buf = vim.api.nvim_get_current_buf()
|
||||
|
||||
opts.severity = convert_diagnostic_type(opts.severity)
|
||||
opts.severity_limit = convert_diagnostic_type(opts.severity_limit)
|
||||
opts.severity_bound = convert_diagnostic_type(opts.severity_bound)
|
||||
|
||||
local validate_severity = 0
|
||||
for _, v in ipairs({opts.severity, opts.severity_limit, opts.severity_bound}) do
|
||||
if v ~= nil then
|
||||
validate_severity = validate_severity + 1
|
||||
end
|
||||
if validate_severity > 1 then
|
||||
utils.info('LSP: invalid severity parameters')
|
||||
return {}
|
||||
end
|
||||
end
|
||||
|
||||
local preprocess_diag = function(diag, bufnr)
|
||||
local filename = vim.api.nvim_buf_get_name(bufnr)
|
||||
local start = diag.range['start']
|
||||
local finish = diag.range['end']
|
||||
local row = start.line
|
||||
local col = start.character
|
||||
|
||||
local buffer_diag = {
|
||||
bufnr = bufnr,
|
||||
filename = filename,
|
||||
lnum = row + 1,
|
||||
col = col + 1,
|
||||
start = start,
|
||||
finish = finish,
|
||||
-- remove line break to avoid display issues
|
||||
text = vim.trim(diag.message:gsub("[\n]", "")),
|
||||
type = lsp_type_diagnostic[diag.severity] or lsp_type_diagnostic[1]
|
||||
}
|
||||
return buffer_diag
|
||||
end
|
||||
|
||||
local buffer_diags = opts.get_all and vim.lsp.diagnostic.get_all() or
|
||||
{[current_buf] = vim.lsp.diagnostic.get(current_buf, opts.client_id)}
|
||||
for bufnr, diags in pairs(buffer_diags) do
|
||||
for _, diag in ipairs(diags) do
|
||||
-- workspace diagnostics may include empty tables for unused bufnr
|
||||
if not vim.tbl_isempty(diag) then
|
||||
if filter_diag_severity(opts, diag.severity) then
|
||||
table.insert(items, preprocess_diag(diag, bufnr))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- sort results by bufnr (prioritize cur buf), severity, lnum
|
||||
table.sort(items, function(a, b)
|
||||
if a.bufnr == b.bufnr then
|
||||
if a.type == b.type then
|
||||
return a.lnum < b.lnum
|
||||
else
|
||||
return a.type < b.type
|
||||
end
|
||||
else
|
||||
-- prioritize for current bufnr
|
||||
if a.bufnr == current_buf then
|
||||
return true
|
||||
end
|
||||
if b.bufnr == current_buf then
|
||||
return false
|
||||
end
|
||||
return a.bufnr < b.bufnr
|
||||
end
|
||||
end)
|
||||
|
||||
return items
|
||||
end
|
||||
|
||||
|
||||
M.lsp_diag = function(opts)
|
||||
local locations = diagnostics_to_tbl(opts)
|
||||
|
||||
if vim.tbl_isempty(locations) then
|
||||
utils.info("LSP diagnostics is empty.")
|
||||
return
|
||||
end
|
||||
|
||||
return lsp_run(opts, config.lsp, locations)
|
||||
end
|
||||
|
||||
return M
|
Loading…
Reference in New Issue