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,36 +78,72 @@ 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
increment = increment or 1
101
141
x = x / increment
102
142
return (x > 0 and math.floor (x + 0.5 ) or math.ceil (x - 0.5 )) * increment
103
143
end
104
144
145
+ --- @param ... any
146
+ --- @return string
105
147
local make_string = function (...)
106
148
local t = {}
107
149
for i = 1 , select (" #" , ... ) do
@@ -120,6 +162,10 @@ log.new = function(config, standalone)
120
162
return table.concat (t , " " )
121
163
end
122
164
165
+ --- @param level integer
166
+ --- @param level_config PlenaryLogLevelConfig
167
+ --- @param message_maker fun ( ... ): string
168
+ --- @param ... any
123
169
local log_at_level = function (level , level_config , message_maker , ...)
124
170
-- Return early if we're below the config.level
125
171
if level < levels [config .level ] then
@@ -142,7 +188,7 @@ log.new = function(config, standalone)
142
188
for _ , v in ipairs (split_console ) do
143
189
local formatted_msg = string.format (" [%s] %s" , config .plugin , vim .fn .escape (v , [[ "\]] ))
144
190
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 ))
146
192
if not ok then
147
193
vim .api .nvim_out_write (msg .. " \n " )
148
194
end
@@ -187,12 +233,14 @@ log.new = function(config, standalone)
187
233
end
188
234
189
235
for i , x in ipairs (config .modes ) do
190
- -- log.info("these", "are", "separated")
236
+ --- log.info("these", "are", "separated")
237
+ --- @param ... any
191
238
obj [x .name ] = function (...)
192
239
return log_at_level (i , x , make_string , ... )
193
240
end
194
241
195
- -- log.fmt_info("These are %s strings", "formatted")
242
+ --- log.fmt_info("These are %s strings", "formatted")
243
+ --- @param ... any
196
244
obj [(" fmt_%s" ):format (x .name )] = function (...)
197
245
return log_at_level (i , x , function (...)
198
246
local passed = { ... }
@@ -205,14 +253,16 @@ log.new = function(config, standalone)
205
253
end , ... )
206
254
end
207
255
208
- -- log.lazy_info(expensive_to_calculate)
256
+ --- log.lazy_info(expensive_to_calculate)
209
257
obj [(" lazy_%s" ):format (x .name )] = function ()
210
258
return log_at_level (i , x , function (f )
211
259
return f ()
212
260
end )
213
261
end
214
262
215
- -- log.file_info("do not print")
263
+ --- log.file_info("do not print")
264
+ --- @param vals table
265
+ --- @param override PlenaryLogConfig
216
266
obj [(" file_%s" ):format (x .name )] = function (vals , override )
217
267
local original_console = config .use_console
218
268
config .use_console = false
0 commit comments