fix(diagnostic): preserve fields from LSP diagnostics via user_data (#15735)

* preserve fields from LSP diagnostics via adding a user_data table to the diagnostic, which can hold arbitrary data in addition to the lsp diagnostic information.
This commit is contained in:
Gregory Anders 2021-09-21 16:27:12 -06:00 committed by GitHub
parent 8164adc144
commit 17b7968f02
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 38 additions and 3 deletions

View File

@ -102,7 +102,16 @@ local function diagnostic_lsp_to_vim(diagnostics, bufnr, client_id)
end_lnum = _end.line, end_lnum = _end.line,
end_col = line_byte_from_position(buf_lines, _end.line, _end.character, offset_encoding), end_col = line_byte_from_position(buf_lines, _end.line, _end.character, offset_encoding),
severity = severity_lsp_to_vim(diagnostic.severity), severity = severity_lsp_to_vim(diagnostic.severity),
message = diagnostic.message message = diagnostic.message,
user_data = {
lsp = {
code = diagnostic.code,
codeDescription = diagnostic.codeDescription,
tags = diagnostic.tags,
relatedInformation = diagnostic.relatedInformation,
data = diagnostic.data,
},
},
} }
end, diagnostics) end, diagnostics)
end end
@ -110,7 +119,7 @@ end
---@private ---@private
local function diagnostic_vim_to_lsp(diagnostics) local function diagnostic_vim_to_lsp(diagnostics)
return vim.tbl_map(function(diagnostic) return vim.tbl_map(function(diagnostic)
return { return vim.tbl_extend("error", {
range = { range = {
start = { start = {
line = diagnostic.lnum, line = diagnostic.lnum,
@ -123,7 +132,7 @@ local function diagnostic_vim_to_lsp(diagnostics)
}, },
severity = severity_vim_to_lsp(diagnostic.severity), severity = severity_vim_to_lsp(diagnostic.severity),
message = diagnostic.message, message = diagnostic.message,
} }, diagnostic.user_data and (diagnostic.user_data.lsp or {}) or {})
end, diagnostics) end, diagnostics)
end end

View File

@ -428,6 +428,32 @@ describe('vim.lsp.diagnostic', function()
end) end)
end) end)
end) end)
it('maintains LSP information when translating diagnostics', function()
local result = exec_lua [[
local diagnostics = {
make_error("Error 1", 1, 1, 1, 5),
}
diagnostics[1].code = 42
diagnostics[1].tags = {"foo", "bar"}
diagnostics[1].data = "Hello world"
vim.lsp.diagnostic.on_publish_diagnostics(nil, {
uri = fake_uri,
diagnostics = diagnostics,
}, {client_id=1})
return {
vim.diagnostic.get(diagnostic_bufnr, {lnum=1})[1],
vim.lsp.diagnostic.get_line_diagnostics(diagnostic_bufnr, 1)[1],
}
]]
eq({code = 42, tags = {"foo", "bar"}, data = "Hello world"}, result[1].user_data.lsp)
eq(42, result[2].code)
eq({"foo", "bar"}, result[2].tags)
eq("Hello world", result[2].data)
end)
end) end)
describe("vim.lsp.diagnostic.get_line_diagnostics", function() describe("vim.lsp.diagnostic.get_line_diagnostics", function()