@@ -214,39 +214,66 @@ M.human_size = function (size)
214
214
return human
215
215
end
216
216
217
- --- Gets diagnostic severity counts for all files
218
- --- @return table table { file_path = { Error = int , Warning = int , Information = int , Hint = int , Unknown = int } }
217
+ --- Gets non-zero diagnostics counts for each open file and each ancestor directory.
218
+ --- severity_number and severity_string refer to the highest severity with
219
+ --- non-zero diagnostics count.
220
+ --- Entry is nil if all counts are 0
221
+ --- @return table table
222
+ --- { [file_path] = {
223
+ --- severity_number = int,
224
+ --- severity_string = string,
225
+ --- Error = int or nil,
226
+ --- Warn = int or nil,
227
+ --- Info = int or nil
228
+ --- Hint = int or nil,
229
+ --- } or nil }
219
230
M .get_diagnostic_counts = function ()
220
- local d = vim .diagnostic .get ()
221
231
local lookup = {}
222
- for _ , diag in ipairs (d ) do
223
- if diag .source == " Lua Diagnostics." and diag .message == " Undefined global `vim`." then
224
- -- ignore this diagnostic
225
- else
226
- local success , file_name = pcall (vim .api .nvim_buf_get_name , diag .bufnr )
227
- if success then
228
- local sev = diag_severity_to_string (diag .severity )
229
- if sev then
230
- local entry = lookup [file_name ] or { severity_number = 4 }
231
- entry [sev ] = (entry [sev ] or 0 ) + 1
232
- entry .severity_number = math.min (entry .severity_number , diag .severity )
233
- entry .severity_string = diag_severity_to_string (entry .severity_number )
234
- lookup [file_name ] = entry
232
+
233
+ for ns , _ in pairs (vim .diagnostic .get_namespaces ()) do
234
+ for _ , bufnr in ipairs (vim .api .nvim_list_bufs ()) do
235
+ local success , file_name = pcall (vim .api .nvim_buf_get_name , bufnr )
236
+ if success and not vim .diagnostic .is_disabled (bufnr , ns ) then
237
+ for severity , _ in ipairs (vim .diagnostic .severity ) do
238
+ local diagnostics = vim .diagnostic .get (bufnr , { namespace = ns , severity = severity })
239
+
240
+ if # diagnostics > 0 then
241
+ local severity_string = diag_severity_to_string (severity )
242
+ if lookup [file_name ] == nil then
243
+ lookup [file_name ] = {
244
+ severity_number = severity ,
245
+ severity_string = severity_string ,
246
+ }
247
+ end
248
+ if severity_string ~= nil then
249
+ lookup [file_name ][severity_string ] = # diagnostics
250
+ end
251
+ end
235
252
end
236
253
end
237
254
end
238
255
end
239
256
240
- for file_name , entry in pairs (lookup ) do
257
+ for file_name , file_entry in pairs (lookup ) do
241
258
-- Now bubble this status up to the parent directories
242
259
local parts = M .split (file_name , M .path_separator )
243
260
table.remove (parts ) -- pop the last part so we don't override the file's status
244
261
M .reduce (parts , " " , function (acc , part )
245
262
local path = (M .is_windows and acc == " " ) and part or M .path_join (acc , part )
246
- local path_entry = lookup [path ] or { severity_number = 4 }
247
- path_entry .severity_number = math.min (path_entry .severity_number , entry .severity_number )
248
- path_entry .severity_string = diag_severity_to_string (path_entry .severity_number )
249
- lookup [path ] = path_entry
263
+
264
+ if file_entry .severity_number then
265
+ if not lookup [path ] then
266
+ lookup [path ] = {
267
+ severity_number = file_entry .severity_number ,
268
+ severity_string = file_entry .severity_string ,
269
+ }
270
+ else -- lookup[path].severity_number ~= nil
271
+ local min_severity = math.min (lookup [path ].severity_number , file_entry .severity_number )
272
+ lookup [path ].severity_number = min_severity
273
+ lookup [path ].severity_string = diag_severity_to_string (min_severity )
274
+ end
275
+ end
276
+
250
277
return path
251
278
end )
252
279
end
0 commit comments