99
1010local Path = require " plenary.path"
1111
12+ --- @type boolean | string | vim.NIL
1213local p_debug = vim .fn .getenv " DEBUG_PLENARY"
1314if p_debug == vim .NIL then
1415 p_debug = false
1516end
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
1852local 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.
75107local log = {}
76108
77109local unpack = unpack or table.unpack
78110
111+ --- @param config PlenaryLogConfig
112+ --- @param standalone boolean
113+ --- @return PlenaryLog
79114log .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