From b175dccd5912d104a2c1aa1c73a5d0ac9dbedd42 Mon Sep 17 00:00:00 2001 From: geekifan Date: Sat, 15 Oct 2022 19:17:27 +0800 Subject: [PATCH] fix(coc.lua): no hierarchy when using coc.nvim --- lua/symbols-outline/providers/coc.lua | 61 ++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/lua/symbols-outline/providers/coc.lua b/lua/symbols-outline/providers/coc.lua index 5183a97..0b3e11f 100644 --- a/lua/symbols-outline/providers/coc.lua +++ b/lua/symbols-outline/providers/coc.lua @@ -23,12 +23,71 @@ function M.hover_info(_, _, on_info) }) end +---@param result table +local function convert_symbols(result) + local s = {} + local kinds_index = {} + -- create a inverse indexing of symbols.kind + local symbols = require("symbols-outline.symbols") + for k, v in pairs(symbols.kinds) do + kinds_index[v] = k + end + -- rebuild coc.nvim symbol list hierarchy according to the 'level' key + for _, value in pairs(result) do + value.children = {} + value.kind = kinds_index[value.kind] + if #s == 0 then + table.insert(s, value) + goto continue + end + if value.level == s[#s].level then + if value.level == 0 then + table.insert(s, value) + goto continue + end + local tmp = s[#s] + table.remove(s) + table.insert(s[#s].children, tmp) + table.insert(s, value) + elseif value.level == s[#s].level + 1 then + table.insert(s[#s].children, value) + elseif value.level == s[#s].level + 2 then + local tmp = s[#s].children[#(s[#s].children)] + table.remove(s[#s].children) + table.insert(s, tmp) + table.insert(s[#s].children, value) + elseif value.level < s[#s].level then + while value.level < s[#s].level do + local tmp = s[#s] + table.remove(s) + table.insert(s[#s].children, tmp) + end + if s[#s].level ~= 0 then + local tmp = s[#s] + table.remove(s) + table.insert(s[#s].children, tmp) + table.insert(s, value) + else + table.insert(s, value) + end + end + ::continue:: + end + local top = s[#s] + while top.level ~= 0 do + table.remove(s) + table.insert(s[#s].children, top) + top = s[#s] + end + return s +end + ---@param on_symbols function function M.request_symbols(on_symbols) vim.fn.call('CocActionAsync', { 'documentSymbols', function(_, symbols) - on_symbols(symbols) + on_symbols { [1000000] = { result = convert_symbols(symbols) } } end, }) end