mirror of
https://github.com/stevearc/aerial.nvim
synced 2024-09-16 14:34:08 +02:00
refactor: utility methods return nilable integer instead of -1 sentinel value
This commit is contained in:
parent
72813e6020
commit
bea821469c
10 changed files with 74 additions and 30 deletions
|
@ -22,7 +22,7 @@ local function should_close_aerial(aer_win)
|
|||
|
||||
-- Close the aerial window if its attached buffer is unsupported
|
||||
if config.close_automatic_events.unsupported then
|
||||
if not vim.api.nvim_buf_is_valid(src_buf) or not backends.get(src_buf) then
|
||||
if not src_buf or not vim.api.nvim_buf_is_valid(src_buf) or not backends.get(src_buf) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
|
|
@ -108,7 +108,9 @@ local function attach(bufnr, backend, name)
|
|||
local loading = require("aerial.loading")
|
||||
local util = require("aerial.util")
|
||||
local aer_bufnr = util.get_aerial_buffer(bufnr)
|
||||
loading.set_loading(aer_bufnr, not data.has_received_data(bufnr))
|
||||
if aer_bufnr then
|
||||
loading.set_loading(aer_bufnr, not data.has_received_data(bufnr))
|
||||
end
|
||||
|
||||
-- On first attach, fetch symbols from ALL possible backends so that they will race and the
|
||||
-- fastest provider will display symbols (instead of just waiting for the prioritized backend
|
||||
|
@ -179,7 +181,10 @@ M.set_symbols = function(bufnr, items, ctx)
|
|||
end
|
||||
|
||||
data.set_symbols(bufnr, items)
|
||||
loading.set_loading(util.get_aerial_buffer(bufnr), false)
|
||||
local aer_bufnr = util.get_aerial_buffer(bufnr)
|
||||
if aer_bufnr then
|
||||
loading.set_loading(aer_bufnr, false)
|
||||
end
|
||||
|
||||
render.update_aerial_buffer(bufnr)
|
||||
window.update_all_positions(bufnr, 0)
|
||||
|
|
|
@ -17,14 +17,13 @@ local config = require("aerial.config")
|
|||
---@field parent? aerial.Symbol
|
||||
---@field selection_range? aerial.Range
|
||||
---@field children? aerial.Symbol[]
|
||||
---@field scope? string
|
||||
|
||||
---@class aerial.BufData
|
||||
---@field bufnr integer
|
||||
---@field items aerial.Symbol[]
|
||||
---@field flat_items aerial.Symbol[]
|
||||
---@field positions any
|
||||
---@field last_win integer
|
||||
---@field last_win nil|integer
|
||||
---@field collapsed table<string, boolean>
|
||||
---@field collapse_level integer
|
||||
---@field max_level integer
|
||||
|
@ -37,7 +36,7 @@ function BufData.new(bufnr)
|
|||
items = {},
|
||||
flat_items = {},
|
||||
positions = {},
|
||||
last_win = -1,
|
||||
last_win = nil,
|
||||
collapsed = {},
|
||||
collapse_level = 99,
|
||||
}
|
||||
|
@ -148,7 +147,7 @@ function BufData:visit(callback)
|
|||
end
|
||||
end
|
||||
|
||||
---@param include_hidden boolean
|
||||
---@param opts nil|{skip_hidden: nil|boolean}
|
||||
---@return integer
|
||||
function BufData:count(opts)
|
||||
opts = vim.tbl_extend("keep", opts or {}, {
|
||||
|
@ -181,6 +180,9 @@ end
|
|||
function M.get_or_create(buf)
|
||||
buf = buf or 0
|
||||
local bufnr, _ = util.get_buffers(buf)
|
||||
if not bufnr then
|
||||
error("Could not find source buffer")
|
||||
end
|
||||
local bufdata = buf_to_symbols[bufnr]
|
||||
if not bufdata then
|
||||
bufdata = BufData.new(bufnr)
|
||||
|
@ -237,7 +239,7 @@ function M.has_received_data(bufnr)
|
|||
end
|
||||
|
||||
---Return true if the buffer has any symbols
|
||||
---@param bufnr integer
|
||||
---@param bufnr nil|integer
|
||||
---@return boolean
|
||||
function M.has_symbols(bufnr)
|
||||
local bufdata = M.get(bufnr)
|
||||
|
|
|
@ -3,10 +3,14 @@ local M = {}
|
|||
|
||||
local timers = {}
|
||||
|
||||
---@param aer_bufnr integer
|
||||
---@return boolean
|
||||
M.is_loading = function(aer_bufnr)
|
||||
return timers[aer_bufnr] ~= nil
|
||||
end
|
||||
|
||||
---@param aer_bufnr integer
|
||||
---@param is_loading boolean
|
||||
M.set_loading = function(aer_bufnr, is_loading)
|
||||
if is_loading then
|
||||
if timers[aer_bufnr] == nil then
|
||||
|
|
|
@ -6,8 +6,9 @@ local window = require("aerial.window")
|
|||
local M = {}
|
||||
|
||||
local function _get_current_lnum(winid)
|
||||
---@type nil|integer
|
||||
local bufnr = vim.api.nvim_get_current_buf()
|
||||
if data.has_symbols(bufnr) then
|
||||
if bufnr and data.has_symbols(bufnr) then
|
||||
local bufdata = data.get_or_create(bufnr)
|
||||
local cached_lnum = bufdata.positions[winid]
|
||||
if cached_lnum then
|
||||
|
@ -18,7 +19,7 @@ local function _get_current_lnum(winid)
|
|||
if util.is_aerial_buffer(bufnr) then
|
||||
bufnr = util.get_source_buffer()
|
||||
end
|
||||
if data.has_symbols(bufnr) then
|
||||
if bufnr and data.has_symbols(bufnr) then
|
||||
return window.get_position_in_win(bufnr, winid)
|
||||
else
|
||||
return nil
|
||||
|
@ -197,6 +198,9 @@ M.select = function(opts)
|
|||
return
|
||||
end
|
||||
local bufnr, _ = util.get_buffers()
|
||||
if not bufnr then
|
||||
error("Could not find source buffer")
|
||||
end
|
||||
M.select_symbol(item, winid, bufnr, opts)
|
||||
end
|
||||
|
||||
|
|
|
@ -78,7 +78,7 @@ M.update_aerial_buffer = function(buf)
|
|||
return
|
||||
end
|
||||
local bufnr, aer_bufnr = util.get_buffers(buf)
|
||||
if aer_bufnr == -1 or loading.is_loading(aer_bufnr) then
|
||||
if not bufnr or not aer_bufnr or loading.is_loading(aer_bufnr) then
|
||||
resize_all_wins(aer_bufnr)
|
||||
return
|
||||
end
|
||||
|
@ -203,7 +203,7 @@ M.update_highlights = function(buf)
|
|||
return
|
||||
end
|
||||
local bufnr, aer_bufnr = util.get_buffers(buf)
|
||||
if not data.has_symbols(bufnr) or aer_bufnr == -1 then
|
||||
if not bufnr or not data.has_symbols(bufnr) or not aer_bufnr then
|
||||
return
|
||||
end
|
||||
local bufdata = data.get_or_create(bufnr)
|
||||
|
@ -251,17 +251,19 @@ M.update_highlights = function(buf)
|
|||
M.clear_highlights(bufnr)
|
||||
local cursor = vim.api.nvim_win_get_cursor(0)
|
||||
local item = data.get_or_create(0):item(cursor[1])
|
||||
vim.api.nvim_buf_add_highlight(bufnr, ns, "AerialLine", item.lnum - 1, 0, -1)
|
||||
if item then
|
||||
vim.api.nvim_buf_add_highlight(bufnr, ns, "AerialLine", item.lnum - 1, 0, -1)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
---@param bufnr integer
|
||||
---@return integer
|
||||
M.clear_highlights = function(bufnr)
|
||||
if not vim.api.nvim_buf_is_valid(bufnr) then
|
||||
return
|
||||
end
|
||||
local ns = vim.api.nvim_create_namespace("aerial-line")
|
||||
vim.api.nvim_buf_clear_namespace(bufnr, ns, 0, -1)
|
||||
if vim.api.nvim_buf_is_valid(bufnr) then
|
||||
vim.api.nvim_buf_clear_namespace(bufnr, ns, 0, -1)
|
||||
end
|
||||
return ns
|
||||
end
|
||||
|
||||
|
|
|
@ -131,11 +131,11 @@ M.toggle = function(opts)
|
|||
end
|
||||
|
||||
---Set the collapse level of the symbol tree
|
||||
---@param bufnr integer
|
||||
---@param bufnr nil|integer
|
||||
---@param level integer 0 is all closed, use 99 to open all
|
||||
M.set_collapse_level = function(bufnr, level)
|
||||
bufnr = util.get_buffers(bufnr or 0)
|
||||
if not data.has_symbols(bufnr) then
|
||||
if not bufnr or not data.has_symbols(bufnr) then
|
||||
return
|
||||
end
|
||||
local bufdata = data.get_or_create(bufnr)
|
||||
|
@ -148,7 +148,7 @@ M.set_collapse_level = function(bufnr, level)
|
|||
end, vim.api.nvim_list_wins())
|
||||
else
|
||||
local source_win = util.get_winids(0)
|
||||
if vim.api.nvim_win_get_buf(source_win) == bufnr then
|
||||
if source_win and vim.api.nvim_win_get_buf(source_win) == bufnr then
|
||||
wins = { source_win }
|
||||
else
|
||||
wins = util.get_fixed_wins(bufnr)
|
||||
|
|
|
@ -141,6 +141,9 @@ M.get_source_win = function(winid)
|
|||
return M.get_winid_from_var(winid or 0, "source_win")
|
||||
end
|
||||
|
||||
---@param bufnr nil|integer
|
||||
---@return nil|integer Source buffer
|
||||
---@return nil|integer Aerial buffer
|
||||
M.get_buffers = function(bufnr)
|
||||
if bufnr == nil or bufnr == 0 then
|
||||
bufnr = vim.api.nvim_get_current_buf()
|
||||
|
@ -152,18 +155,25 @@ M.get_buffers = function(bufnr)
|
|||
end
|
||||
end
|
||||
|
||||
---@param bufnr nil|integer
|
||||
---@return nil|integer
|
||||
M.get_aerial_buffer = function(bufnr)
|
||||
return M.get_buffer_from_var(bufnr or 0, "aerial_buffer")
|
||||
end
|
||||
|
||||
---@param bufnr nil|integer
|
||||
---@return nil|integer
|
||||
M.get_source_buffer = function(bufnr)
|
||||
return M.get_buffer_from_var(bufnr or 0, "source_buffer")
|
||||
end
|
||||
|
||||
---@param bufnr integer
|
||||
---@param varname string
|
||||
---@return nil|integer
|
||||
M.get_buffer_from_var = function(bufnr, varname)
|
||||
local status, result_bufnr = pcall(vim.api.nvim_buf_get_var, bufnr, varname)
|
||||
if not status or result_bufnr == nil or not vim.api.nvim_buf_is_valid(result_bufnr) then
|
||||
return -1
|
||||
return nil
|
||||
end
|
||||
return result_bufnr
|
||||
end
|
||||
|
|
|
@ -112,7 +112,7 @@ local function create_aerial_window(bufnr, aer_bufnr, direction, existing_win)
|
|||
error("Expected direction to be 'left', 'right', or 'float'")
|
||||
end
|
||||
|
||||
if aer_bufnr == -1 then
|
||||
if not aer_bufnr then
|
||||
aer_bufnr = create_aerial_buffer(bufnr)
|
||||
end
|
||||
|
||||
|
@ -183,7 +183,7 @@ M.open_aerial_in_win = function(src_bufnr, src_winid, aer_winid)
|
|||
vim.api.nvim_win_set_var(src_winid, "aerial_win", aer_winid)
|
||||
return
|
||||
end
|
||||
if aer_bufnr == -1 then
|
||||
if not aer_bufnr then
|
||||
aer_bufnr = create_aerial_buffer(src_bufnr)
|
||||
end
|
||||
local my_winid = vim.api.nvim_get_current_win()
|
||||
|
@ -200,7 +200,7 @@ end
|
|||
---@return integer|nil
|
||||
local function get_aerial_win_for_buf(bufnr)
|
||||
local aer_bufnr = util.get_aerial_buffer(bufnr)
|
||||
if aer_bufnr ~= -1 then
|
||||
if aer_bufnr then
|
||||
return util.buf_first_win_in_tabpage(aer_bufnr)
|
||||
end
|
||||
end
|
||||
|
@ -462,7 +462,7 @@ M.update_position = function(winids, last_focused_win)
|
|||
end
|
||||
local win_bufnr = vim.api.nvim_win_get_buf(winids[1])
|
||||
local bufnr = util.get_buffers(win_bufnr)
|
||||
if not data.has_symbols(bufnr) then
|
||||
if not bufnr or not data.has_symbols(bufnr) then
|
||||
return
|
||||
end
|
||||
if util.is_aerial_buffer(win_bufnr) then
|
||||
|
@ -498,9 +498,10 @@ M.update_position = function(winids, last_focused_win)
|
|||
end
|
||||
end
|
||||
|
||||
---@param buffer nil|integer
|
||||
M.center_symbol_in_view = function(buffer)
|
||||
local bufnr, aer_bufnr = util.get_buffers(buffer)
|
||||
if not data.has_symbols(bufnr) then
|
||||
if not bufnr or not data.has_symbols(bufnr) or not aer_bufnr then
|
||||
return
|
||||
end
|
||||
local bufdata = data.get_or_create(bufnr)
|
||||
|
@ -512,9 +513,11 @@ M.center_symbol_in_view = function(buffer)
|
|||
local max_topline = vim.api.nvim_buf_line_count(aer_bufnr) - height
|
||||
local topline = math.max(1, math.min(max_topline, lnum - math.floor(height / 2)))
|
||||
local aerial_win = util.buf_first_win_in_tabpage(aer_bufnr)
|
||||
vim.api.nvim_win_call(aerial_win, function()
|
||||
vim.fn.winrestview({ lnum = lnum, topline = topline })
|
||||
end)
|
||||
if aerial_win then
|
||||
vim.api.nvim_win_call(aerial_win, function()
|
||||
vim.fn.winrestview({ lnum = lnum, topline = topline })
|
||||
end)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -5,14 +5,28 @@ M.on_load = function() end
|
|||
|
||||
M.is_win_supported = function(winid, bufnr)
|
||||
local util = require("aerial.util")
|
||||
return util.is_aerial_buffer(bufnr)
|
||||
if not util.is_aerial_buffer(bufnr) then
|
||||
return false
|
||||
end
|
||||
local source_win = util.get_source_win(winid)
|
||||
local source_buf = util.get_source_buffer(bufnr)
|
||||
return source_win
|
||||
and vim.api.nvim_win_is_valid(source_win)
|
||||
and source_buf
|
||||
and vim.api.nvim_buf_is_valid(source_buf)
|
||||
end
|
||||
|
||||
M.save_win = function(winid)
|
||||
local util = require("aerial.util")
|
||||
local source_win = util.get_source_win(winid)
|
||||
if not source_win then
|
||||
error("Source winid is nil")
|
||||
end
|
||||
local rel_nr = vim.api.nvim_win_get_number(source_win) - vim.api.nvim_win_get_number(winid)
|
||||
local bufnr = util.get_source_buffer(vim.api.nvim_win_get_buf(winid))
|
||||
if not bufnr or not vim.api.nvim_buf_is_valid(bufnr) then
|
||||
error("Source buffer is nil")
|
||||
end
|
||||
return {
|
||||
rel_nr = rel_nr,
|
||||
bufname = vim.api.nvim_buf_get_name(bufnr),
|
||||
|
|
Loading…
Reference in a new issue