9
9
10
10
local Path = require " plenary.path"
11
11
12
+ --- @type boolean | string | vim.NIL
12
13
local p_debug = vim .fn .getenv " DEBUG_PLENARY"
13
14
if p_debug == vim .NIL then
14
15
p_debug = false
15
16
end
16
17
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
+
17
50
-- User configuration section
51
+ --- @type PlenaryLogConfig
18
52
local default_config = {
19
- -- Name of the plugin. Prepended to log messages.
20
53
plugin = " plenary" ,
21
-
22
- -- Should print the output to neovim while running.
23
- -- values: 'sync','async',false
24
54
use_console = " async" ,
25
-
26
- -- Should highlighting be used in console (using echohl).
27
55
highlights = true ,
28
-
29
- -- Should write to a file.
30
- -- Default output for logging file is `stdpath("cache")/plugin`.
31
56
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.
35
57
outfile = nil ,
36
-
37
- -- Should write to the quickfix list.
38
58
use_quickfix = false ,
39
-
40
- -- Any messages above this level will be logged.
41
59
level = p_debug and " debug" or " info" ,
42
-
43
- -- Level configuration.
44
60
modes = {
45
61
{ name = " trace" , hl = " Comment" },
46
62
{ name = " debug" , hl = " Comment" },
@@ -49,17 +65,7 @@ local default_config = {
49
65
{ name = " error" , hl = " ErrorMsg" },
50
66
{ name = " fatal" , hl = " ErrorMsg" },
51
67
},
52
-
53
- -- Can limit the number of decimals displayed for floats.
54
68
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.
63
69
fmt_msg = function (is_console , mode_name , src_path , src_line , msg )
64
70
local nameupper = mode_name :upper ()
65
71
local lineinfo = src_path .. " :" .. src_line
@@ -72,30 +78,64 @@ local default_config = {
72
78
}
73
79
74
80
-- {{{ 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.
75
107
local log = {}
76
108
77
109
local unpack = unpack or table.unpack
78
110
111
+ --- @param config PlenaryLogConfig
112
+ --- @param standalone boolean
113
+ --- @return PlenaryLog
79
114
log .new = function (config , standalone )
80
115
config = vim .tbl_deep_extend (" force" , default_config , config )
81
116
82
117
local outfile = vim .F .if_nil (
83
118
config .outfile ,
84
119
Path :new (vim .api .nvim_call_function (" stdpath" , { " cache" }), config .plugin .. " .log" ).filename
85
- )
120
+ ) --[[ @as string ]]
86
121
122
+ --- @type PlenaryLog
87
123
local obj
88
124
if standalone then
89
125
obj = log
90
126
else
91
- obj = config
127
+ obj = config --[[ @as PlenaryLog ]]
92
128
end
93
129
130
+ --- @type table<PlenaryLogLevel , integer>
94
131
local levels = {}
95
132
for i , v in ipairs (config .modes ) do
96
133
levels [v .name ] = i
97
134
end
98
135
136
+ --- @param x float
137
+ --- @param increment ? integer
138
+ --- @return float
99
139
local round = function (x , increment )
100
140
if x == 0 then
101
141
return x
@@ -105,6 +145,8 @@ log.new = function(config, standalone)
105
145
return (x > 0 and math.floor (x + 0.5 ) or math.ceil (x - 0.5 )) * increment
106
146
end
107
147
148
+ --- @param ... any
149
+ --- @return string
108
150
local make_string = function (...)
109
151
local t = {}
110
152
for i = 1 , select (" #" , ... ) do
@@ -123,6 +165,10 @@ log.new = function(config, standalone)
123
165
return table.concat (t , " " )
124
166
end
125
167
168
+ --- @param level integer
169
+ --- @param level_config PlenaryLogLevelConfig
170
+ --- @param message_maker fun ( ... ): string
171
+ --- @param ... any
126
172
local log_at_level = function (level , level_config , message_maker , ...)
127
173
-- Return early if we're below the config.level
128
174
if level < levels [config .level ] then
@@ -145,7 +191,7 @@ log.new = function(config, standalone)
145
191
for _ , v in ipairs (split_console ) do
146
192
local formatted_msg = string.format (" [%s] %s" , config .plugin , vim .fn .escape (v , [[ "\]] ))
147
193
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 ))
149
195
if not ok then
150
196
vim .api .nvim_out_write (msg .. " \n " )
151
197
end
@@ -190,12 +236,14 @@ log.new = function(config, standalone)
190
236
end
191
237
192
238
for i , x in ipairs (config .modes ) do
193
- -- log.info("these", "are", "separated")
239
+ --- log.info("these", "are", "separated")
240
+ --- @param ... any
194
241
obj [x .name ] = function (...)
195
242
return log_at_level (i , x , make_string , ... )
196
243
end
197
244
198
- -- log.fmt_info("These are %s strings", "formatted")
245
+ --- log.fmt_info("These are %s strings", "formatted")
246
+ --- @param ... any
199
247
obj [(" fmt_%s" ):format (x .name )] = function (...)
200
248
return log_at_level (i , x , function (...)
201
249
local passed = { ... }
@@ -208,14 +256,16 @@ log.new = function(config, standalone)
208
256
end , ... )
209
257
end
210
258
211
- -- log.lazy_info(expensive_to_calculate)
259
+ --- log.lazy_info(expensive_to_calculate)
212
260
obj [(" lazy_%s" ):format (x .name )] = function ()
213
261
return log_at_level (i , x , function (f )
214
262
return f ()
215
263
end )
216
264
end
217
265
218
- -- log.file_info("do not print")
266
+ --- log.file_info("do not print")
267
+ --- @param vals table
268
+ --- @param override PlenaryLogConfig
219
269
obj [(" file_%s" ):format (x .name )] = function (vals , override )
220
270
local original_console = config .use_console
221
271
config .use_console = false
0 commit comments