Skip to content

Commit 5037349

Browse files
committed
feat: add type annotations for plenary.log
1 parent 78dc5d0 commit 5037349

File tree

2 files changed

+86
-35
lines changed

2 files changed

+86
-35
lines changed

lua/plenary/init.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
---@field functional PlenaryFunctional
88
---@field job PlenaryJob
99
---@field json PlenaryJson
10+
---@field log PlenaryLog
1011
---@field path PlenaryPath
1112
---@field scandir PlenaryScandir
1213
---@field tbl PlenaryTbl

lua/plenary/log.lua

Lines changed: 85 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -9,38 +9,54 @@
99

1010
local Path = require "plenary.path"
1111

12+
---@type boolean|string|vim.NIL
1213
local p_debug = vim.fn.getenv "DEBUG_PLENARY"
1314
if p_debug == vim.NIL then
1415
p_debug = false
1516
end
1617

18+
---@alias PlenaryLogLevel "trace"|"debug"|"info"|"warn"|"error"|"fatal"
19+
20+
-- luacheck: push ignore 631
21+
22+
---Adjust content as needed, but must keep function parameters to be filled
23+
---by library code.
24+
---* param is_console boolean If output is for console or log file.
25+
---* param mode_name string Level configuration 'modes' field 'name'
26+
---* param src_path string Path to source file given by debug.info.source
27+
---* param src_line integer Line into source file given by debug.info.currentline
28+
---* param msg string Message, which is later on escaped, if needed.
29+
---@alias PlenaryLogFmtMsg fun(is_console: boolean, mode_name: string, src_path: string, src_line: integer, msg: string): string
30+
31+
-- luacheck: pop
32+
33+
---@class PlenaryLogLevelConfig
34+
---@field name PlenaryLogLevel
35+
---@field hl string highight name for console.
36+
37+
---@class PlenaryLogConfig
38+
---@field plugin? string Name of the plugin. Prepended to log messages. (default: `plenary`)
39+
---@field use_console? '"async"'|"sync"|false Should print the output to neovim. (default: `"async"`)
40+
---@field highlights? boolean Should highlighting be used in console (using echohl). (default: `true`)
41+
---@field info_level? integer Level of function call stack. (default: `2`)
42+
---@field use_file? boolean Should write to a file. Default logging file is `stdpath("cache")/plugin`. (default: `true`)
43+
---@field outfile? string Output file has precedence over plugin, if not nil and use_file == true. (default: `nil`)
44+
---@field use_quickfix? boolean Should write to the quickfix list. (default: `false`)
45+
---@field level? PlenaryLogLevel Any messages above this level will be logged. (default: `"info"` or `"debug"`)
46+
---@field modes? PlenaryLogLevelConfig[] Level configuration.
47+
---@field float_precision? float Can limit the number of decimals displayed for floats. (default: `0.01`)
48+
---@field fmt_msg? PlenaryLogFmtMsg
49+
1750
-- User configuration section
51+
---@type PlenaryLogConfig
1852
local default_config = {
19-
-- Name of the plugin. Prepended to log messages.
2053
plugin = "plenary",
21-
22-
-- Should print the output to neovim while running.
23-
-- values: 'sync','async',false
2454
use_console = "async",
25-
26-
-- Should highlighting be used in console (using echohl).
2755
highlights = true,
28-
29-
-- Should write to a file.
30-
-- Default output for logging file is `stdpath("cache")/plugin`.
3156
use_file = true,
32-
33-
-- Output file has precedence over plugin, if not nil.
34-
-- Used for the logging file, if not nil and use_file == true.
3557
outfile = nil,
36-
37-
-- Should write to the quickfix list.
3858
use_quickfix = false,
39-
40-
-- Any messages above this level will be logged.
4159
level = p_debug and "debug" or "info",
42-
43-
-- Level configuration.
4460
modes = {
4561
{ name = "trace", hl = "Comment" },
4662
{ name = "debug", hl = "Comment" },
@@ -49,17 +65,7 @@ local default_config = {
4965
{ name = "error", hl = "ErrorMsg" },
5066
{ name = "fatal", hl = "ErrorMsg" },
5167
},
52-
53-
-- Can limit the number of decimals displayed for floats.
5468
float_precision = 0.01,
55-
56-
-- Adjust content as needed, but must keep function parameters to be filled
57-
-- by library code.
58-
---@param is_console boolean If output is for console or log file.
59-
---@param mode_name string Level configuration 'modes' field 'name'
60-
---@param src_path string Path to source file given by debug.info.source
61-
---@param src_line integer Line into source file given by debug.info.currentline
62-
---@param msg string Message, which is later on escaped, if needed.
6369
fmt_msg = function(is_console, mode_name, src_path, src_line, msg)
6470
local nameupper = mode_name:upper()
6571
local lineinfo = src_path .. ":" .. src_line
@@ -72,36 +78,72 @@ local default_config = {
7278
}
7379

7480
-- {{{ NO NEED TO CHANGE
81+
82+
---@class PlenaryLog
83+
---@field trace fun(...) Write TRACE log.
84+
---@field debug fun(...) Write DEBUG log.
85+
---@field info fun(...) Write INFO log.
86+
---@field warn fun(...) Write WARN log.
87+
---@field error fun(...) Write ERROR log.
88+
---@field fatal fun(...) Write FATAL log.
89+
---@field fmt_trace fun(fmt: string, ...: any) Write TRACE log with formatting by string.format.
90+
---@field fmt_debug fun(fmt: string, ...: any) Write DEBUG log with formatting by string.format.
91+
---@field fmt_info fun(fmt: string, ...: any) Write INFO log with formatting by string.format.
92+
---@field fmt_warn fun(fmt: string, ...: any) Write WARN log with formatting by string.format.
93+
---@field fmt_error fun(fmt: string, ...: any) Write ERROR log with formatting by string.format.
94+
---@field fmt_fatal fun(fmt: string, ...: any) Write FATAL log with formatting by string.format.
95+
---@field lazy_trace fun(heavy_func: fun(...): string) Write TRACE log from output of heavy_func().
96+
---@field lazy_debug fun(heavy_func: fun(...): string) Write DEBUG log from output of heavy_func().
97+
---@field lazy_info fun(heavy_func: fun(...): string) Write INFO log from output of heavy_func().
98+
---@field lazy_warn fun(heavy_func: fun(...): string) Write WARN log from output of heavy_func().
99+
---@field lazy_error fun(heavy_func: fun(...): string) Write ERROR log from output of heavy_func().
100+
---@field lazy_fatal fun(heavy_func: fun(...): string) Write FATAL log from output of heavy_func().
101+
---@field file_trace fun(vals: table, override: PlenaryLogConfig) Write TRACE log into file instead of console.
102+
---@field file_debug fun(vals: table, override: PlenaryLogConfig) Write DEBUG log into file instead of console.
103+
---@field file_info fun(vals: table, override: PlenaryLogConfig) Write INFO log into file instead of console.
104+
---@field file_warn fun(vals: table, override: PlenaryLogConfig) Write WARN log into file instead of console.
105+
---@field file_error fun(vals: table, override: PlenaryLogConfig) Write ERROR log into file instead of console.
106+
---@field file_fatal fun(vals: table, override: PlenaryLogConfig) Write FATAL log into file instead of console.
75107
local log = {}
76108

77109
local unpack = unpack or table.unpack
78110

111+
---@param config PlenaryLogConfig
112+
---@param standalone boolean
113+
---@return PlenaryLog
79114
log.new = function(config, standalone)
80115
config = vim.tbl_deep_extend("force", default_config, config)
81116

82117
local outfile = vim.F.if_nil(
83118
config.outfile,
84119
Path:new(vim.api.nvim_call_function("stdpath", { "cache" }), config.plugin .. ".log").filename
85-
)
120+
) --[[@as string]]
86121

122+
---@type PlenaryLog
87123
local obj
88124
if standalone then
89125
obj = log
90126
else
91-
obj = config
127+
obj = config --[[@as PlenaryLog]]
92128
end
93129

130+
---@type table<PlenaryLogLevel, integer>
94131
local levels = {}
95132
for i, v in ipairs(config.modes) do
96133
levels[v.name] = i
97134
end
98135

136+
---@param x float
137+
---@param increment? integer
138+
---@return float
99139
local round = function(x, increment)
100140
increment = increment or 1
101141
x = x / increment
102142
return (x > 0 and math.floor(x + 0.5) or math.ceil(x - 0.5)) * increment
103143
end
104144

145+
---@param ... any
146+
---@return string
105147
local make_string = function(...)
106148
local t = {}
107149
for i = 1, select("#", ...) do
@@ -120,6 +162,10 @@ log.new = function(config, standalone)
120162
return table.concat(t, " ")
121163
end
122164

165+
---@param level integer
166+
---@param level_config PlenaryLogLevelConfig
167+
---@param message_maker fun(...): string
168+
---@param ... any
123169
local log_at_level = function(level, level_config, message_maker, ...)
124170
-- Return early if we're below the config.level
125171
if level < levels[config.level] then
@@ -142,7 +188,7 @@ log.new = function(config, standalone)
142188
for _, v in ipairs(split_console) do
143189
local formatted_msg = string.format("[%s] %s", config.plugin, vim.fn.escape(v, [["\]]))
144190

145-
local ok = pcall(vim.cmd, string.format([[echom "%s"]], formatted_msg))
191+
local ok = pcall(vim.cmd --[[@as fun(command: string)]], string.format([[echom "%s"]], formatted_msg))
146192
if not ok then
147193
vim.api.nvim_out_write(msg .. "\n")
148194
end
@@ -187,12 +233,14 @@ log.new = function(config, standalone)
187233
end
188234

189235
for i, x in ipairs(config.modes) do
190-
-- log.info("these", "are", "separated")
236+
---log.info("these", "are", "separated")
237+
---@param ... any
191238
obj[x.name] = function(...)
192239
return log_at_level(i, x, make_string, ...)
193240
end
194241

195-
-- log.fmt_info("These are %s strings", "formatted")
242+
---log.fmt_info("These are %s strings", "formatted")
243+
---@param ... any
196244
obj[("fmt_%s"):format(x.name)] = function(...)
197245
return log_at_level(i, x, function(...)
198246
local passed = { ... }
@@ -205,14 +253,16 @@ log.new = function(config, standalone)
205253
end, ...)
206254
end
207255

208-
-- log.lazy_info(expensive_to_calculate)
256+
---log.lazy_info(expensive_to_calculate)
209257
obj[("lazy_%s"):format(x.name)] = function()
210258
return log_at_level(i, x, function(f)
211259
return f()
212260
end)
213261
end
214262

215-
-- log.file_info("do not print")
263+
---log.file_info("do not print")
264+
---@param vals table
265+
---@param override PlenaryLogConfig
216266
obj[("file_%s"):format(x.name)] = function(vals, override)
217267
local original_console = config.use_console
218268
config.use_console = false

0 commit comments

Comments
 (0)