chore: add type annotations and resolve LSP warnings (#2555)
* chore: add type annotations to (almost) all functions
* stylua
* Add classes for symlink nodes
* Replace deprecated `@vararg`
* Move node classes to `node` module
* Fix `Symlink*` classes
* add vim and libuv runtime for luals, qualify libuv types
* add scripts/luals-check, not quite ready for CI
* additional nil checks for git/init.lua and git/runner.lua
* additional nil checks for nvim-tree.lua
* wrap vim.cmd-as-a-function calls inside functions
* vim.tbl_filter predicate returns booleans
* Revert "add scripts/luals-check, not quite ready for CI"
This reverts commit c70229cad9.
* Add `MinimalNode` class in `marks` module
* Fix various LSP warnings
* stylua
* Fix `Explorer` class, update related annotations and add necessary checks
* Add missing annotations to `live-filter`
* Add temporary aliases for `uv.*` types
* Resolve remaining LSP warnings
* Revert changes not related to internal types
* Minor adjustments
* Update doc comments style
* Minor adjustments (pt. 2)
---------
Co-authored-by: Alexander Courtis <alex@courtis.org>
This commit is contained in:
@@ -20,6 +20,10 @@ local clipboard = {
|
||||
copy = {},
|
||||
}
|
||||
|
||||
---@param source string
|
||||
---@param destination string
|
||||
---@return boolean
|
||||
---@return string|nil
|
||||
local function do_copy(source, destination)
|
||||
local source_stats, handle
|
||||
local success, errmsg
|
||||
@@ -81,6 +85,12 @@ local function do_copy(source, destination)
|
||||
return true
|
||||
end
|
||||
|
||||
---@param source string
|
||||
---@param dest string
|
||||
---@param action_type string
|
||||
---@param action_fn fun(source: string, dest: string)
|
||||
---@return boolean|nil -- success
|
||||
---@return string|nil -- error message
|
||||
local function do_single_paste(source, dest, action_type, action_fn)
|
||||
local dest_stats
|
||||
local success, errmsg, errcode
|
||||
@@ -140,6 +150,8 @@ local function do_single_paste(source, dest, action_type, action_fn)
|
||||
end
|
||||
end
|
||||
|
||||
---@param node Node
|
||||
---@param clip table
|
||||
local function toggle(node, clip)
|
||||
if node.name == ".." then
|
||||
return
|
||||
@@ -147,7 +159,8 @@ local function toggle(node, clip)
|
||||
local notify_node = notify.render_path(node.absolute_path)
|
||||
|
||||
if utils.array_remove(clip, node) then
|
||||
return notify.info(notify_node .. " removed from clipboard.")
|
||||
notify.info(notify_node .. " removed from clipboard.")
|
||||
return
|
||||
end
|
||||
|
||||
table.insert(clip, node)
|
||||
@@ -161,22 +174,28 @@ function M.clear_clipboard()
|
||||
renderer.draw()
|
||||
end
|
||||
|
||||
---@param node Node
|
||||
function M.copy(node)
|
||||
utils.array_remove(clipboard.cut, node)
|
||||
toggle(node, clipboard.copy)
|
||||
renderer.draw()
|
||||
end
|
||||
|
||||
---@param node Node
|
||||
function M.cut(node)
|
||||
utils.array_remove(clipboard.copy, node)
|
||||
toggle(node, clipboard.cut)
|
||||
renderer.draw()
|
||||
end
|
||||
|
||||
---@param node Node
|
||||
---@param action_type string
|
||||
---@param action_fn fun(source: string, dest: string)
|
||||
local function do_paste(node, action_type, action_fn)
|
||||
node = lib.get_last_group_node(node)
|
||||
if node.name == ".." then
|
||||
node = core.get_explorer()
|
||||
local explorer = core.get_explorer()
|
||||
if node.name == ".." and explorer then
|
||||
node = explorer
|
||||
end
|
||||
local clip = clipboard[action_type]
|
||||
if #clip == 0 then
|
||||
@@ -202,10 +221,14 @@ local function do_paste(node, action_type, action_fn)
|
||||
|
||||
clipboard[action_type] = {}
|
||||
if not M.config.filesystem_watchers.enable then
|
||||
return reloaders.reload_explorer()
|
||||
reloaders.reload_explorer()
|
||||
end
|
||||
end
|
||||
|
||||
---@param source string
|
||||
---@param destination string
|
||||
---@return boolean
|
||||
---@return string?
|
||||
local function do_cut(source, destination)
|
||||
log.line("copy_paste", "do_cut '%s' -> '%s'", source, destination)
|
||||
|
||||
@@ -225,12 +248,13 @@ local function do_cut(source, destination)
|
||||
return true
|
||||
end
|
||||
|
||||
---@param node Node
|
||||
function M.paste(node)
|
||||
if clipboard.cut[1] ~= nil then
|
||||
return do_paste(node, "cut", do_cut)
|
||||
do_paste(node, "cut", do_cut)
|
||||
else
|
||||
do_paste(node, "copy", do_copy)
|
||||
end
|
||||
|
||||
return do_paste(node, "copy", do_copy)
|
||||
end
|
||||
|
||||
function M.print_clipboard()
|
||||
@@ -248,9 +272,10 @@ function M.print_clipboard()
|
||||
end
|
||||
end
|
||||
|
||||
return notify.info(table.concat(content, "\n") .. "\n")
|
||||
notify.info(table.concat(content, "\n") .. "\n")
|
||||
end
|
||||
|
||||
---@param content string
|
||||
local function copy_to_clipboard(content)
|
||||
local clipboard_name
|
||||
if M.config.actions.use_system_clipboard == true then
|
||||
@@ -264,28 +289,36 @@ local function copy_to_clipboard(content)
|
||||
end
|
||||
|
||||
vim.api.nvim_exec_autocmds("TextYankPost", {})
|
||||
return notify.info(string.format("Copied %s to %s clipboard!", content, clipboard_name))
|
||||
notify.info(string.format("Copied %s to %s clipboard!", content, clipboard_name))
|
||||
end
|
||||
|
||||
---@param node Node
|
||||
function M.copy_filename(node)
|
||||
return copy_to_clipboard(node.name)
|
||||
copy_to_clipboard(node.name)
|
||||
end
|
||||
|
||||
---@param node Node
|
||||
function M.copy_path(node)
|
||||
local absolute_path = node.absolute_path
|
||||
local relative_path = utils.path_relative(absolute_path, core.get_cwd())
|
||||
local cwd = core.get_cwd()
|
||||
if cwd == nil then
|
||||
return
|
||||
end
|
||||
|
||||
local relative_path = utils.path_relative(absolute_path, cwd)
|
||||
local content = node.nodes ~= nil and utils.path_add_trailing(relative_path) or relative_path
|
||||
return copy_to_clipboard(content)
|
||||
copy_to_clipboard(content)
|
||||
end
|
||||
|
||||
---@param node Node
|
||||
function M.copy_absolute_path(node)
|
||||
local absolute_path = node.absolute_path
|
||||
local content = node.nodes ~= nil and utils.path_add_trailing(absolute_path) or absolute_path
|
||||
return copy_to_clipboard(content)
|
||||
copy_to_clipboard(content)
|
||||
end
|
||||
|
||||
---Clipboard text highlight group and position when highlight_clipboard.
|
||||
---@param node table
|
||||
--- Clipboard text highlight group and position when highlight_clipboard.
|
||||
---@param node Node
|
||||
---@return HL_POSITION position none when clipboard empty
|
||||
---@return string|nil group only when node present in clipboard
|
||||
function M.get_highlight(node)
|
||||
|
||||
@@ -8,6 +8,7 @@ local find_file = require("nvim-tree.actions.finders.find-file").fn
|
||||
|
||||
local M = {}
|
||||
|
||||
---@param file string
|
||||
local function create_and_notify(file)
|
||||
events._dispatch_will_create_file(file)
|
||||
local ok, fd = pcall(vim.loop.fs_open, file, "w", 420)
|
||||
@@ -19,6 +20,8 @@ local function create_and_notify(file)
|
||||
events._dispatch_file_created(file)
|
||||
end
|
||||
|
||||
---@param iter function iterable
|
||||
---@return integer
|
||||
local function get_num_nodes(iter)
|
||||
local i = 0
|
||||
for _ in iter do
|
||||
@@ -27,6 +30,8 @@ local function get_num_nodes(iter)
|
||||
return i
|
||||
end
|
||||
|
||||
---@param node Node
|
||||
---@return string
|
||||
local function get_containing_folder(node)
|
||||
if node.nodes ~= nil then
|
||||
return utils.path_add_trailing(node.absolute_path)
|
||||
@@ -35,11 +40,18 @@ local function get_containing_folder(node)
|
||||
return node.absolute_path:sub(0, -node_name_size - 1)
|
||||
end
|
||||
|
||||
---@param node Node|nil
|
||||
function M.fn(node)
|
||||
local cwd = core.get_cwd()
|
||||
if cwd == nil then
|
||||
return
|
||||
end
|
||||
|
||||
node = node and lib.get_last_group_node(node)
|
||||
if not node or node.name == ".." then
|
||||
node = {
|
||||
absolute_path = core.get_cwd(),
|
||||
absolute_path = cwd,
|
||||
name = "",
|
||||
nodes = core.get_explorer().nodes,
|
||||
open = true,
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ local M = {
|
||||
config = {},
|
||||
}
|
||||
|
||||
---@param windows integer[]
|
||||
local function close_windows(windows)
|
||||
-- Prevent from closing when the win count equals 1 or 2,
|
||||
-- where the win to remove could be the last opened.
|
||||
@@ -23,6 +24,7 @@ local function close_windows(windows)
|
||||
end
|
||||
end
|
||||
|
||||
---@param absolute_path string
|
||||
local function clear_buffer(absolute_path)
|
||||
local bufs = vim.fn.getbufinfo { bufloaded = 1, buflisted = 1 }
|
||||
for _, buf in pairs(bufs) do
|
||||
@@ -44,10 +46,13 @@ local function clear_buffer(absolute_path)
|
||||
end
|
||||
end
|
||||
|
||||
---@param cwd string
|
||||
---@return boolean|nil
|
||||
local function remove_dir(cwd)
|
||||
local handle = vim.loop.fs_scandir(cwd)
|
||||
if type(handle) == "string" then
|
||||
return notify.error(handle)
|
||||
notify.error(handle)
|
||||
return
|
||||
end
|
||||
|
||||
while true do
|
||||
@@ -75,20 +80,22 @@ local function remove_dir(cwd)
|
||||
end
|
||||
|
||||
--- Remove a node, notify errors, dispatch events
|
||||
--- @param node table
|
||||
---@param node Node
|
||||
function M.remove(node)
|
||||
local notify_node = notify.render_path(node.absolute_path)
|
||||
if node.nodes ~= nil and not node.link_to then
|
||||
local success = remove_dir(node.absolute_path)
|
||||
if not success then
|
||||
return notify.error("Could not remove " .. notify_node)
|
||||
notify.error("Could not remove " .. notify_node)
|
||||
return
|
||||
end
|
||||
events._dispatch_folder_removed(node.absolute_path)
|
||||
else
|
||||
events._dispatch_will_remove_file(node.absolute_path)
|
||||
local success = vim.loop.fs_unlink(node.absolute_path)
|
||||
if not success then
|
||||
return notify.error("Could not remove " .. notify_node)
|
||||
notify.error("Could not remove " .. notify_node)
|
||||
return
|
||||
end
|
||||
events._dispatch_file_removed(node.absolute_path)
|
||||
clear_buffer(node.absolute_path)
|
||||
@@ -96,6 +103,7 @@ function M.remove(node)
|
||||
notify.info(notify_node .. " was properly removed.")
|
||||
end
|
||||
|
||||
---@param node Node
|
||||
function M.fn(node)
|
||||
if node.name == ".." then
|
||||
return
|
||||
|
||||
@@ -20,6 +20,8 @@ local function err_fmt(from, to, reason)
|
||||
return string.format("Cannot rename %s -> %s: %s", from, to, reason)
|
||||
end
|
||||
|
||||
---@param node Node
|
||||
---@param to string
|
||||
function M.rename(node, to)
|
||||
local notify_from = notify.render_path(node.absolute_path)
|
||||
local notify_to = notify.render_path(to)
|
||||
@@ -32,13 +34,16 @@ function M.rename(node, to)
|
||||
events._dispatch_will_rename_node(node.absolute_path, to)
|
||||
local success, err = vim.loop.fs_rename(node.absolute_path, to)
|
||||
if not success then
|
||||
return notify.warn(err_fmt(notify_from, notify_to, err))
|
||||
notify.warn(err_fmt(notify_from, notify_to, err))
|
||||
return
|
||||
end
|
||||
notify.info(string.format("%s -> %s", notify_from, notify_to))
|
||||
utils.rename_loaded_buffers(node.absolute_path, to)
|
||||
events._dispatch_node_renamed(node.absolute_path, to)
|
||||
end
|
||||
|
||||
---@param default_modifier string|nil
|
||||
---@return fun(node: Node, modifier: string)
|
||||
function M.fn(default_modifier)
|
||||
default_modifier = default_modifier or ":t"
|
||||
|
||||
@@ -47,13 +52,18 @@ function M.fn(default_modifier)
|
||||
node = lib.get_node_at_cursor()
|
||||
end
|
||||
|
||||
if node == nil then
|
||||
return
|
||||
end
|
||||
|
||||
if type(modifier) ~= "string" then
|
||||
modifier = default_modifier
|
||||
end
|
||||
|
||||
-- support for only specific modifiers have been implemented
|
||||
if not ALLOWED_MODIFIERS[modifier] then
|
||||
return notify.warn("Modifier " .. vim.inspect(modifier) .. " is not in allowed list : " .. table.concat(ALLOWED_MODIFIERS, ","))
|
||||
notify.warn("Modifier " .. vim.inspect(modifier) .. " is not in allowed list : " .. table.concat(ALLOWED_MODIFIERS, ","))
|
||||
return
|
||||
end
|
||||
|
||||
node = lib.get_last_group_node(node)
|
||||
|
||||
@@ -8,6 +8,7 @@ local M = {
|
||||
local utils = require "nvim-tree.utils"
|
||||
local events = require "nvim-tree.events"
|
||||
|
||||
---@param absolute_path string
|
||||
local function clear_buffer(absolute_path)
|
||||
local bufs = vim.fn.getbufinfo { bufloaded = 1, buflisted = 1 }
|
||||
for _, buf in pairs(bufs) do
|
||||
@@ -24,6 +25,7 @@ local function clear_buffer(absolute_path)
|
||||
end
|
||||
end
|
||||
|
||||
---@param node Node
|
||||
function M.remove(node)
|
||||
local binary = M.config.trash.cmd:gsub(" .*$", "")
|
||||
if vim.fn.executable(binary) == 0 then
|
||||
@@ -76,6 +78,7 @@ function M.remove(node)
|
||||
end
|
||||
end
|
||||
|
||||
---@param node Node
|
||||
function M.fn(node)
|
||||
if node.name == ".." then
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user