mirror of
https://github.com/neovim/neovim.git
synced 2025-10-02 16:08:36 +00:00
refactor(diagnostic): make display handlers generic (#16137)
Rather than treating virtual_text, signs, and underline specially, introduce the concept of generic "handlers", of which those three are simply the defaults bundled with Nvim. Handlers are called in `vim.diagnostic.show()` and `vim.diagnostic.hide()` and are used to handle how diagnostics are displayed.
This commit is contained in:
@@ -6,6 +6,8 @@ local clear = helpers.clear
|
||||
local exec_lua = helpers.exec_lua
|
||||
local eq = helpers.eq
|
||||
local nvim = helpers.nvim
|
||||
local matches = helpers.matches
|
||||
local pcall_err = helpers.pcall_err
|
||||
|
||||
describe('vim.diagnostic', function()
|
||||
before_each(function()
|
||||
@@ -47,7 +49,21 @@ describe('vim.diagnostic', function()
|
||||
end
|
||||
|
||||
function count_extmarks(bufnr, namespace)
|
||||
return #vim.api.nvim_buf_get_extmarks(bufnr, namespace, 0, -1, {})
|
||||
local ns = vim.diagnostic.get_namespace(namespace)
|
||||
local extmarks = 0
|
||||
if ns.user_data.virt_text_ns then
|
||||
extmarks = extmarks + #vim.api.nvim_buf_get_extmarks(bufnr, ns.user_data.virt_text_ns, 0, -1, {})
|
||||
end
|
||||
if ns.user_data.underline_ns then
|
||||
extmarks = extmarks + #vim.api.nvim_buf_get_extmarks(bufnr, ns.user_data.underline_ns, 0, -1, {})
|
||||
end
|
||||
return extmarks
|
||||
end
|
||||
|
||||
function get_virt_text_extmarks(ns)
|
||||
local ns = vim.diagnostic.get_namespace(ns)
|
||||
local virt_text_ns = ns.user_data.virt_text_ns
|
||||
return vim.api.nvim_buf_get_extmarks(diagnostic_bufnr, virt_text_ns, 0, -1, {details = true})
|
||||
end
|
||||
]]
|
||||
|
||||
@@ -567,7 +583,7 @@ describe('vim.diagnostic', function()
|
||||
]]
|
||||
|
||||
eq(1, exec_lua [[return count_diagnostics(diagnostic_bufnr, vim.diagnostic.severity.ERROR, diagnostic_ns)]])
|
||||
eq(1, exec_lua [[return count_extmarks(diagnostic_bufnr, diagnostic_ns)]])
|
||||
-- eq(1, exec_lua [[return count_extmarks(diagnostic_bufnr, diagnostic_ns)]])
|
||||
end)
|
||||
|
||||
it('allows filtering by severity', function()
|
||||
@@ -615,7 +631,7 @@ describe('vim.diagnostic', function()
|
||||
severity_sort = severity_sort,
|
||||
})
|
||||
|
||||
local virt_text = vim.api.nvim_buf_get_extmarks(diagnostic_bufnr, diagnostic_ns, 0, -1, {details = true})[1][4].virt_text
|
||||
local virt_text = get_virt_text_extmarks(diagnostic_ns)[1][4].virt_text
|
||||
|
||||
local virt_texts = {}
|
||||
for i = 2, #virt_text do
|
||||
@@ -661,7 +677,7 @@ describe('vim.diagnostic', function()
|
||||
}
|
||||
})
|
||||
|
||||
local extmarks = vim.api.nvim_buf_get_extmarks(diagnostic_bufnr, diagnostic_ns, 0, -1, {details = true})
|
||||
local extmarks = get_virt_text_extmarks(diagnostic_ns)
|
||||
local virt_text = extmarks[1][4].virt_text[2][1]
|
||||
return virt_text
|
||||
]]
|
||||
@@ -676,7 +692,7 @@ describe('vim.diagnostic', function()
|
||||
}
|
||||
}, diagnostic_ns)
|
||||
|
||||
local extmarks = vim.api.nvim_buf_get_extmarks(diagnostic_bufnr, diagnostic_ns, 0, -1, {details = true})
|
||||
local extmarks = get_virt_text_extmarks(diagnostic_ns)
|
||||
local virt_text = extmarks[1][4].virt_text[2][1]
|
||||
return virt_text
|
||||
]]
|
||||
@@ -696,7 +712,7 @@ describe('vim.diagnostic', function()
|
||||
}
|
||||
})
|
||||
|
||||
local extmarks = vim.api.nvim_buf_get_extmarks(diagnostic_bufnr, diagnostic_ns, 0, -1, {details = true})
|
||||
local extmarks = get_virt_text_extmarks(diagnostic_ns)
|
||||
local virt_text = {extmarks[1][4].virt_text[2][1], extmarks[2][4].virt_text[2][1]}
|
||||
return virt_text
|
||||
]]
|
||||
@@ -724,7 +740,7 @@ describe('vim.diagnostic', function()
|
||||
make_error('Error', 1, 0, 1, 0),
|
||||
})
|
||||
|
||||
local extmarks = vim.api.nvim_buf_get_extmarks(diagnostic_bufnr, diagnostic_ns, 0, -1, {details = true})
|
||||
local extmarks = get_virt_text_extmarks(diagnostic_ns)
|
||||
return {extmarks[1][4].virt_text, extmarks[2][4].virt_text}
|
||||
]]
|
||||
eq(" 👀 Warning", result[1][2][1])
|
||||
@@ -752,7 +768,7 @@ describe('vim.diagnostic', function()
|
||||
make_error('Error', 1, 0, 1, 0, 'another_linter'),
|
||||
})
|
||||
|
||||
local extmarks = vim.api.nvim_buf_get_extmarks(diagnostic_bufnr, diagnostic_ns, 0, -1, {details = true})
|
||||
local extmarks = get_virt_text_extmarks(diagnostic_ns)
|
||||
return {extmarks[1][4].virt_text, extmarks[2][4].virt_text}
|
||||
]]
|
||||
eq(" some_linter: 👀 Warning", result[1][2][1])
|
||||
@@ -800,13 +816,11 @@ describe('vim.diagnostic', function()
|
||||
virtual_text = true,
|
||||
})
|
||||
|
||||
-- Count how many times we call display.
|
||||
SetVirtualTextOriginal = vim.diagnostic._set_virtual_text
|
||||
|
||||
DisplayCount = 0
|
||||
vim.diagnostic._set_virtual_text = function(...)
|
||||
local set_virtual_text = vim.diagnostic.handlers.virtual_text.show
|
||||
vim.diagnostic.handlers.virtual_text.show = function(...)
|
||||
DisplayCount = DisplayCount + 1
|
||||
return SetVirtualTextOriginal(...)
|
||||
return set_virtual_text(...)
|
||||
end
|
||||
|
||||
vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, {
|
||||
@@ -850,13 +864,12 @@ describe('vim.diagnostic', function()
|
||||
virtual_text = false,
|
||||
})
|
||||
|
||||
-- Count how many times we call display.
|
||||
SetVirtualTextOriginal = vim.diagnostic._set_virtual_text
|
||||
|
||||
DisplayCount = 0
|
||||
vim.diagnostic._set_virtual_text = function(...)
|
||||
local set_virtual_text = vim.diagnostic.handlers.virtual_text.show
|
||||
vim.diagnostic.handlers.virtual_text.show = function(...)
|
||||
DisplayCount = DisplayCount + 1
|
||||
return SetVirtualTextOriginal(...)
|
||||
return set_virtual_text(...)
|
||||
end
|
||||
|
||||
vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, {
|
||||
@@ -1347,4 +1360,73 @@ describe('vim.diagnostic', function()
|
||||
eq(result[1], result[2])
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('handlers', function()
|
||||
it('checks that a new handler is a table', function()
|
||||
matches([[.*handler: expected table, got string.*]], pcall_err(exec_lua, [[ vim.diagnostic.handlers.foo = "bar" ]]))
|
||||
matches([[.*handler: expected table, got function.*]], pcall_err(exec_lua, [[ vim.diagnostic.handlers.foo = function() end ]]))
|
||||
end)
|
||||
|
||||
it('can add new handlers', function()
|
||||
eq(true, exec_lua [[
|
||||
local handler_called = false
|
||||
vim.diagnostic.handlers.test = {
|
||||
show = function(namespace, bufnr, diagnostics, opts)
|
||||
assert(namespace == diagnostic_ns)
|
||||
assert(bufnr == diagnostic_bufnr)
|
||||
assert(#diagnostics == 1)
|
||||
assert(opts.test.some_opt == 42)
|
||||
handler_called = true
|
||||
end,
|
||||
}
|
||||
|
||||
vim.diagnostic.config({test = {some_opt = 42}})
|
||||
vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, {
|
||||
make_warning("Warning", 0, 0, 0, 0),
|
||||
})
|
||||
return handler_called
|
||||
]])
|
||||
end)
|
||||
|
||||
it('can disable handlers by setting the corresponding option to false', function()
|
||||
eq(false, exec_lua [[
|
||||
local handler_called = false
|
||||
vim.diagnostic.handlers.test = {
|
||||
show = function(namespace, bufnr, diagnostics, opts)
|
||||
handler_called = true
|
||||
end,
|
||||
}
|
||||
|
||||
vim.diagnostic.config({test = false})
|
||||
vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, {
|
||||
make_warning("Warning", 0, 0, 0, 0),
|
||||
})
|
||||
return handler_called
|
||||
]])
|
||||
end)
|
||||
|
||||
it('always calls a handler\'s hide function if defined', function()
|
||||
eq({false, true}, exec_lua [[
|
||||
local hide_called = false
|
||||
local show_called = false
|
||||
vim.diagnostic.handlers.test = {
|
||||
show = function(namespace, bufnr, diagnostics, opts)
|
||||
show_called = true
|
||||
end,
|
||||
hide = function(namespace, bufnr)
|
||||
assert(namespace == diagnostic_ns)
|
||||
assert(bufnr == diagnostic_bufnr)
|
||||
hide_called = true
|
||||
end,
|
||||
}
|
||||
|
||||
vim.diagnostic.config({test = false})
|
||||
vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, {
|
||||
make_warning("Warning", 0, 0, 0, 0),
|
||||
})
|
||||
vim.diagnostic.hide(diagnostic_ns, diagnostic_bufnr)
|
||||
return {show_called, hide_called}
|
||||
]])
|
||||
end)
|
||||
end)
|
||||
end)
|
||||
|
@@ -3,7 +3,6 @@ local helpers = require('test.functional.helpers')(after_each)
|
||||
local clear = helpers.clear
|
||||
local exec_lua = helpers.exec_lua
|
||||
local eq = helpers.eq
|
||||
local nvim = helpers.nvim
|
||||
|
||||
describe('vim.lsp.diagnostic', function()
|
||||
local fake_uri
|
||||
@@ -45,11 +44,32 @@ describe('vim.lsp.diagnostic', function()
|
||||
}
|
||||
end
|
||||
|
||||
count_of_extmarks_for_client = function(bufnr, client_id)
|
||||
return #vim.api.nvim_buf_get_extmarks(
|
||||
bufnr, vim.lsp.diagnostic.get_namespace(client_id), 0, -1, {}
|
||||
)
|
||||
function get_extmarks(bufnr, client_id)
|
||||
local namespace = vim.lsp.diagnostic.get_namespace(client_id)
|
||||
local ns = vim.diagnostic.get_namespace(namespace)
|
||||
local extmarks = {}
|
||||
if ns.user_data.virt_text_ns then
|
||||
for _, e in pairs(vim.api.nvim_buf_get_extmarks(bufnr, ns.user_data.virt_text_ns, 0, -1, {details=true})) do
|
||||
table.insert(extmarks, e)
|
||||
end
|
||||
end
|
||||
if ns.user_data.underline_ns then
|
||||
for _, e in pairs(vim.api.nvim_buf_get_extmarks(bufnr, ns.user_data.underline_ns, 0, -1, {details=true})) do
|
||||
table.insert(extmarks, e)
|
||||
end
|
||||
end
|
||||
return extmarks
|
||||
end
|
||||
|
||||
client_id = vim.lsp.start_client {
|
||||
cmd_env = {
|
||||
NVIM_LUA_NOTRACK = "1";
|
||||
};
|
||||
cmd = {
|
||||
vim.v.progpath, '-es', '-u', 'NONE', '--headless'
|
||||
};
|
||||
offset_encoding = "utf-16";
|
||||
}
|
||||
]]
|
||||
|
||||
fake_uri = "file:///fake/uri"
|
||||
@@ -69,366 +89,6 @@ describe('vim.lsp.diagnostic', function()
|
||||
end)
|
||||
|
||||
describe('vim.lsp.diagnostic', function()
|
||||
describe('handle_publish_diagnostics', function()
|
||||
it('should be able to retrieve diagnostics from all buffers and clients', function()
|
||||
local result = exec_lua [[
|
||||
vim.lsp.diagnostic.save(
|
||||
{
|
||||
make_error('Diagnostic #1', 1, 1, 1, 1),
|
||||
make_error('Diagnostic #2', 2, 1, 2, 1),
|
||||
}, 1, 1
|
||||
)
|
||||
vim.lsp.diagnostic.save(
|
||||
{
|
||||
make_error('Diagnostic #3', 3, 1, 3, 1),
|
||||
}, 2, 2
|
||||
)
|
||||
return vim.lsp.diagnostic.get_all()
|
||||
]]
|
||||
eq(2, #result)
|
||||
eq(2, #result[1])
|
||||
eq('Diagnostic #1', result[1][1].message)
|
||||
end)
|
||||
it('should be able to save and count a single client error', function()
|
||||
eq(1, exec_lua [[
|
||||
vim.lsp.diagnostic.save(
|
||||
{
|
||||
make_error('Diagnostic #1', 1, 1, 1, 1),
|
||||
}, 0, 1
|
||||
)
|
||||
return vim.lsp.diagnostic.get_count(0, "Error", 1)
|
||||
]])
|
||||
end)
|
||||
|
||||
it('should be able to save and count from two clients', function()
|
||||
eq(2, exec_lua [[
|
||||
vim.lsp.diagnostic.save(
|
||||
{
|
||||
make_error('Diagnostic #1', 1, 1, 1, 1),
|
||||
make_error('Diagnostic #2', 2, 1, 2, 1),
|
||||
}, 0, 1
|
||||
)
|
||||
return vim.lsp.diagnostic.get_count(0, "Error", 1)
|
||||
]])
|
||||
end)
|
||||
|
||||
it('should be able to save and count from multiple clients', function()
|
||||
eq({1, 1, 2}, exec_lua [[
|
||||
vim.lsp.diagnostic.save(
|
||||
{
|
||||
make_error('Diagnostic From Server 1', 1, 1, 1, 1),
|
||||
}, 0, 1
|
||||
)
|
||||
vim.lsp.diagnostic.save(
|
||||
{
|
||||
make_error('Diagnostic From Server 2', 1, 1, 1, 1),
|
||||
}, 0, 2
|
||||
)
|
||||
return {
|
||||
-- Server 1
|
||||
vim.lsp.diagnostic.get_count(0, "Error", 1),
|
||||
-- Server 2
|
||||
vim.lsp.diagnostic.get_count(0, "Error", 2),
|
||||
-- All servers
|
||||
vim.lsp.diagnostic.get_count(0, "Error", nil),
|
||||
}
|
||||
]])
|
||||
end)
|
||||
|
||||
it('should be able to save and count from multiple clients with respect to severity', function()
|
||||
eq({3, 0, 3}, exec_lua [[
|
||||
vim.lsp.diagnostic.save(
|
||||
{
|
||||
make_error('Diagnostic From Server 1:1', 1, 1, 1, 1),
|
||||
make_error('Diagnostic From Server 1:2', 2, 2, 2, 2),
|
||||
make_error('Diagnostic From Server 1:3', 2, 3, 3, 2),
|
||||
}, 0, 1
|
||||
)
|
||||
vim.lsp.diagnostic.save(
|
||||
{
|
||||
make_warning('Warning From Server 2', 3, 3, 3, 3),
|
||||
}, 0, 2
|
||||
)
|
||||
return {
|
||||
-- Server 1
|
||||
vim.lsp.diagnostic.get_count(0, "Error", 1),
|
||||
-- Server 2
|
||||
vim.lsp.diagnostic.get_count(0, "Error", 2),
|
||||
-- All servers
|
||||
vim.lsp.diagnostic.get_count(0, "Error", nil),
|
||||
}
|
||||
]])
|
||||
end)
|
||||
it('should handle one server clearing highlights while the other still has highlights', function()
|
||||
-- 1 Error (1)
|
||||
-- 1 Warning (2)
|
||||
-- 1 Warning (2) + 1 Warning (1)
|
||||
-- 2 highlights and 2 underlines (since error)
|
||||
-- 1 highlight + 1 underline
|
||||
local all_highlights = {1, 1, 2, 4, 2}
|
||||
eq(all_highlights, exec_lua [[
|
||||
local server_1_diags = {
|
||||
make_error("Error 1", 1, 1, 1, 5),
|
||||
make_warning("Warning on Server 1", 2, 1, 2, 5),
|
||||
}
|
||||
local server_2_diags = {
|
||||
make_warning("Warning 1", 2, 1, 2, 5),
|
||||
}
|
||||
|
||||
vim.lsp.diagnostic.on_publish_diagnostics(nil, { uri = fake_uri, diagnostics = server_1_diags }, {client_id=1})
|
||||
vim.lsp.diagnostic.on_publish_diagnostics(nil, { uri = fake_uri, diagnostics = server_2_diags }, {client_id=2})
|
||||
return {
|
||||
vim.lsp.diagnostic.get_count(diagnostic_bufnr, "Error", 1),
|
||||
vim.lsp.diagnostic.get_count(diagnostic_bufnr, "Warning", 2),
|
||||
vim.lsp.diagnostic.get_count(diagnostic_bufnr, "Warning", nil),
|
||||
count_of_extmarks_for_client(diagnostic_bufnr, 1),
|
||||
count_of_extmarks_for_client(diagnostic_bufnr, 2),
|
||||
}
|
||||
]])
|
||||
|
||||
-- Clear diagnostics from server 1, and make sure we have the right amount of stuff for client 2
|
||||
eq({1, 1, 2, 0, 2}, exec_lua [[
|
||||
vim.lsp.diagnostic.disable(diagnostic_bufnr, 1)
|
||||
return {
|
||||
vim.lsp.diagnostic.get_count(diagnostic_bufnr, "Error", 1),
|
||||
vim.lsp.diagnostic.get_count(diagnostic_bufnr, "Warning", 2),
|
||||
vim.lsp.diagnostic.get_count(diagnostic_bufnr, "Warning", nil),
|
||||
count_of_extmarks_for_client(diagnostic_bufnr, 1),
|
||||
count_of_extmarks_for_client(diagnostic_bufnr, 2),
|
||||
}
|
||||
]])
|
||||
|
||||
-- Show diagnostics from server 1 again
|
||||
eq(all_highlights, exec_lua([[
|
||||
vim.lsp.diagnostic.enable(diagnostic_bufnr, 1)
|
||||
return {
|
||||
vim.lsp.diagnostic.get_count(diagnostic_bufnr, "Error", 1),
|
||||
vim.lsp.diagnostic.get_count(diagnostic_bufnr, "Warning", 2),
|
||||
vim.lsp.diagnostic.get_count(diagnostic_bufnr, "Warning", nil),
|
||||
count_of_extmarks_for_client(diagnostic_bufnr, 1),
|
||||
count_of_extmarks_for_client(diagnostic_bufnr, 2),
|
||||
}
|
||||
]]))
|
||||
end)
|
||||
|
||||
it('should not display diagnostics when disabled', function()
|
||||
eq({0, 2}, exec_lua [[
|
||||
local server_1_diags = {
|
||||
make_error("Error 1", 1, 1, 1, 5),
|
||||
make_warning("Warning on Server 1", 2, 1, 2, 5),
|
||||
}
|
||||
local server_2_diags = {
|
||||
make_warning("Warning 1", 2, 1, 2, 5),
|
||||
}
|
||||
|
||||
vim.lsp.diagnostic.on_publish_diagnostics(nil, { uri = fake_uri, diagnostics = server_1_diags }, {client_id=1})
|
||||
vim.lsp.diagnostic.on_publish_diagnostics(nil, { uri = fake_uri, diagnostics = server_2_diags }, {client_id=2})
|
||||
|
||||
vim.lsp.diagnostic.disable(diagnostic_bufnr, 1)
|
||||
|
||||
return {
|
||||
count_of_extmarks_for_client(diagnostic_bufnr, 1),
|
||||
count_of_extmarks_for_client(diagnostic_bufnr, 2),
|
||||
}
|
||||
]])
|
||||
|
||||
eq({4, 0}, exec_lua [[
|
||||
vim.lsp.diagnostic.enable(diagnostic_bufnr, 1)
|
||||
vim.lsp.diagnostic.disable(diagnostic_bufnr, 2)
|
||||
|
||||
return {
|
||||
count_of_extmarks_for_client(diagnostic_bufnr, 1),
|
||||
count_of_extmarks_for_client(diagnostic_bufnr, 2),
|
||||
}
|
||||
]])
|
||||
end)
|
||||
|
||||
describe('reset', function()
|
||||
it('diagnostic count is 0 and displayed diagnostics are 0 after call', function()
|
||||
-- 1 Error (1)
|
||||
-- 1 Warning (2)
|
||||
-- 1 Warning (2) + 1 Warning (1)
|
||||
-- 2 highlights and 2 underlines (since error)
|
||||
-- 1 highlight + 1 underline
|
||||
local all_highlights = {1, 1, 2, 4, 2}
|
||||
eq(all_highlights, exec_lua [[
|
||||
local server_1_diags = {
|
||||
make_error("Error 1", 1, 1, 1, 5),
|
||||
make_warning("Warning on Server 1", 2, 1, 2, 5),
|
||||
}
|
||||
local server_2_diags = {
|
||||
make_warning("Warning 1", 2, 1, 2, 5),
|
||||
}
|
||||
|
||||
vim.lsp.diagnostic.on_publish_diagnostics(nil, { uri = fake_uri, diagnostics = server_1_diags }, {client_id=1})
|
||||
vim.lsp.diagnostic.on_publish_diagnostics(nil, { uri = fake_uri, diagnostics = server_2_diags }, {client_id=2})
|
||||
return {
|
||||
vim.lsp.diagnostic.get_count(diagnostic_bufnr, "Error", 1),
|
||||
vim.lsp.diagnostic.get_count(diagnostic_bufnr, "Warning", 2),
|
||||
vim.lsp.diagnostic.get_count(diagnostic_bufnr, "Warning", nil),
|
||||
count_of_extmarks_for_client(diagnostic_bufnr, 1),
|
||||
count_of_extmarks_for_client(diagnostic_bufnr, 2),
|
||||
}
|
||||
]])
|
||||
|
||||
-- Reset diagnostics from server 1
|
||||
exec_lua([[ vim.lsp.diagnostic.reset(1, { [ diagnostic_bufnr ] = { [ 1 ] = true ; [ 2 ] = true } } )]])
|
||||
|
||||
-- Make sure we have the right diagnostic count
|
||||
eq({0, 1, 1, 0, 2} , exec_lua [[
|
||||
local diagnostic_count = {}
|
||||
vim.wait(100, function () diagnostic_count = {
|
||||
vim.lsp.diagnostic.get_count(diagnostic_bufnr, "Error", 1),
|
||||
vim.lsp.diagnostic.get_count(diagnostic_bufnr, "Warning", 2),
|
||||
vim.lsp.diagnostic.get_count(diagnostic_bufnr, "Warning", nil),
|
||||
count_of_extmarks_for_client(diagnostic_bufnr, 1),
|
||||
count_of_extmarks_for_client(diagnostic_bufnr, 2),
|
||||
} end )
|
||||
return diagnostic_count
|
||||
]])
|
||||
|
||||
-- Reset diagnostics from server 2
|
||||
exec_lua([[ vim.lsp.diagnostic.reset(2, { [ diagnostic_bufnr ] = { [ 1 ] = true ; [ 2 ] = true } } )]])
|
||||
|
||||
-- Make sure we have the right diagnostic count
|
||||
eq({0, 0, 0, 0, 0}, exec_lua [[
|
||||
local diagnostic_count = {}
|
||||
vim.wait(100, function () diagnostic_count = {
|
||||
vim.lsp.diagnostic.get_count(diagnostic_bufnr, "Error", 1),
|
||||
vim.lsp.diagnostic.get_count(diagnostic_bufnr, "Warning", 2),
|
||||
vim.lsp.diagnostic.get_count(diagnostic_bufnr, "Warning", nil),
|
||||
count_of_extmarks_for_client(diagnostic_bufnr, 1),
|
||||
count_of_extmarks_for_client(diagnostic_bufnr, 2),
|
||||
} end )
|
||||
return diagnostic_count
|
||||
]])
|
||||
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('get_next_diagnostic_pos', function()
|
||||
it('can find the next pos with only one client', function()
|
||||
eq({1, 1}, exec_lua [[
|
||||
vim.lsp.diagnostic.save(
|
||||
{
|
||||
make_error('Diagnostic #1', 1, 1, 1, 1),
|
||||
}, diagnostic_bufnr, 1
|
||||
)
|
||||
vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
|
||||
return vim.lsp.diagnostic.get_next_pos()
|
||||
]])
|
||||
end)
|
||||
|
||||
it('can find next pos with two errors', function()
|
||||
eq({4, 4}, exec_lua [[
|
||||
vim.lsp.diagnostic.save(
|
||||
{
|
||||
make_error('Diagnostic #1', 1, 1, 1, 1),
|
||||
make_error('Diagnostic #2', 4, 4, 4, 4),
|
||||
}, diagnostic_bufnr, 1
|
||||
)
|
||||
vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
|
||||
vim.api.nvim_win_set_cursor(0, {3, 1})
|
||||
return vim.lsp.diagnostic.get_next_pos { client_id = 1 }
|
||||
]])
|
||||
end)
|
||||
|
||||
it('can cycle when position is past error', function()
|
||||
eq({1, 1}, exec_lua [[
|
||||
vim.lsp.diagnostic.save(
|
||||
{
|
||||
make_error('Diagnostic #1', 1, 1, 1, 1),
|
||||
}, diagnostic_bufnr, 1
|
||||
)
|
||||
vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
|
||||
vim.api.nvim_win_set_cursor(0, {3, 1})
|
||||
return vim.lsp.diagnostic.get_next_pos { client_id = 1 }
|
||||
]])
|
||||
end)
|
||||
|
||||
it('will not cycle when wrap is off', function()
|
||||
eq(false, exec_lua [[
|
||||
vim.lsp.diagnostic.save(
|
||||
{
|
||||
make_error('Diagnostic #1', 1, 1, 1, 1),
|
||||
}, diagnostic_bufnr, 1
|
||||
)
|
||||
vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
|
||||
vim.api.nvim_win_set_cursor(0, {3, 1})
|
||||
return vim.lsp.diagnostic.get_next_pos { client_id = 1, wrap = false }
|
||||
]])
|
||||
end)
|
||||
|
||||
it('can cycle even from the last line', function()
|
||||
eq({4, 4}, exec_lua [[
|
||||
vim.lsp.diagnostic.save(
|
||||
{
|
||||
make_error('Diagnostic #2', 4, 4, 4, 4),
|
||||
}, diagnostic_bufnr, 1
|
||||
)
|
||||
vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
|
||||
vim.api.nvim_win_set_cursor(0, {vim.api.nvim_buf_line_count(0), 1})
|
||||
return vim.lsp.diagnostic.get_prev_pos { client_id = 1 }
|
||||
]])
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('get_prev_diagnostic_pos', function()
|
||||
it('can find the prev pos with only one client', function()
|
||||
eq({1, 1}, exec_lua [[
|
||||
vim.lsp.diagnostic.save(
|
||||
{
|
||||
make_error('Diagnostic #1', 1, 1, 1, 1),
|
||||
}, diagnostic_bufnr, 1
|
||||
)
|
||||
vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
|
||||
vim.api.nvim_win_set_cursor(0, {3, 1})
|
||||
return vim.lsp.diagnostic.get_prev_pos()
|
||||
]])
|
||||
end)
|
||||
|
||||
it('can find prev pos with two errors', function()
|
||||
eq({1, 1}, exec_lua [[
|
||||
vim.lsp.diagnostic.save(
|
||||
{
|
||||
make_error('Diagnostic #1', 1, 1, 1, 1),
|
||||
make_error('Diagnostic #2', 4, 4, 4, 4),
|
||||
}, diagnostic_bufnr, 1
|
||||
)
|
||||
vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
|
||||
vim.api.nvim_win_set_cursor(0, {3, 1})
|
||||
return vim.lsp.diagnostic.get_prev_pos { client_id = 1 }
|
||||
]])
|
||||
end)
|
||||
|
||||
it('can cycle when position is past error', function()
|
||||
eq({4, 4}, exec_lua [[
|
||||
vim.lsp.diagnostic.save(
|
||||
{
|
||||
make_error('Diagnostic #2', 4, 4, 4, 4),
|
||||
}, diagnostic_bufnr, 1
|
||||
)
|
||||
vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
|
||||
vim.api.nvim_win_set_cursor(0, {3, 1})
|
||||
return vim.lsp.diagnostic.get_prev_pos { client_id = 1 }
|
||||
]])
|
||||
end)
|
||||
|
||||
it('respects wrap parameter', function()
|
||||
eq(false, exec_lua [[
|
||||
vim.lsp.diagnostic.save(
|
||||
{
|
||||
make_error('Diagnostic #2', 4, 4, 4, 4),
|
||||
}, diagnostic_bufnr, 1
|
||||
)
|
||||
vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
|
||||
vim.api.nvim_win_set_cursor(0, {3, 1})
|
||||
return vim.lsp.diagnostic.get_prev_pos { client_id = 1, wrap = false}
|
||||
]])
|
||||
end)
|
||||
end)
|
||||
end)
|
||||
|
||||
it('maintains LSP information when translating diagnostics', function()
|
||||
local result = exec_lua [[
|
||||
local diagnostics = {
|
||||
@@ -442,7 +102,7 @@ describe('vim.lsp.diagnostic', function()
|
||||
vim.lsp.diagnostic.on_publish_diagnostics(nil, {
|
||||
uri = fake_uri,
|
||||
diagnostics = diagnostics,
|
||||
}, {client_id=1})
|
||||
}, {client_id=client_id})
|
||||
|
||||
return {
|
||||
vim.diagnostic.get(diagnostic_bufnr, {lnum=1})[1],
|
||||
@@ -456,246 +116,7 @@ describe('vim.lsp.diagnostic', function()
|
||||
end)
|
||||
end)
|
||||
|
||||
describe("vim.lsp.diagnostic.get_line_diagnostics", function()
|
||||
it('should return an empty table when no diagnostics are present', function()
|
||||
eq({}, exec_lua [[return vim.lsp.diagnostic.get_line_diagnostics(diagnostic_bufnr, 1)]])
|
||||
end)
|
||||
|
||||
it('should return all diagnostics when no severity is supplied', function()
|
||||
eq(2, exec_lua [[
|
||||
vim.lsp.diagnostic.on_publish_diagnostics(nil, {
|
||||
uri = fake_uri,
|
||||
diagnostics = {
|
||||
make_error("Error 1", 1, 1, 1, 5),
|
||||
make_warning("Warning on Server 1", 1, 1, 2, 5),
|
||||
make_error("Error On Other Line", 2, 1, 1, 5),
|
||||
}
|
||||
}, {client_id=1})
|
||||
|
||||
return #vim.lsp.diagnostic.get_line_diagnostics(diagnostic_bufnr, 1)
|
||||
]])
|
||||
end)
|
||||
|
||||
it('should return only requested diagnostics when severity_limit is supplied', function()
|
||||
eq(2, exec_lua [[
|
||||
vim.lsp.diagnostic.on_publish_diagnostics(nil, {
|
||||
uri = fake_uri,
|
||||
diagnostics = {
|
||||
make_error("Error 1", 1, 1, 1, 5),
|
||||
make_warning("Warning on Server 1", 1, 1, 2, 5),
|
||||
make_information("Ignored information", 1, 1, 2, 5),
|
||||
make_error("Error On Other Line", 2, 1, 1, 5),
|
||||
}
|
||||
}, {client_id=1})
|
||||
|
||||
return #vim.lsp.diagnostic.get_line_diagnostics(diagnostic_bufnr, 1, { severity_limit = "Warning" })
|
||||
]])
|
||||
end)
|
||||
end)
|
||||
|
||||
describe("vim.lsp.diagnostic.on_publish_diagnostics", function()
|
||||
it('can use functions for config values', function()
|
||||
exec_lua [[
|
||||
vim.lsp.with(vim.lsp.diagnostic.on_publish_diagnostics, {
|
||||
virtual_text = function() return true end,
|
||||
})(nil, {
|
||||
uri = fake_uri,
|
||||
diagnostics = {
|
||||
make_error('Delayed Diagnostic', 4, 4, 4, 4),
|
||||
}
|
||||
}, {client_id=1}
|
||||
)
|
||||
]]
|
||||
|
||||
eq(1, exec_lua [[return vim.lsp.diagnostic.get_count(diagnostic_bufnr, "Error", 1)]])
|
||||
eq(2, exec_lua [[return count_of_extmarks_for_client(diagnostic_bufnr, 1)]])
|
||||
|
||||
-- Now, don't enable virtual text.
|
||||
-- We should have one less extmark displayed.
|
||||
exec_lua [[
|
||||
vim.lsp.with(vim.lsp.diagnostic.on_publish_diagnostics, {
|
||||
virtual_text = function() return false end,
|
||||
})(nil, {
|
||||
uri = fake_uri,
|
||||
diagnostics = {
|
||||
make_error('Delayed Diagnostic', 4, 4, 4, 4),
|
||||
}
|
||||
}, {client_id=1}
|
||||
)
|
||||
]]
|
||||
|
||||
eq(1, exec_lua [[return vim.lsp.diagnostic.get_count(diagnostic_bufnr, "Error", 1)]])
|
||||
eq(1, exec_lua [[return count_of_extmarks_for_client(diagnostic_bufnr, 1)]])
|
||||
end)
|
||||
|
||||
it('can perform updates after insert_leave', function()
|
||||
exec_lua [[vim.api.nvim_set_current_buf(diagnostic_bufnr)]]
|
||||
nvim("input", "o")
|
||||
eq({mode='i', blocking=false}, nvim("get_mode"))
|
||||
|
||||
-- Save the diagnostics
|
||||
exec_lua [[
|
||||
vim.lsp.with(vim.lsp.diagnostic.on_publish_diagnostics, {
|
||||
update_in_insert = false,
|
||||
})(nil, {
|
||||
uri = fake_uri,
|
||||
diagnostics = {
|
||||
make_error('Delayed Diagnostic', 4, 4, 4, 4),
|
||||
}
|
||||
}, {client_id=1}
|
||||
)
|
||||
]]
|
||||
|
||||
-- No diagnostics displayed yet.
|
||||
eq({mode='i', blocking=false}, nvim("get_mode"))
|
||||
eq(1, exec_lua [[return vim.lsp.diagnostic.get_count(diagnostic_bufnr, "Error", 1)]])
|
||||
eq(0, exec_lua [[return count_of_extmarks_for_client(diagnostic_bufnr, 1)]])
|
||||
|
||||
nvim("input", "<esc>")
|
||||
eq({mode='n', blocking=false}, nvim("get_mode"))
|
||||
|
||||
eq(1, exec_lua [[return vim.lsp.diagnostic.get_count(diagnostic_bufnr, "Error", 1)]])
|
||||
eq(2, exec_lua [[return count_of_extmarks_for_client(diagnostic_bufnr, 1)]])
|
||||
end)
|
||||
|
||||
it('does not perform updates when not needed', function()
|
||||
exec_lua [[vim.api.nvim_set_current_buf(diagnostic_bufnr)]]
|
||||
nvim("input", "o")
|
||||
eq({mode='i', blocking=false}, nvim("get_mode"))
|
||||
|
||||
-- Save the diagnostics
|
||||
exec_lua [[
|
||||
PublishDiagnostics = vim.lsp.with(vim.lsp.diagnostic.on_publish_diagnostics, {
|
||||
update_in_insert = false,
|
||||
virtual_text = true,
|
||||
})
|
||||
|
||||
-- Count how many times we call display.
|
||||
SetVirtualTextOriginal = vim.diagnostic._set_virtual_text
|
||||
|
||||
DisplayCount = 0
|
||||
vim.diagnostic._set_virtual_text = function(...)
|
||||
DisplayCount = DisplayCount + 1
|
||||
return SetVirtualTextOriginal(...)
|
||||
end
|
||||
|
||||
PublishDiagnostics(nil, {
|
||||
uri = fake_uri,
|
||||
diagnostics = {
|
||||
make_error('Delayed Diagnostic', 4, 4, 4, 4),
|
||||
}
|
||||
}, {client_id=1}
|
||||
)
|
||||
]]
|
||||
|
||||
-- No diagnostics displayed yet.
|
||||
eq({mode='i', blocking=false}, nvim("get_mode"))
|
||||
eq(1, exec_lua [[return vim.lsp.diagnostic.get_count(diagnostic_bufnr, "Error", 1)]])
|
||||
eq(0, exec_lua [[return count_of_extmarks_for_client(diagnostic_bufnr, 1)]])
|
||||
eq(0, exec_lua [[return DisplayCount]])
|
||||
|
||||
nvim("input", "<esc>")
|
||||
eq({mode='n', blocking=false}, nvim("get_mode"))
|
||||
|
||||
eq(1, exec_lua [[return vim.lsp.diagnostic.get_count(diagnostic_bufnr, "Error", 1)]])
|
||||
eq(2, exec_lua [[return count_of_extmarks_for_client(diagnostic_bufnr, 1)]])
|
||||
eq(1, exec_lua [[return DisplayCount]])
|
||||
|
||||
-- Go in and out of insert mode one more time.
|
||||
nvim("input", "o")
|
||||
eq({mode='i', blocking=false}, nvim("get_mode"))
|
||||
|
||||
nvim("input", "<esc>")
|
||||
eq({mode='n', blocking=false}, nvim("get_mode"))
|
||||
|
||||
-- Should not have set the virtual text again.
|
||||
eq(1, exec_lua [[return DisplayCount]])
|
||||
end)
|
||||
|
||||
it('never sets virtual text, in combination with insert leave', function()
|
||||
exec_lua [[vim.api.nvim_set_current_buf(diagnostic_bufnr)]]
|
||||
nvim("input", "o")
|
||||
eq({mode='i', blocking=false}, nvim("get_mode"))
|
||||
|
||||
-- Save the diagnostics
|
||||
exec_lua [[
|
||||
PublishDiagnostics = vim.lsp.with(vim.lsp.diagnostic.on_publish_diagnostics, {
|
||||
update_in_insert = false,
|
||||
virtual_text = false,
|
||||
})
|
||||
|
||||
-- Count how many times we call display.
|
||||
SetVirtualTextOriginal = vim.lsp.diagnostic.set_virtual_text
|
||||
|
||||
DisplayCount = 0
|
||||
vim.lsp.diagnostic.set_virtual_text = function(...)
|
||||
DisplayCount = DisplayCount + 1
|
||||
return SetVirtualTextOriginal(...)
|
||||
end
|
||||
|
||||
PublishDiagnostics(nil, {
|
||||
uri = fake_uri,
|
||||
diagnostics = {
|
||||
make_error('Delayed Diagnostic', 4, 4, 4, 4),
|
||||
}
|
||||
}, {client_id=1}
|
||||
)
|
||||
]]
|
||||
|
||||
-- No diagnostics displayed yet.
|
||||
eq({mode='i', blocking=false}, nvim("get_mode"))
|
||||
eq(1, exec_lua [[return vim.lsp.diagnostic.get_count(diagnostic_bufnr, "Error", 1)]])
|
||||
eq(0, exec_lua [[return count_of_extmarks_for_client(diagnostic_bufnr, 1)]])
|
||||
eq(0, exec_lua [[return DisplayCount]])
|
||||
|
||||
nvim("input", "<esc>")
|
||||
eq({mode='n', blocking=false}, nvim("get_mode"))
|
||||
|
||||
eq(1, exec_lua [[return vim.lsp.diagnostic.get_count(diagnostic_bufnr, "Error", 1)]])
|
||||
eq(1, exec_lua [[return count_of_extmarks_for_client(diagnostic_bufnr, 1)]])
|
||||
eq(0, exec_lua [[return DisplayCount]])
|
||||
|
||||
-- Go in and out of insert mode one more time.
|
||||
nvim("input", "o")
|
||||
eq({mode='i', blocking=false}, nvim("get_mode"))
|
||||
|
||||
nvim("input", "<esc>")
|
||||
eq({mode='n', blocking=false}, nvim("get_mode"))
|
||||
|
||||
-- Should not have set the virtual text still.
|
||||
eq(0, exec_lua [[return DisplayCount]])
|
||||
end)
|
||||
|
||||
it('can perform updates while in insert mode, if desired', function()
|
||||
exec_lua [[vim.api.nvim_set_current_buf(diagnostic_bufnr)]]
|
||||
nvim("input", "o")
|
||||
eq({mode='i', blocking=false}, nvim("get_mode"))
|
||||
|
||||
-- Save the diagnostics
|
||||
exec_lua [[
|
||||
vim.lsp.with(vim.lsp.diagnostic.on_publish_diagnostics, {
|
||||
update_in_insert = true,
|
||||
})(nil, {
|
||||
uri = fake_uri,
|
||||
diagnostics = {
|
||||
make_error('Delayed Diagnostic', 4, 4, 4, 4),
|
||||
}
|
||||
}, {client_id=1}
|
||||
)
|
||||
]]
|
||||
|
||||
-- Diagnostics are displayed, because the user wanted them that way!
|
||||
eq({mode='i', blocking=false}, nvim("get_mode"))
|
||||
eq(1, exec_lua [[return vim.lsp.diagnostic.get_count(diagnostic_bufnr, "Error", 1)]])
|
||||
eq(2, exec_lua [[return count_of_extmarks_for_client(diagnostic_bufnr, 1)]])
|
||||
|
||||
nvim("input", "<esc>")
|
||||
eq({mode='n', blocking=false}, nvim("get_mode"))
|
||||
|
||||
eq(1, exec_lua [[return vim.lsp.diagnostic.get_count(diagnostic_bufnr, "Error", 1)]])
|
||||
eq(2, exec_lua [[return count_of_extmarks_for_client(diagnostic_bufnr, 1)]])
|
||||
end)
|
||||
|
||||
it('allows configuring the virtual text via vim.lsp.with', function()
|
||||
local expected_spacing = 10
|
||||
local extmarks = exec_lua([[
|
||||
@@ -710,16 +131,10 @@ describe('vim.lsp.diagnostic', function()
|
||||
diagnostics = {
|
||||
make_error('Delayed Diagnostic', 4, 4, 4, 4),
|
||||
}
|
||||
}, {client_id=1}
|
||||
}, {client_id=client_id}
|
||||
)
|
||||
|
||||
return vim.api.nvim_buf_get_extmarks(
|
||||
diagnostic_bufnr,
|
||||
vim.lsp.diagnostic.get_namespace(1),
|
||||
0,
|
||||
-1,
|
||||
{ details = true }
|
||||
)
|
||||
return get_extmarks(diagnostic_bufnr, client_id)
|
||||
]], expected_spacing)
|
||||
|
||||
local virt_text = extmarks[1][4].virt_text
|
||||
@@ -728,7 +143,6 @@ describe('vim.lsp.diagnostic', function()
|
||||
eq(expected_spacing, #spacing)
|
||||
end)
|
||||
|
||||
|
||||
it('allows configuring the virtual text via vim.lsp.with using a function', function()
|
||||
local expected_spacing = 10
|
||||
local extmarks = exec_lua([[
|
||||
@@ -747,16 +161,10 @@ describe('vim.lsp.diagnostic', function()
|
||||
diagnostics = {
|
||||
make_error('Delayed Diagnostic', 4, 4, 4, 4),
|
||||
}
|
||||
}, {client_id=1}
|
||||
}, {client_id=client_id}
|
||||
)
|
||||
|
||||
return vim.api.nvim_buf_get_extmarks(
|
||||
diagnostic_bufnr,
|
||||
vim.lsp.diagnostic.get_namespace(1),
|
||||
0,
|
||||
-1,
|
||||
{ details = true }
|
||||
)
|
||||
return get_extmarks(diagnostic_bufnr, client_id)
|
||||
]], expected_spacing)
|
||||
|
||||
local virt_text = extmarks[1][4].virt_text
|
||||
@@ -780,10 +188,10 @@ describe('vim.lsp.diagnostic', function()
|
||||
diagnostics = {
|
||||
make_warning('Delayed Diagnostic', 4, 4, 4, 4),
|
||||
}
|
||||
}, {client_id=1}
|
||||
}, {client_id=client_id}
|
||||
)
|
||||
|
||||
return count_of_extmarks_for_client(diagnostic_bufnr, 1)
|
||||
return #get_extmarks(diagnostic_bufnr, client_id)
|
||||
]], severity_limit)
|
||||
end
|
||||
|
||||
@@ -799,16 +207,6 @@ describe('vim.lsp.diagnostic', function()
|
||||
local line = "All 💼 and no 🎉 makes Jack a dull 👦"
|
||||
local result = exec_lua([[
|
||||
local line = ...
|
||||
local client_id = vim.lsp.start_client {
|
||||
cmd_env = {
|
||||
NVIM_LUA_NOTRACK = "1";
|
||||
};
|
||||
cmd = {
|
||||
vim.v.progpath, '-es', '-u', 'NONE', '--headless'
|
||||
};
|
||||
offset_encoding = "utf-16";
|
||||
}
|
||||
|
||||
vim.api.nvim_buf_set_lines(diagnostic_bufnr, 0, -1, false, {line})
|
||||
|
||||
vim.lsp.diagnostic.on_publish_diagnostics(nil, {
|
||||
@@ -829,145 +227,4 @@ describe('vim.lsp.diagnostic', function()
|
||||
eq(exec_lua([[return vim.str_byteindex(..., 8, true)]], line), result[1].end_col)
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('lsp.util.show_line_diagnostics', function()
|
||||
it('creates floating window and returns popup bufnr and winnr if current line contains diagnostics', function()
|
||||
-- Two lines:
|
||||
-- Diagnostic:
|
||||
-- 1. <msg>
|
||||
eq(2, exec_lua [[
|
||||
local buffer = vim.api.nvim_create_buf(false, true)
|
||||
vim.api.nvim_buf_set_lines(buffer, 0, -1, false, {
|
||||
"testing";
|
||||
"123";
|
||||
})
|
||||
local diagnostics = {
|
||||
{
|
||||
range = {
|
||||
start = { line = 0; character = 1; };
|
||||
["end"] = { line = 0; character = 3; };
|
||||
};
|
||||
severity = vim.lsp.protocol.DiagnosticSeverity.Error;
|
||||
message = "Syntax error";
|
||||
},
|
||||
}
|
||||
vim.api.nvim_win_set_buf(0, buffer)
|
||||
vim.lsp.diagnostic.save(diagnostics, buffer, 1)
|
||||
local popup_bufnr, winnr = vim.lsp.diagnostic.show_line_diagnostics()
|
||||
return #vim.api.nvim_buf_get_lines(popup_bufnr, 0, -1, false)
|
||||
]])
|
||||
end)
|
||||
|
||||
it('creates floating window and returns popup bufnr and winnr without header, if requested', function()
|
||||
-- One line (since no header):
|
||||
-- 1. <msg>
|
||||
eq(1, exec_lua [[
|
||||
local buffer = vim.api.nvim_create_buf(false, true)
|
||||
vim.api.nvim_buf_set_lines(buffer, 0, -1, false, {
|
||||
"testing";
|
||||
"123";
|
||||
})
|
||||
local diagnostics = {
|
||||
{
|
||||
range = {
|
||||
start = { line = 0; character = 1; };
|
||||
["end"] = { line = 0; character = 3; };
|
||||
};
|
||||
severity = vim.lsp.protocol.DiagnosticSeverity.Error;
|
||||
message = "Syntax error";
|
||||
},
|
||||
}
|
||||
vim.api.nvim_win_set_buf(0, buffer)
|
||||
vim.lsp.diagnostic.save(diagnostics, buffer, 1)
|
||||
local popup_bufnr, winnr = vim.lsp.diagnostic.show_line_diagnostics { show_header = false }
|
||||
return #vim.api.nvim_buf_get_lines(popup_bufnr, 0, -1, false)
|
||||
]])
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('set_signs', function()
|
||||
-- TODO(tjdevries): Find out why signs are not displayed when set from Lua...??
|
||||
pending('sets signs by default', function()
|
||||
exec_lua [[
|
||||
PublishDiagnostics = vim.lsp.with(vim.lsp.diagnostic.on_publish_diagnostics, {
|
||||
update_in_insert = true,
|
||||
signs = true,
|
||||
})
|
||||
|
||||
local diagnostics = {
|
||||
make_error('Delayed Diagnostic', 1, 1, 1, 2),
|
||||
make_error('Delayed Diagnostic', 3, 3, 3, 3),
|
||||
}
|
||||
|
||||
vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
|
||||
vim.lsp.diagnostic.on_publish_diagnostics(nil, {
|
||||
uri = fake_uri,
|
||||
diagnostics = diagnostics
|
||||
}, {client_id=1}
|
||||
)
|
||||
|
||||
vim.lsp.diagnostic.set_signs(diagnostics, diagnostic_bufnr, 1)
|
||||
-- return vim.fn.sign_getplaced()
|
||||
]]
|
||||
|
||||
nvim("input", "o")
|
||||
nvim("input", "<esc>")
|
||||
|
||||
-- TODO(tjdevries): Find a way to get the signs to display in the test...
|
||||
eq(nil, exec_lua [[
|
||||
return im.fn.sign_getplaced()[1].signs
|
||||
]])
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('set_loclist()', function()
|
||||
it('sets diagnostics in lnum order', function()
|
||||
local loc_list = exec_lua [[
|
||||
vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
|
||||
|
||||
vim.lsp.diagnostic.on_publish_diagnostics(nil, {
|
||||
uri = fake_uri,
|
||||
diagnostics = {
|
||||
make_error('Farther Diagnostic', 4, 4, 4, 4),
|
||||
make_error('Lower Diagnostic', 1, 1, 1, 1),
|
||||
}
|
||||
}, {client_id=1}
|
||||
)
|
||||
|
||||
vim.lsp.diagnostic.set_loclist()
|
||||
|
||||
return vim.fn.getloclist(0)
|
||||
]]
|
||||
|
||||
assert(loc_list[1].lnum < loc_list[2].lnum)
|
||||
end)
|
||||
|
||||
it('sets diagnostics in lnum order, regardless of client', function()
|
||||
local loc_list = exec_lua [[
|
||||
vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
|
||||
|
||||
vim.lsp.diagnostic.on_publish_diagnostics(nil, {
|
||||
uri = fake_uri,
|
||||
diagnostics = {
|
||||
make_error('Lower Diagnostic', 1, 1, 1, 1),
|
||||
}
|
||||
}, {client_id=1}
|
||||
)
|
||||
|
||||
vim.lsp.diagnostic.on_publish_diagnostics(nil, {
|
||||
uri = fake_uri,
|
||||
diagnostics = {
|
||||
make_warning('Farther Diagnostic', 4, 4, 4, 4),
|
||||
}
|
||||
}, {client_id=2}
|
||||
)
|
||||
|
||||
vim.lsp.diagnostic.set_loclist()
|
||||
|
||||
return vim.fn.getloclist(0)
|
||||
]]
|
||||
|
||||
assert(loc_list[1].lnum < loc_list[2].lnum)
|
||||
end)
|
||||
end)
|
||||
end)
|
||||
|
Reference in New Issue
Block a user