refactor: utility methods return nilable integer instead of -1 sentinel value

This commit is contained in:
Steven Arcangeli 2023-05-03 22:25:23 -07:00
parent 72813e6020
commit bea821469c
10 changed files with 74 additions and 30 deletions

View file

@ -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

View file

@ -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)

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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),