Skip to content

Commit 62df566

Browse files
committed
feat: add type annotations for plenary.log
1 parent 8bfda27 commit 62df566

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,30 +78,64 @@ 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
if x == 0 then
101141
return x
@@ -105,6 +145,8 @@ log.new = function(config, standalone)
105145
return (x > 0 and math.floor(x + 0.5) or math.ceil(x - 0.5)) * increment
106146
end
107147

148+
---@param ... any
149+
---@return string
108150
local make_string = function(...)
109151
local t = {}
110152
for i = 1, select("#", ...) do
@@ -123,6 +165,10 @@ log.new = function(config, standalone)
123165
return table.concat(t, " ")
124166
end
125167

168+
---@param level integer
169+
---@param level_config PlenaryLogLevelConfig
170+
---@param message_maker fun(...): string
171+
---@param ... any
126172
local log_at_level = function(level, level_config, message_maker, ...)
127173
-- Return early if we're below the config.level
128174
if level < levels[config.level] then
@@ -145,7 +191,7 @@ log.new = function(config, standalone)
145191
for _, v in ipairs(split_console) do
146192
local formatted_msg = string.format("[%s] %s", config.plugin, vim.fn.escape(v, [["\]]))
147193

148-
local ok = pcall(vim.cmd, string.format([[echom "%s"]], formatted_msg))
194+
local ok = pcall(vim.cmd --[[@as fun(command: string)]], string.format([[echom "%s"]], formatted_msg))
149195
if not ok then
150196
vim.api.nvim_out_write(msg .. "\n")
151197
end
@@ -190,12 +236,14 @@ log.new = function(config, standalone)
190236
end
191237

192238
for i, x in ipairs(config.modes) do
193-
-- log.info("these", "are", "separated")
239+
---log.info("these", "are", "separated")
240+
---@param ... any
194241
obj[x.name] = function(...)
195242
return log_at_level(i, x, make_string, ...)
196243
end
197244

198-
-- log.fmt_info("These are %s strings", "formatted")
245+
---log.fmt_info("These are %s strings", "formatted")
246+
---@param ... any
199247
obj[("fmt_%s"):format(x.name)] = function(...)
200248
return log_at_level(i, x, function(...)
201249
local passed = { ... }
@@ -208,14 +256,16 @@ log.new = function(config, standalone)
208256
end, ...)
209257
end
210258

211-
-- log.lazy_info(expensive_to_calculate)
259+
---log.lazy_info(expensive_to_calculate)
212260
obj[("lazy_%s"):format(x.name)] = function()
213261
return log_at_level(i, x, function(f)
214262
return f()
215263
end)
216264
end
217265

218-
-- log.file_info("do not print")
266+
---log.file_info("do not print")
267+
---@param vals table
268+
---@param override PlenaryLogConfig
219269
obj[("file_%s"):format(x.name)] = function(vals, override)
220270
local original_console = config.use_console
221271
config.use_console = false

0 commit comments

Comments
 (0)