refactor(Sidebar): Introduce Utils.is_valid_container to simplify container checks (#1882)

This commit is contained in:
aniaan
2025-04-16 14:18:49 +08:00
committed by GitHub
parent 54a1df28b6
commit dd83343e53
2 changed files with 40 additions and 76 deletions

View File

@@ -218,18 +218,10 @@ function Sidebar:focus()
end end
function Sidebar:focus_input() function Sidebar:focus_input()
if self.input_container and self.input_container.winid and api.nvim_win_is_valid(self.input_container.winid) then if Utils.is_valid_container(self.input_container, true) then api.nvim_set_current_win(self.input_container.winid) end
api.nvim_set_current_win(self.input_container.winid)
end
end end
function Sidebar:is_open() function Sidebar:is_open() return Utils.is_valid_container(self.result_container, true) end
return self.result_container
and self.result_container.bufnr
and api.nvim_buf_is_valid(self.result_container.bufnr)
and self.result_container.winid
and api.nvim_win_is_valid(self.result_container.winid)
end
function Sidebar:in_code_win() return self.code.winid == api.nvim_get_current_win() end function Sidebar:in_code_win() return self.code.winid == api.nvim_get_current_win() end
@@ -1038,7 +1030,7 @@ function Sidebar:edit_user_request()
local block = self:get_current_user_request_block() local block = self:get_current_user_request_block()
if not block then return end if not block then return end
if self.input_container and self.input_container.bufnr and api.nvim_buf_is_valid(self.input_container.bufnr) then if Utils.is_valid_container(self.input_container) then
local lines = vim.split(block.content, "\n") local lines = vim.split(block.content, "\n")
api.nvim_buf_set_lines(self.input_container.bufnr, 0, -1, false, lines) api.nvim_buf_set_lines(self.input_container.bufnr, 0, -1, false, lines)
api.nvim_set_current_win(self.input_container.winid) api.nvim_set_current_win(self.input_container.winid)
@@ -1529,13 +1521,7 @@ function Sidebar:render_header(winid, bufnr, header_text, hl, reverse_hl)
end end
function Sidebar:render_result() function Sidebar:render_result()
if if not Utils.is_valid_container(self.result_container) then return end
not self.result_container
or not self.result_container.bufnr
or not api.nvim_buf_is_valid(self.result_container.bufnr)
then
return
end
local header_text = Utils.icon("󰭻 ") .. "Avante" local header_text = Utils.icon("󰭻 ") .. "Avante"
self:render_header( self:render_header(
self.result_container.winid, self.result_container.winid,
@@ -1549,13 +1535,7 @@ end
---@param ask? boolean ---@param ask? boolean
function Sidebar:render_input(ask) function Sidebar:render_input(ask)
if ask == nil then ask = true end if ask == nil then ask = true end
if if not Utils.is_valid_container(self.input_container) then return end
not self.input_container
or not self.input_container.bufnr
or not api.nvim_buf_is_valid(self.input_container.bufnr)
then
return
end
local header_text = string.format( local header_text = string.format(
"%s%s (" .. Config.mappings.sidebar.switch_windows .. ": switch focus)", "%s%s (" .. Config.mappings.sidebar.switch_windows .. ": switch focus)",
@@ -1583,13 +1563,7 @@ function Sidebar:render_input(ask)
end end
function Sidebar:render_selected_code() function Sidebar:render_selected_code()
if if not Utils.is_valid_container(self.selected_code_container) then return end
not self.selected_code_container
or not self.selected_code_container.bufnr
or not api.nvim_buf_is_valid(self.selected_code_container.bufnr)
then
return
end
local selected_code_lines_count = 0 local selected_code_lines_count = 0
local selected_code_max_lines_count = 12 local selected_code_max_lines_count = 12
@@ -1719,7 +1693,7 @@ function Sidebar:bind_sidebar_keys(codeblocks)
end end
function Sidebar:unbind_sidebar_keys() function Sidebar:unbind_sidebar_keys()
if self.result_container and self.result_container.bufnr and api.nvim_buf_is_valid(self.result_container.bufnr) then if Utils.is_valid_container(self.result_container) then
pcall(vim.keymap.del, "n", Config.mappings.sidebar.apply_all, { buffer = self.result_container.bufnr }) pcall(vim.keymap.del, "n", Config.mappings.sidebar.apply_all, { buffer = self.result_container.bufnr })
pcall(vim.keymap.del, "n", Config.mappings.jump.next, { buffer = self.result_container.bufnr }) pcall(vim.keymap.del, "n", Config.mappings.jump.next, { buffer = self.result_container.bufnr })
pcall(vim.keymap.del, "n", Config.mappings.jump.prev, { buffer = self.result_container.bufnr }) pcall(vim.keymap.del, "n", Config.mappings.jump.prev, { buffer = self.result_container.bufnr })
@@ -1857,13 +1831,7 @@ function Sidebar:on_mount(opts)
group = self.augroup, group = self.augroup,
pattern = VIEW_BUFFER_UPDATED_PATTERN, pattern = VIEW_BUFFER_UPDATED_PATTERN,
callback = function() callback = function()
if if not Utils.is_valid_container(self.result_container) then return end
not self.result_container
or not self.result_container.bufnr
or not api.nvim_buf_is_valid(self.result_container.bufnr)
then
return
end
codeblocks = parse_codeblocks(self.result_container.bufnr, current_filepath, current_filetype) codeblocks = parse_codeblocks(self.result_container.bufnr, current_filepath, current_filetype)
self:bind_sidebar_keys(codeblocks) self:bind_sidebar_keys(codeblocks)
end, end,
@@ -1900,11 +1868,7 @@ function Sidebar:on_mount(opts)
callback = function() callback = function()
if Config.behaviour.auto_focus_sidebar then if Config.behaviour.auto_focus_sidebar then
self:focus() self:focus()
if if Utils.is_valid_container(self.input_container, true) then
self.input_container
and self.input_container.winid
and api.nvim_win_is_valid(self.input_container.winid)
then
api.nvim_set_current_win(self.input_container.winid) api.nvim_set_current_win(self.input_container.winid)
vim.defer_fn(function() vim.defer_fn(function()
if Config.windows.ask.start_insert then vim.cmd("noautocmd startinsert!") end if Config.windows.ask.start_insert then vim.cmd("noautocmd startinsert!") end
@@ -2102,13 +2066,7 @@ function Sidebar:update_content(content, opts)
end end
vim.schedule(function() vim.schedule(function()
if if not Utils.is_valid_container(self.result_container) then return end
not self.result_container
or not self.result_container.bufnr
or not api.nvim_buf_is_valid(self.result_container.bufnr)
then
return
end
Utils.unlock_buf(self.result_container.bufnr) Utils.unlock_buf(self.result_container.bufnr)
if opts.backspace ~= nil and opts.backspace > 0 then if opts.backspace ~= nil and opts.backspace > 0 then
delete_last_n_chars(self.result_container.bufnr, opts.backspace) delete_last_n_chars(self.result_container.bufnr, opts.backspace)
@@ -2123,13 +2081,7 @@ function Sidebar:update_content(content, opts)
end) end)
else else
vim.defer_fn(function() vim.defer_fn(function()
if if not Utils.is_valid_container(self.result_container) then return end
not self.result_container
or not self.result_container.bufnr
or not api.nvim_buf_is_valid(self.result_container.bufnr)
then
return
end
local lines = vim.split(content, "\n") local lines = vim.split(content, "\n")
Utils.unlock_buf(self.result_container.bufnr) Utils.unlock_buf(self.result_container.bufnr)
Utils.update_buffer_content(self.result_container.bufnr, lines) Utils.update_buffer_content(self.result_container.bufnr, lines)
@@ -2753,12 +2705,7 @@ function Sidebar:create_input_container(opts)
) )
vim.defer_fn(function() vim.defer_fn(function()
if if Utils.is_valid_container(self.result_container, true) and Config.behaviour.jump_result_buffer_on_finish then
self.result_container
and self.result_container.winid
and api.nvim_win_is_valid(self.result_container.winid)
and Config.behaviour.jump_result_buffer_on_finish
then
api.nvim_set_current_win(self.result_container.winid) api.nvim_set_current_win(self.result_container.winid)
end end
if Config.behaviour.auto_apply_diff_after_generation then self:apply(false) end if Config.behaviour.auto_apply_diff_after_generation then self:apply(false) end
@@ -2862,13 +2809,7 @@ function Sidebar:create_input_container(opts)
Utils.warn("Sending message to fast!, API key is not yet set", { title = "Avante" }) Utils.warn("Sending message to fast!, API key is not yet set", { title = "Avante" })
return return
end end
if if not Utils.is_valid_container(self.input_container) then return end
not self.input_container
or not self.input_container.bufnr
or not api.nvim_buf_is_valid(self.input_container.bufnr)
then
return
end
local lines = api.nvim_buf_get_lines(self.input_container.bufnr, 0, -1, false) local lines = api.nvim_buf_get_lines(self.input_container.bufnr, 0, -1, false)
local request = table.concat(lines, "\n") local request = table.concat(lines, "\n")
if request == "" then return end if request == "" then return end
@@ -3197,10 +3138,7 @@ function Sidebar:get_selected_files_container_height()
end end
function Sidebar:adjust_selected_files_container_layout() function Sidebar:adjust_selected_files_container_layout()
if not self.selected_files_container then return end if not Utils.is_valid_container(self.selected_files_container, true) then return end
if not self.selected_files_container.winid or not api.nvim_win_is_valid(self.selected_files_container.winid) then
return
end
local win_height = self:get_selected_files_container_height() local win_height = self:get_selected_files_container_height()
api.nvim_win_set_height(self.selected_files_container.winid, win_height) api.nvim_win_set_height(self.selected_files_container.winid, win_height)

View File

@@ -304,6 +304,32 @@ function M.is_valid_buf(bufnr)
return #vim.bo[bufnr].buftype == 0 and vim.bo[bufnr].modifiable return #vim.bo[bufnr].buftype == 0 and vim.bo[bufnr].modifiable
end end
--- Check if a NUI container is valid:
--- 1. Container must exist
--- 2. Container must have a valid buffer number
--- 3. Container must have a valid window ID (optional, based on check_winid parameter)
--- Always returns a boolean value
---@param container NuiSplit | nil
---@param check_winid boolean? Whether to check window validity, defaults to false
---@return boolean
function M.is_valid_container(container, check_winid)
-- Default check_winid to false if not specified
if check_winid == nil then check_winid = false end
-- First check if container exists
if container == nil then return false end
-- Check buffer validity
if container.bufnr == nil or not api.nvim_buf_is_valid(container.bufnr) then return false end
-- Check window validity if requested
if check_winid then
if container.winid == nil or not api.nvim_win_is_valid(container.winid) then return false end
end
return true
end
---@param name string? ---@param name string?
---@return table ---@return table
function M.get_hl(name) function M.get_hl(name)