Skip to content

Commit b1f4980

Browse files
committed
feat: add type annotations for plenary.window
1 parent 67cf500 commit b1f4980

File tree

4 files changed

+97
-1
lines changed

4 files changed

+97
-1
lines changed

lua/plenary/init.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
---@field scandir PlenaryScandir
1919
---@field strings PlenaryStrings
2020
---@field tbl PlenaryTbl
21+
---@field window PlenaryWindow
2122
local plenary = setmetatable({}, {
2223
__index = function(t, k)
2324
local ok, val = pcall(require, string.format("plenary.%s", k))

lua/plenary/window/border.lua

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,53 @@
11
local strings = require "plenary.strings"
22

3+
---@class PlenaryWindowBorder
4+
---@field bufnr integer
5+
---@field content_win_id integer
6+
---@field content_win_options vim.api.keyset.win_config
7+
---@field contents string[]
8+
---@field win_id integer
9+
---@field private _border_win_options PlenaryWindowBorderBorderOptions
310
local Border = {}
411

12+
---@class PlenaryWindowBorderBorderOptions
13+
---@field border_thickness PlenaryWindowBorderBorderThickness
14+
---@field topleft string
15+
---@field topright string
16+
---@field top string
17+
---@field left string
18+
---@field right string
19+
---@field botleft string
20+
---@field botright string
21+
---@field bot string
22+
---@field focusable? boolean
23+
---@field highlight? string
24+
---@field title? string|PlenaryWindowBorderTitles
25+
---@field titlehighlight? string
26+
27+
---@class PlenaryWindowBorderBorderThickness
28+
---@field top integer
29+
---@field right integer
30+
---@field bot integer
31+
---@field left integer
32+
33+
---@alias PlenaryWindowBorderPos "NW"|"N"|"NE"|"SW"|"S"|"SE"
34+
---@alias PlenaryWindowBorderRanges { [1]: integer, [2]: integer, [3]: integer? }[]
35+
---@alias PlenaryWindowBorderTitles { text: string, pos: PlenaryWindowBorderPos }[]
36+
537
Border.__index = Border
638

39+
---@type PlenaryWindowBorderBorderThickness
740
Border._default_thickness = {
841
top = 1,
942
right = 1,
1043
bot = 1,
1144
left = 1,
1245
}
1346

47+
---@param title_pos string
48+
---@param title_len integer
49+
---@param total_width integer
50+
---@return integer
1451
local calc_left_start = function(title_pos, title_len, total_width)
1552
if string.find(title_pos, "W") then
1653
return 0
@@ -21,6 +58,15 @@ local calc_left_start = function(title_pos, title_len, total_width)
2158
end
2259
end
2360

61+
---comment
62+
---@param title string
63+
---@param pos PlenaryWindowBorderPos
64+
---@param width integer
65+
---@param left_char string
66+
---@param mid_char string
67+
---@param right_char string
68+
---@return string horizontal_line
69+
---@return PlenaryWindowBorderRanges ranges
2470
local create_horizontal_line = function(title, pos, width, left_char, mid_char, right_char)
2571
local title_len
2672
if title == "" then
@@ -46,6 +92,7 @@ local create_horizontal_line = function(title, pos, width, left_char, mid_char,
4692
string.rep(mid_char, width - title_len - left_start),
4793
right_char
4894
)
95+
---@type PlenaryWindowBorderRanges
4996
local ranges = {}
5097
if title_len ~= 0 then
5198
-- Need to calculate again due to multi-byte characters
@@ -55,6 +102,11 @@ local create_horizontal_line = function(title, pos, width, left_char, mid_char,
55102
return horizontal_line, ranges
56103
end
57104

105+
---@param content_win_id integer
106+
---@param content_win_options vim.api.keyset.win_config
107+
---@param border_win_options PlenaryWindowBorderBorderOptions
108+
---@return string[] border_lines
109+
---@return PlenaryWindowBorderRanges ranges
58110
function Border._create_lines(content_win_id, content_win_options, border_win_options)
59111
local content_pos = vim.api.nvim_win_get_position(content_win_id)
60112
local content_height = vim.api.nvim_win_get_height(content_win_id)
@@ -71,15 +123,17 @@ function Border._create_lines(content_win_id, content_win_options, border_win_op
71123
border_win_options.border_thickness.left = left_enabled and 1 or 0
72124
border_win_options.border_thickness.right = right_enabled and 1 or 0
73125

126+
---@type string[]
74127
local border_lines = {}
128+
---@type PlenaryWindowBorderRanges
75129
local ranges = {}
76130

77131
-- border_win_options.title should have be a list with entries of the
78132
-- form: { pos = foo, text = bar }.
79133
-- pos can take values in { "NW", "N", "NE", "SW", "S", "SE" }
80134
local titles = type(border_win_options.title) == "string" and { { pos = "N", text = border_win_options.title } }
81135
or border_win_options.title
82-
or {}
136+
or {} --[[@as PlenaryWindowBorderTitles]]
83137

84138
local topline = nil
85139
local topleft = (left_enabled and border_win_options.topleft) or ""
@@ -164,6 +218,9 @@ function Border._create_lines(content_win_id, content_win_options, border_win_op
164218
return border_lines, ranges
165219
end
166220

221+
---@param bufnr integer
222+
---@param ranges? PlenaryWindowBorderRanges
223+
---@param hl? string
167224
local set_title_highlights = function(bufnr, ranges, hl)
168225
-- Check if both `hl` and `ranges` are provided, and `ranges` is not the empty table.
169226
if hl and ranges and next(ranges) then
@@ -173,6 +230,8 @@ local set_title_highlights = function(bufnr, ranges, hl)
173230
end
174231
end
175232

233+
---@param new_title string
234+
---@param pos string
176235
function Border:change_title(new_title, pos)
177236
if self._border_win_options.title == new_title then
178237
return
@@ -195,6 +254,9 @@ end
195254

196255
-- Updates characters for border lines, and returns nvim_win_config
197256
-- (generally used in conjunction with `move` or `new`)
257+
---@param content_win_options vim.api.keyset.win_config
258+
---@param border_win_options PlenaryWindowBorderBorderOptions
259+
---@return vim.api.keyset.win_config
198260
function Border:__align_calc_config(content_win_options, border_win_options)
199261
border_win_options = vim.tbl_deep_extend("keep", border_win_options, {
200262
border_thickness = Border._default_thickness,
@@ -238,6 +300,8 @@ end
238300
-- Sets the size and position of the given Border.
239301
-- Can be used to create a new window (with `create_window = true`)
240302
-- or change an existing one
303+
---@param content_win_options vim.api.keyset.win_config
304+
---@param border_win_options PlenaryWindowBorderBorderOptions
241305
function Border:move(content_win_options, border_win_options)
242306
-- Update lines in border buffer, and get config for border window
243307
local nvim_win_config = self:__align_calc_config(content_win_options, border_win_options)
@@ -248,6 +312,11 @@ function Border:move(content_win_options, border_win_options)
248312
set_title_highlights(self.bufnr, self.title_ranges, self._border_win_options.titlehighlight)
249313
end
250314

315+
---@param content_bufnr integer
316+
---@param content_win_id integer
317+
---@param content_win_options vim.api.keyset.win_config
318+
---@param border_win_options PlenaryWindowBorderBorderOptions
319+
---@return PlenaryWindowBorder
251320
function Border:new(content_bufnr, content_win_id, content_win_options, border_win_options)
252321
assert(type(content_win_id) == "number", "Must supply a valid win_id. It's possible you forgot to call with ':'")
253322

lua/plenary/window/float.lua

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ local tbl = require "plenary.tbl"
33

44
_AssociatedBufs = {}
55

6+
---@param bufnr integer
67
local clear_buf_on_leave = function(bufnr)
78
vim.cmd(
89
string.format(
@@ -13,13 +14,22 @@ local clear_buf_on_leave = function(bufnr)
1314
)
1415
end
1516

17+
---@class PlenaryWindowFloat
18+
---@field default_options PlenaryWindowFloatOptions
1619
local win_float = {}
1720

21+
---@class PlenaryWindowFloatOptions
22+
---@field bufnr? integer
23+
---@field percentage float
24+
---@field winblend float
25+
1826
win_float.default_options = {
1927
winblend = 15,
2028
percentage = 0.9,
2129
}
2230

31+
---@param options? PlenaryWindowFloatOptions
32+
---@return vim.api.keyset.win_config
2333
function win_float.default_opts(options)
2434
options = tbl.apply_defaults(options, win_float.default_options)
2535

@@ -41,6 +51,8 @@ function win_float.default_opts(options)
4151
return opts
4252
end
4353

54+
---@param options? PlenaryWindowFloatOptions
55+
---@return { bufnr: integer, win_id: integer }
4456
function win_float.centered(options)
4557
options = tbl.apply_defaults(options, win_float.default_options)
4658

@@ -60,6 +72,9 @@ function win_float.centered(options)
6072
}
6173
end
6274

75+
---@param top_text string[]
76+
---@param options? PlenaryWindowFloatOptions
77+
---@return { bufnr: integer, win_id: integer, minor_bufnr: integer, minor_win_id: integer }
6378
function win_float.centered_with_top_win(top_text, options)
6479
options = tbl.apply_defaults(options, win_float.default_options)
6580

@@ -135,6 +150,11 @@ end
135150
-- If table, first index should be start, second_index should be end
136151
--@param win_opts Table
137152
--@param border_opts Table
153+
---@param col_range integer
154+
---@param row_range integer
155+
---@param win_opts? PlenaryWindowFloatOptions
156+
---@param border_opts? PlenaryWindowBorderBorderOptions
157+
---@return table
138158
function win_float.percentage_range_window(col_range, row_range, win_opts, border_opts)
139159
win_opts = tbl.apply_defaults(win_opts, win_float.default_options)
140160

@@ -195,6 +215,7 @@ function win_float.percentage_range_window(col_range, row_range, win_opts, borde
195215
}
196216
end
197217

218+
---@param bufnr integer
198219
function win_float.clear(bufnr)
199220
if _AssociatedBufs[bufnr] == nil then
200221
return

lua/plenary/window/init.lua

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1+
---@class PlenaryWindow
12
local window = {}
23

4+
---@param win_id integer
5+
---@param force? boolean
36
window.try_close = function(win_id, force)
47
if force == nil then
58
force = true
@@ -8,6 +11,8 @@ window.try_close = function(win_id, force)
811
pcall(vim.api.nvim_win_close, win_id, force)
912
end
1013

14+
---@param parent_win_id integer
15+
---@param child_win_id integer
1116
window.close_related_win = function(parent_win_id, child_win_id)
1217
window.try_close(parent_win_id, true)
1318
window.try_close(child_win_id, true)

0 commit comments

Comments
 (0)