aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/doc/lsp.txt6
-rw-r--r--runtime/lua/vim/lsp/diagnostic.lua20
-rw-r--r--test/functional/plugin/lsp/diagnostic_spec.lua16
3 files changed, 37 insertions, 5 deletions
diff --git a/runtime/doc/lsp.txt b/runtime/doc/lsp.txt
index f110782490..e29748fdff 100644
--- a/runtime/doc/lsp.txt
+++ b/runtime/doc/lsp.txt
@@ -1032,6 +1032,12 @@ get({bufnr}, {client_id}) *vim.lsp.diagnostic.get()*
diagnostics. Else, return just the
diagnostics associated with the client_id.
+get_all() *vim.lsp.diagnostic.get_all()*
+ Get all diagnostics for all clients
+
+ Return: ~
+ Diagnostic[]
+
*vim.lsp.diagnostic.get_count()*
get_count({bufnr}, {severity}, {client_id})
Get the counts for a particular severity
diff --git a/runtime/lua/vim/lsp/diagnostic.lua b/runtime/lua/vim/lsp/diagnostic.lua
index 45e717d16c..1570d4a122 100644
--- a/runtime/lua/vim/lsp/diagnostic.lua
+++ b/runtime/lua/vim/lsp/diagnostic.lua
@@ -305,6 +305,20 @@ end
-- }}}
-- Diagnostic Retrieval {{{
+
+--- Get all diagnostics for all clients
+---
+---@return Diagnostic[]
+function M.get_all()
+ local all_diagnostics = {}
+ for _, buf_diagnostics in pairs(diagnostic_cache) do
+ for _, client_diagnostics in pairs(buf_diagnostics) do
+ vim.list_extend(all_diagnostics, client_diagnostics)
+ end
+ end
+ return all_diagnostics
+end
+
--- Return associated diagnostics for bufnr
---
---@param bufnr number
@@ -990,10 +1004,6 @@ function M.display(diagnostics, bufnr, client_id, config)
update_in_insert = false,
}, config)
- if diagnostics == nil then
- diagnostics = M.get(bufnr, client_id)
- end
-
-- TODO(tjdevries): Consider how we can make this a "standardized" kind of thing for |lsp-handlers|.
-- It seems like we would probably want to do this more often as we expose more of them.
-- It provides a very nice functional interface for people to override configuration.
@@ -1031,7 +1041,7 @@ function M.display(diagnostics, bufnr, client_id, config)
M.clear(bufnr, client_id)
- diagnostics = diagnostics or diagnostic_cache[bufnr][client_id]
+ diagnostics = diagnostics or M.get(bufnr, client_id)
if not diagnostics or vim.tbl_isempty(diagnostics) then
return
diff --git a/test/functional/plugin/lsp/diagnostic_spec.lua b/test/functional/plugin/lsp/diagnostic_spec.lua
index 0fb55da4bd..11b2beba7a 100644
--- a/test/functional/plugin/lsp/diagnostic_spec.lua
+++ b/test/functional/plugin/lsp/diagnostic_spec.lua
@@ -67,6 +67,22 @@ describe('vim.lsp.diagnostic', function()
describe('vim.lsp.diagnostic', function()
describe('handle_publish_diagnostics', function()
+ it('should be able to retrieve diagnostics from all buffers and clients', function()
+ eq(3, exec_lua [[
+ vim.lsp.diagnostic.save(
+ {
+ make_error('Diagnostic #1', 1, 1, 1, 1),
+ make_error('Diagnostic #2', 2, 1, 2, 1),
+ }, 0, 1
+ )
+ vim.lsp.diagnostic.save(
+ {
+ make_error('Diagnostic #3', 3, 1, 3, 1),
+ }, 1, 2
+ )
+ return #vim.lsp.diagnostic.get_all()
+ ]])
+ end)
it('should be able to save and count a single client error', function()
eq(1, exec_lua [[
vim.lsp.diagnostic.save(