feat(lsp.util): refactor get_border_size()

This commit is contained in:
Lewis Russell 2024-10-16 12:49:14 +01:00
parent d44d36b8ff
commit 1944c0d610

View File

@ -21,85 +21,73 @@ local default_border = {
{ ' ', 'NormalFloat' }, { ' ', 'NormalFloat' },
} }
--- @param border string|(string|[string,string])[]
local function border_error(border)
error(
string.format(
'invalid floating preview border: %s. :help vim.api.nvim_open_win()',
vim.inspect(border)
),
2
)
end
local border_size = {
none = { 0, 0 },
single = { 2, 2 },
double = { 2, 2 },
rounded = { 2, 2 },
solid = { 2, 2 },
shadow = { 1, 1 },
}
--- Check the border given by opts or the default border for the additional --- Check the border given by opts or the default border for the additional
--- size it adds to a float. --- size it adds to a float.
---@param opts? {border:string|(string|[string,string])[]} --- @param opts? {border:string|(string|[string,string])[]}
---@return {height:integer,width:integer} # size of border in the form of { height = height, width = width } --- @return integer height
--- @return integer width
local function get_border_size(opts) local function get_border_size(opts)
local border = opts and opts.border or default_border local border = opts and opts.border or default_border
local height = 0
local width = 0
if type(border) == 'string' then if type(border) == 'string' then
local border_size = { if not border_size[border] then
none = { 0, 0 }, border_error(border)
single = { 2, 2 },
double = { 2, 2 },
rounded = { 2, 2 },
solid = { 2, 2 },
shadow = { 1, 1 },
}
if border_size[border] == nil then
error(
string.format(
'invalid floating preview border: %s. :help vim.api.nvim_open_win()',
vim.inspect(border)
)
)
end end
height, width = unpack(border_size[border]) return unpack(border_size[border])
else
if 8 % #border ~= 0 then
error(
string.format(
'invalid floating preview border: %s. :help vim.api.nvim_open_win()',
vim.inspect(border)
)
)
end
--- @param id integer
local function border_width(id)
id = (id - 1) % #border + 1
local e = border[id]
if type(e) == 'table' then
-- border specified as a table of <character, highlight group>
return vim.fn.strdisplaywidth(e[1])
elseif type(e) == 'string' then
-- border specified as a list of border characters
return vim.fn.strdisplaywidth(e)
end
error(
string.format(
'invalid floating preview border: %s. :help vim.api.nvim_open_win()',
vim.inspect(border)
)
)
end
--- @param id integer
local function border_height(id)
id = (id - 1) % #border + 1
local e = border[id]
if type(e) == 'table' then
-- border specified as a table of <character, highlight group>
return #e[1] > 0 and 1 or 0
elseif type(e) == 'string' then
-- border specified as a list of border characters
return #e > 0 and 1 or 0
end
error(
string.format(
'invalid floating preview border: %s. :help vim.api.nvim_open_win()',
vim.inspect(border)
)
)
end
height = height + border_height(2) -- top
height = height + border_height(6) -- bottom
width = width + border_width(4) -- right
width = width + border_width(8) -- left
end end
return { height = height, width = width } if 8 % #border ~= 0 then
border_error(border)
end
--- @param id integer
--- @return string
local function elem(id)
id = (id - 1) % #border + 1
local e = border[id]
if type(e) == 'table' then
-- border specified as a table of <character, highlight group>
return e[1]
elseif type(e) == 'string' then
-- border specified as a list of border characters
return e
end
--- @diagnostic disable-next-line:missing-return
border_error(border)
end
--- @param e string
local function border_height(e)
return #e > 0 and 1 or 0
end
local top, bottom = elem(2), elem(6)
local height = border_height(top) + border_height(bottom)
local right, left = elem(4), elem(8)
local width = vim.fn.strdisplaywidth(right) + vim.fn.strdisplaywidth(left)
return height, width
end end
--- Splits string at newlines, optionally removing unwanted blank lines. --- Splits string at newlines, optionally removing unwanted blank lines.
@ -930,7 +918,7 @@ function M.make_floating_popup_options(width, height, opts)
anchor_below = lines_below > lines_above anchor_below = lines_below > lines_above
end end
local border_height = get_border_size(opts).height local border_height = get_border_size(opts)
local row, col --- @type integer?, integer? local row, col --- @type integer?, integer?
if anchor_below then if anchor_below then
anchor = anchor .. 'N' anchor = anchor .. 'N'
@ -1495,7 +1483,7 @@ function M._make_floating_popup_size(contents, opts)
end end
end end
local border_width = get_border_size(opts).width local _, border_width = get_border_size(opts)
local screen_width = api.nvim_win_get_width(0) local screen_width = api.nvim_win_get_width(0)
width = math.min(width, screen_width) width = math.min(width, screen_width)