From 057715f3b0f838a393b999f4038252868631e49b Mon Sep 17 00:00:00 2001 From: Simrat Grewal Date: Tue, 16 Aug 2022 17:59:47 -0700 Subject: [PATCH] Revert "feat(parser): Flatten outline items while parsing" This reverts commit 776ddb393024d1a0d9e530c10c4df08ad0c4b524. --- lua/symbols-outline.lua | 13 ++++++++----- lua/symbols-outline/code_action.lua | 2 +- lua/symbols-outline/hover.lua | 2 +- lua/symbols-outline/parser.lua | 30 +++++++++++++++++++---------- lua/symbols-outline/rename.lua | 2 +- lua/symbols-outline/writer.lua | 6 +++--- 6 files changed, 34 insertions(+), 21 deletions(-) diff --git a/lua/symbols-outline.lua b/lua/symbols-outline.lua index 40bbe54..816ee1b 100644 --- a/lua/symbols-outline.lua +++ b/lua/symbols-outline.lua @@ -55,11 +55,12 @@ end ------------------------- M.state = { outline_items = {}, + flattened_outline_items = {}, code_win = 0, } local function wipe_state() - M.state = { outline_items = {}, code_win = 0 } + M.state = { outline_items = {}, flattened_outline_items = {}, code_win = 0 } end local function __refresh() @@ -73,8 +74,9 @@ local function __refresh() M.state.code_win = vim.api.nvim_get_current_win() M.state.outline_items = items + M.state.flattened_outline_items = parser.flatten(items) - writer.parse_and_write(M.view.bufnr, M.state.outline_items) + writer.parse_and_write(M.view.bufnr, M.state.flattened_outline_items) end providers.request_symbols(refresh_handler) @@ -85,7 +87,7 @@ M._refresh = utils.debounce(__refresh, 100) local function goto_location(change_focus) local current_line = vim.api.nvim_win_get_cursor(M.view.winnr)[1] - local node = M.state.outline_items[current_line] + local node = M.state.flattened_outline_items[current_line] vim.api.nvim_win_set_cursor( M.state.code_win, { node.line + 1, node.character } @@ -126,7 +128,7 @@ function M._highlight_current_item(winnr) local hovered_line = vim.api.nvim_win_get_cursor(win)[1] - 1 local nodes = {} - for index, value in ipairs(M.state.outline_items) do + for index, value in ipairs(M.state.flattened_outline_items) do if value.line == hovered_line or (hovered_line > value.range_start and hovered_line < value.range_end) @@ -209,8 +211,9 @@ local function handler(response) local items = parser.parse(response) M.state.outline_items = items + M.state.flattened_outline_items = parser.flatten(items) - writer.parse_and_write(M.view.bufnr, M.state.outline_items) + writer.parse_and_write(M.view.bufnr, M.state.flattened_outline_items) M._highlight_current_item(M.state.code_win) end diff --git a/lua/symbols-outline/code_action.lua b/lua/symbols-outline/code_action.lua index 72e7228..36f8b69 100644 --- a/lua/symbols-outline/code_action.lua +++ b/lua/symbols-outline/code_action.lua @@ -20,7 +20,7 @@ end function M.show_code_actions() local current_line = vim.api.nvim_win_get_cursor(main.state.outline_win)[1] - local node = main.state.outline_items[current_line] + local node = main.state.flattened_outline_items[current_line] local params = get_action_params(node, main.state.code_win) vim.lsp.buf_request( diff --git a/lua/symbols-outline/hover.lua b/lua/symbols-outline/hover.lua index a6e68aa..27f2a01 100644 --- a/lua/symbols-outline/hover.lua +++ b/lua/symbols-outline/hover.lua @@ -17,7 +17,7 @@ end -- handler yoinked from the default implementation function M.show_hover() local current_line = vim.api.nvim_win_get_cursor(so.view.winnr)[1] - local node = so.state.outline_items[current_line] + local node = so.state.flattened_outline_items[current_line] local hover_params = get_hover_params(node, so.state.code_win) diff --git a/lua/symbols-outline/parser.lua b/lua/symbols-outline/parser.lua index bea0b2f..c45ddac 100644 --- a/lua/symbols-outline/parser.lua +++ b/lua/symbols-outline/parser.lua @@ -24,7 +24,7 @@ local function parse_result(result, depth, hierarchy) -- whether this node is the last in its group local isLast = index == #result - local children = {} + local children = nil if value.children ~= nil then -- copy by value because we dont want it messing with the hir table local child_hir = t_utils.array_copy(hir) @@ -54,15 +54,11 @@ local function parse_result(result, depth, hierarchy) character = selectionRange.start.character, range_start = range.start.line, range_end = range['end'].line, - -- children = children, + children = children, depth = level, isLast = isLast, hierarchy = hir, }) - - for _, node in pairs(children) do - table.insert(ret, node) - end end end return ret @@ -143,11 +139,25 @@ function M.parse(response) return parse_result(sorted, nil, nil) end -function M.get_lines(outline_items) +function M.flatten(outline_items) + local ret = {} + for _, value in ipairs(outline_items) do + table.insert(ret, value) + if value.children ~= nil then + local inner = M.flatten(value.children) + for _, value_inner in ipairs(inner) do + table.insert(ret, value_inner) + end + end + end + return ret +end + +function M.get_lines(flattened_outline_items) local lines = {} local hl_info = {} - for node_line, node in ipairs(outline_items) do + for node_line, node in ipairs(flattened_outline_items) do local line = t_utils.str_to_table(string.rep(' ', node.depth)) local running_length = 1 @@ -213,9 +223,9 @@ function M.get_lines(outline_items) return lines, hl_info end -function M.get_details(outline_items) +function M.get_details(flattened_outline_items) local lines = {} - for _, value in ipairs(outline_items) do + for _, value in ipairs(flattened_outline_items) do table.insert(lines, value.detail or '') end return lines diff --git a/lua/symbols-outline/rename.lua b/lua/symbols-outline/rename.lua index 1378eee..b9d413d 100644 --- a/lua/symbols-outline/rename.lua +++ b/lua/symbols-outline/rename.lua @@ -15,7 +15,7 @@ end function M.rename() local current_line = vim.api.nvim_win_get_cursor(so.view.winnr)[1] - local node = so.state.outline_items[current_line] + local node = so.state.flattened_outline_items[current_line] local params = get_rename_params(node, so.state.code_win) diff --git a/lua/symbols-outline/writer.lua b/lua/symbols-outline/writer.lua index c25c64e..1849a89 100644 --- a/lua/symbols-outline/writer.lua +++ b/lua/symbols-outline/writer.lua @@ -60,12 +60,12 @@ end -- runs the whole writing routine where the text is cleared, new data is parsed -- and then written -function M.parse_and_write(bufnr, outline_items) - local lines, hl_info = parser.get_lines(outline_items) +function M.parse_and_write(bufnr, flattened_outline_items) + local lines, hl_info = parser.get_lines(flattened_outline_items) M.write_outline(bufnr, lines) clear_virt_text(bufnr) - local details = parser.get_details(outline_items) + local details = parser.get_details(flattened_outline_items) M.add_highlights(bufnr, hl_info) M.write_details(bufnr, details) end