refactor(#2942): multi instance: move utils functions to Explorer methods (#3200)

* refactor(#2942): multi instance: move find_node_line to Explorer

* refactor(#2942): multi instance: move get_node_from_path to Explorer

* refactor(#2942): multi instance: move focus_file to Explorer

* refactor(#2942): multi instance: move focus_node_or_parent to Explorer

* refactor(#2942): multi instance: move get_node_from_path to Explorer

* refactor(#2942): multi instance: move find_node to Explorer

* refactor(#2942): multi instance: move get_nodes_by_line to Explorer

* refactor(#2942): multi instance: remove unnecessary focus_file

* refactor(#2942): style
This commit is contained in:
Alexander Courtis 2025-09-08 16:26:42 +10:00 committed by GitHub
parent f92cc3a91c
commit e179ad2f83
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 135 additions and 153 deletions

View File

@ -32,7 +32,7 @@ function M.fn(path)
local profile = log.profile_start("find file %s", path_real) local profile = log.profile_start("find file %s", path_real)
-- refresh the contents of all parents, expanding groups as needed -- refresh the contents of all parents, expanding groups as needed
if utils.get_node_from_path(path_real) == nil then if explorer:get_node_from_path(path_real) == nil then
explorer:refresh_parent_nodes_for_path(vim.fn.fnamemodify(path_real, ":h")) explorer:refresh_parent_nodes_for_path(vim.fn.fnamemodify(path_real, ":h"))
end end

View File

@ -1,4 +1,3 @@
local utils = require("nvim-tree.utils")
local view = require("nvim-tree.view") local view = require("nvim-tree.view")
local core = require("nvim-tree.core") local core = require("nvim-tree.core")
local diagnostics = require("nvim-tree.diagnostics") local diagnostics = require("nvim-tree.diagnostics")
@ -36,7 +35,7 @@ end
---@param skip_gitignored boolean? default false ---@param skip_gitignored boolean? default false
local function move(explorer, where, what, skip_gitignored) local function move(explorer, where, what, skip_gitignored)
local first_node_line = core.get_nodes_starting_line() local first_node_line = core.get_nodes_starting_line()
local nodes_by_line = utils.get_nodes_by_line(explorer.nodes, first_node_line) local nodes_by_line = explorer:get_nodes_by_line(first_node_line)
local iter_start, iter_end, iter_step, cur, first, nex local iter_start, iter_end, iter_step, cur, first, nex
local cursor = explorer:get_cursor_position() local cursor = explorer:get_cursor_position()
@ -191,7 +190,7 @@ local function move_prev_recursive(explorer, what, skip_gitignored)
if node_init.name == ".." then -- root node if node_init.name == ".." then -- root node
view.set_cursor({ 1, 0 }) -- move to root node (position 1) view.set_cursor({ 1, 0 }) -- move to root node (position 1)
else else
local node_init_line = utils.find_node_line(node_init) local node_init_line = explorer:find_node_line(node_init)
if node_init_line < 0 then if node_init_line < 0 then
return return
end end

View File

@ -1,6 +1,4 @@
local view = require("nvim-tree.view") local view = require("nvim-tree.view")
local utils = require("nvim-tree.utils")
local DirectoryNode = require("nvim-tree.node.directory") local DirectoryNode = require("nvim-tree.node.directory")
local M = {} local M = {}
@ -29,7 +27,7 @@ function M.fn(should_close)
return return
end end
local _, line = utils.find_node(parent.explorer.nodes, function(n) local _, line = parent.explorer:find_node(function(n)
return n.absolute_path == parent.absolute_path return n.absolute_path == parent.absolute_path
end) end)

View File

@ -1,4 +1,3 @@
local utils = require("nvim-tree.utils")
local core = require("nvim-tree.core") local core = require("nvim-tree.core")
local Iterator = require("nvim-tree.iterators.node-iterator") local Iterator = require("nvim-tree.iterators.node-iterator")
@ -12,9 +11,14 @@ function M.fn(direction)
return return
end end
local explorer = core.get_explorer()
if not explorer then
return
end
local first, last, next, prev = nil, nil, nil, nil local first, last, next, prev = nil, nil, nil, nil
local found = false local found = false
local parent = node.parent or core.get_explorer() local parent = node.parent or explorer
Iterator.builder(parent and parent.nodes or {}) Iterator.builder(parent and parent.nodes or {})
:recursor(function() :recursor(function()
return nil return nil
@ -45,7 +49,7 @@ function M.fn(direction)
end end
if target_node then if target_node then
utils.focus_file(target_node.absolute_path) explorer:focus_node_or_parent(target_node)
end end
end end
end end

View File

@ -56,7 +56,7 @@ local function collapse(node, opts)
:iterate() :iterate()
explorer.renderer:draw() explorer.renderer:draw()
utils.focus_node_or_parent(node_at_cursor) explorer:focus_node_or_parent(node_at_cursor)
end end

View File

@ -280,7 +280,7 @@ function Filters:toggle(type)
local node = self.explorer:get_node_at_cursor() local node = self.explorer:get_node_at_cursor()
self.explorer:reload_explorer() self.explorer:reload_explorer()
if node then if node then
utils.focus_node_or_parent(node) self.explorer:focus_node_or_parent(node)
end end
end end

View File

@ -527,7 +527,7 @@ function Explorer:get_node_at_cursor()
return self return self
end end
return utils.get_nodes_by_line(self.nodes, core.get_nodes_starting_line())[cursor[1]] return self:get_nodes_by_line(core.get_nodes_starting_line())[cursor[1]]
end end
function Explorer:place_cursor_on_node() function Explorer:place_cursor_on_node()
@ -551,6 +551,114 @@ function Explorer:place_cursor_on_node()
end end
end end
-- Find the line number of a node.
---@param node Node?
---@return integer -1 not found
function Explorer:find_node_line(node)
if not node then
return -1
end
local first_node_line = core.get_nodes_starting_line()
local nodes_by_line = self:get_nodes_by_line(first_node_line)
local iter_start, iter_end = first_node_line, #nodes_by_line
for line = iter_start, iter_end, 1 do
if nodes_by_line[line] == node then
return line
end
end
return -1
end
-- get the node in the tree state depending on the absolute path of the node
-- (grouped or hidden too)
---@param path string
---@return Node|nil
---@return number|nil
function Explorer:get_node_from_path(path)
if self.absolute_path == path then
return self
end
return Iterator.builder(self.nodes)
:hidden()
:matcher(function(node)
return node.absolute_path == path or node.link_to == path
end)
:recursor(function(node)
if node.group_next then
return { node.group_next }
end
if node.nodes then
return node.nodes
end
end)
:iterate()
end
---Focus node passed as parameter if visible, otherwise focus first visible parent.
---If none of the parents is visible focus root.
---If node is nil do nothing.
---@param node Node? node to focus
function Explorer:focus_node_or_parent(node)
while node do
local found_node, i = self:find_node(function(node_)
return node_.absolute_path == node.absolute_path
end)
if found_node or node.parent == nil then
view.set_cursor({ i + 1, 1 })
break
end
node = node.parent
end
end
--- Get the node and index of the node from the tree that matches the predicate.
--- The explored nodes are those displayed on the view.
---@param fn fun(node: Node): boolean
---@return table|nil
---@return number
function Explorer:find_node(fn)
local node, i = Iterator.builder(self.nodes)
:matcher(fn)
:recursor(function(node)
return node.group_next and { node.group_next } or (node.open and #node.nodes > 0 and node.nodes)
end)
:iterate()
i = view.is_root_folder_visible() and i or i - 1
if node and node.explorer.live_filter.filter then
i = i + 1
end
return node, i
end
--- Return visible nodes indexed by line
---@param line_start number
---@return table
function Explorer:get_nodes_by_line(line_start)
local nodes_by_line = {}
local line = line_start
Iterator.builder(self.nodes)
:applier(function(node)
if node.group_next then
return
end
nodes_by_line[line] = node
line = line + 1
end)
:recursor(function(node)
return node.group_next and { node.group_next } or (node.open and #node.nodes > 0 and node.nodes)
end)
:iterate()
return nodes_by_line
end
---Api.tree.get_nodes ---Api.tree.get_nodes
---@return nvim_tree.api.Node ---@return nvim_tree.api.Node
function Explorer:get_nodes() function Explorer:get_nodes()

View File

@ -220,9 +220,9 @@ function LiveFilter:clear_filter()
self.explorer.renderer:draw() self.explorer.renderer:draw()
if node then if node then
utils.focus_file(node.absolute_path) self.explorer:focus_node_or_parent(node)
elseif last_node then elseif last_node then
utils.focus_file(last_node.absolute_path) self.explorer:focus_node_or_parent(last_node)
end end
end end

View File

@ -233,7 +233,13 @@ local function reload_tree_at(toplevel)
end end
log.line("watcher", "git event executing '%s'", toplevel) log.line("watcher", "git event executing '%s'", toplevel)
local root_node = utils.get_node_from_path(toplevel)
local explorer = require("nvim-tree.core").get_explorer()
if not explorer then
return nil
end
local root_node = explorer:get_node_from_path(toplevel)
if not root_node then if not root_node then
return return
end end
@ -252,7 +258,7 @@ local function reload_tree_at(toplevel)
end) end)
:iterate() :iterate()
root_node.explorer.renderer:draw() explorer.renderer:draw()
end) end)
end end

View File

@ -227,9 +227,9 @@ function Marks:navigate(up)
end end
if up then if up then
utils.focus_node_or_parent(prev or last) self.explorer:focus_node_or_parent(prev or last)
else else
utils.focus_node_or_parent(next or first) self.explorer:focus_node_or_parent(next or first)
end end
end end
@ -263,7 +263,7 @@ function Marks:navigate_select()
if node and not node:is(DirectoryNode) and not utils.get_win_buf_from_path(node.absolute_path) then if node and not node:is(DirectoryNode) and not utils.get_win_buf_from_path(node.absolute_path) then
open_file.fn("edit", node.absolute_path) open_file.fn("edit", node.absolute_path)
elseif node then elseif node then
utils.focus_file(node.absolute_path) self.explorer:focus_node_or_parent(node)
end end
end) end)
end end

View File

@ -1,5 +1,3 @@
local Iterator = require("nvim-tree.iterators.node-iterator")
local M = { local M = {
debouncers = {}, debouncers = {},
} }
@ -114,48 +112,6 @@ end
M.path_separator = path_separator M.path_separator = path_separator
--- Get the node and index of the node from the tree that matches the predicate.
--- The explored nodes are those displayed on the view.
---@param nodes Node[]
---@param fn fun(node: Node): boolean
---@return table|nil
---@return number
function M.find_node(nodes, fn)
local node, i = Iterator.builder(nodes)
:matcher(fn)
:recursor(function(node)
return node.group_next and { node.group_next } or (node.open and #node.nodes > 0 and node.nodes)
end)
:iterate()
i = require("nvim-tree.view").is_root_folder_visible() and i or i - 1
if node and node.explorer.live_filter.filter then
i = i + 1
end
return node, i
end
-- Find the line number of a node.
-- Return -1 is node is nil or not found.
---@param node Node?
---@return integer
function M.find_node_line(node)
if not node then
return -1
end
local first_node_line = require("nvim-tree.core").get_nodes_starting_line()
local nodes_by_line = M.get_nodes_by_line(require("nvim-tree.core").get_explorer().nodes, first_node_line)
local iter_start, iter_end = first_node_line, #nodes_by_line
for line = iter_start, iter_end, 1 do
if nodes_by_line[line] == node then
return line
end
end
return -1
end
---@param extmarks vim.api.keyset.get_extmark_item[] as per vim.api.nvim_buf_get_extmarks ---@param extmarks vim.api.keyset.get_extmark_item[] as per vim.api.nvim_buf_get_extmarks
---@return number ---@return number
function M.extmarks_length(extmarks) function M.extmarks_length(extmarks)
@ -171,39 +127,6 @@ function M.extmarks_length(extmarks)
return length return length
end end
-- get the node in the tree state depending on the absolute path of the node
-- (grouped or hidden too)
---@param path string
---@return Node|nil
---@return number|nil
function M.get_node_from_path(path)
local explorer = require("nvim-tree.core").get_explorer()
-- tree may not yet be loaded
if not explorer then
return
end
if explorer.absolute_path == path then
return explorer
end
return Iterator.builder(explorer.nodes)
:hidden()
:matcher(function(node)
return node.absolute_path == path or node.link_to == path
end)
:recursor(function(node)
if node.group_next then
return { node.group_next }
end
if node.nodes then
return node.nodes
end
end)
:iterate()
end
M.default_format_hidden_count = function(hidden_count, simple) M.default_format_hidden_count = function(hidden_count, simple)
local parts = {} local parts = {}
local total_count = 0 local total_count = 0
@ -224,30 +147,6 @@ M.default_format_hidden_count = function(hidden_count, simple)
return nil return nil
end end
--- Return visible nodes indexed by line
---@param nodes_all Node[]
---@param line_start number
---@return table
function M.get_nodes_by_line(nodes_all, line_start)
local nodes_by_line = {}
local line = line_start
Iterator.builder(nodes_all)
:applier(function(node)
if node.group_next then
return
end
nodes_by_line[line] = node
line = line + 1
end)
:recursor(function(node)
return node.group_next and { node.group_next } or (node.open and #node.nodes > 0 and node.nodes)
end)
:iterate()
return nodes_by_line
end
function M.rename_loaded_buffers(old_path, new_path) function M.rename_loaded_buffers(old_path, new_path)
-- delete new if it exists -- delete new if it exists
for _, buf in pairs(vim.api.nvim_list_bufs()) do for _, buf in pairs(vim.api.nvim_list_bufs()) do
@ -469,38 +368,6 @@ function M.debounce(context, timeout, callback)
end) end)
end end
function M.focus_file(path)
local _, i = M.find_node(require("nvim-tree.core").get_explorer().nodes, function(node)
return node.absolute_path == path
end)
require("nvim-tree.view").set_cursor({ i + 1, 1 })
end
---Focus node passed as parameter if visible, otherwise focus first visible parent.
---If none of the parents is visible focus root.
---If node is nil do nothing.
---@param node Node? node to focus
function M.focus_node_or_parent(node)
local explorer = require("nvim-tree.core").get_explorer()
if explorer == nil then
return
end
while node do
local found_node, i = M.find_node(explorer.nodes, function(node_)
return node_.absolute_path == node.absolute_path
end)
if found_node or node.parent == nil then
require("nvim-tree.view").set_cursor({ i + 1, 1 })
break
end
node = node.parent
end
end
---@param path string ---@param path string
---@return integer|nil ---@return integer|nil
---@return integer|nil ---@return integer|nil