87 lines
3.2 KiB
Lua
87 lines
3.2 KiB
Lua
-- Symbol usage plugin
|
|
|
|
local SymbolKind = vim.lsp.protocol.SymbolKind
|
|
|
|
local function h(name)
|
|
return vim.api.nvim_get_hl(0, { name = name })
|
|
end
|
|
|
|
-- hl-groups can have any name
|
|
vim.api.nvim_set_hl(0, 'SymbolUsageRounding', { fg = h('CursorLine').bg, italic = true })
|
|
vim.api.nvim_set_hl(0, 'SymbolUsageContent', { bg = h('CursorLine').bg, fg = h('Comment').fg, italic = true })
|
|
vim.api.nvim_set_hl(0, 'SymbolUsageRef', { fg = h('Function').fg, bg = h('CursorLine').bg, italic = true })
|
|
vim.api.nvim_set_hl(0, 'SymbolUsageDef', { fg = h('Type').fg, bg = h('CursorLine').bg, italic = true })
|
|
vim.api.nvim_set_hl(0, 'SymbolUsageImpl', { fg = h('@keyword').fg, bg = h('CursorLine').bg, italic = true })
|
|
|
|
local function text_format(symbol)
|
|
local res = {}
|
|
|
|
local round_start = { '', 'SymbolUsageRounding' }
|
|
local round_end = { '', 'SymbolUsageRounding' }
|
|
|
|
-- Indicator that shows if there are any other symbols in the same line
|
|
local stacked_functions_content = symbol.stacked_count > 0 and ('+%s'):format(symbol.stacked_count) or ''
|
|
|
|
if symbol.references then
|
|
local usage = symbol.references <= 1 and 'usage' or 'usages'
|
|
local num = symbol.references == 0 and 'no' or symbol.references
|
|
table.insert(res, round_start)
|
|
table.insert(res, { ' ', 'SymbolUsageRef' })
|
|
table.insert(res, { ('%s %s'):format(num, usage), 'SymbolUsageContent' })
|
|
table.insert(res, round_end)
|
|
end
|
|
|
|
if symbol.definition then
|
|
if #res > 0 then
|
|
table.insert(res, { ' ', 'NonText' })
|
|
end
|
|
table.insert(res, round_start)
|
|
table.insert(res, { ' ', 'SymbolUsageDef' })
|
|
table.insert(res, { symbol.definition .. ' defs', 'SymbolUsageContent' })
|
|
table.insert(res, round_end)
|
|
end
|
|
|
|
if symbol.implementation then
|
|
if #res > 0 then
|
|
table.insert(res, { ' ', 'NonText' })
|
|
end
|
|
table.insert(res, round_start)
|
|
table.insert(res, { ' ', 'SymbolUsageImpl' })
|
|
table.insert(res, { symbol.implementation .. ' impls', 'SymbolUsageContent' })
|
|
table.insert(res, round_end)
|
|
end
|
|
|
|
if stacked_functions_content ~= '' then
|
|
if #res > 0 then
|
|
table.insert(res, { ' ', 'NonText' })
|
|
end
|
|
table.insert(res, round_start)
|
|
table.insert(res, { ' ', 'SymbolUsageImpl' })
|
|
table.insert(res, { stacked_functions_content, 'SymbolUsageContent' })
|
|
table.insert(res, round_end)
|
|
end
|
|
|
|
return res
|
|
end
|
|
|
|
return {
|
|
{
|
|
'Wansmer/symbol-usage.nvim',
|
|
event = 'LspAttach', -- need run before LspAttach if you use nvim 0.9. On 0.10 use 'LspAttach'
|
|
config = function()
|
|
require('symbol-usage').setup {
|
|
filetypes = {},
|
|
log = { enabled = false, level = 'INFO', stdout = {}, log_file = {}, notify = {} },
|
|
text_format = text_format,
|
|
kinds = {
|
|
SymbolKind.Function,
|
|
SymbolKind.Method,
|
|
SymbolKind.Class,
|
|
SymbolKind.Struct,
|
|
-- SymbolKind.Variable,
|
|
-- SymbolKind.Constant,
|
|
},
|
|
}
|
|
end,
|
|
},
|
|
}
|