Merge #11669 'LSP: differentiate diagnostic underline by severity'

This commit is contained in:
Justin M. Keyes 2020-01-08 22:48:57 -08:00 committed by GitHub
commit 25afa10f92
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 128 additions and 91 deletions

View File

@ -57,24 +57,39 @@ use of |v:lua| to call Lua from Vimscript): >
autocmd Filetype python setlocal omnifunc=v:lua.vim.lsp.omnifunc
FAQ ~
================================================================================
FAQ *lsp-faq*
> How to force-reload LSP?
Stop all clients, then reload the buffer. >
- Q: How to force-reload LSP?
A: Stop all clients, then reload the buffer. >
:lua vim.lsp.stop_all_clients()
:edit
> Why isn't completion working?
In the buffer where you want to use LSP, check that 'omnifunc' is set to
"v:lua.vim.lsp.omnifunc": >
- Q: Why isn't completion working?
A: In the buffer where you want to use LSP, check that 'omnifunc' is set to
"v:lua.vim.lsp.omnifunc": >
:verbose set omnifunc?
Some other plugin may be overriding the option. To avoid that, you could set
the option in an |after-directory| ftplugin, e.g. "after/ftplugin/python.vim".
< Some other plugin may be overriding the option. To avoid that, you could
set the option in an |after-directory| ftplugin, e.g.
"after/ftplugin/python.vim".
================================================================================
LSP HIGHLIGHT *lsp-highlight*
When LSP is activated these highlight groups are defined:
LspDiagnosticsError
LspDiagnosticsHint
LspDiagnosticsInformation
LspDiagnosticsUnderline
LspDiagnosticsUnderlineError
LspDiagnosticsUnderlineHint
LspDiagnosticsUnderlineInformation
LspDiagnosticsUnderlineWarning
LspDiagnosticsWarning
================================================================================
LSP API *lsp-api*

View File

@ -547,7 +547,12 @@ do
local diagnostic_ns = api.nvim_create_namespace("vim_lsp_diagnostics")
local underline_highlight_name = "LspDiagnosticsUnderline"
api.nvim_command(string.format("highlight default %s gui=underline cterm=underline", underline_highlight_name))
vim.cmd(string.format("highlight default %s gui=underline cterm=underline", underline_highlight_name))
for kind, _ in pairs(protocol.DiagnosticSeverity) do
if type(kind) == 'string' then
vim.cmd(string.format("highlight default link %s%s %s", underline_highlight_name, kind, underline_highlight_name))
end
end
local severity_highlights = {}
@ -657,13 +662,21 @@ do
function M.buf_diagnostics_underline(bufnr, diagnostics)
for _, diagnostic in ipairs(diagnostics) do
local start = diagnostic.range.start
local start = diagnostic.range["start"]
local finish = diagnostic.range["end"]
local hlmap = {
[protocol.DiagnosticSeverity.Error]='Error',
[protocol.DiagnosticSeverity.Warning]='Warning',
[protocol.DiagnosticSeverity.Information]='Information',
[protocol.DiagnosticSeverity.Hint]='Hint',
}
-- TODO care about encoding here since this is in byte index?
highlight_range(bufnr, diagnostic_ns, underline_highlight_name,
{start.line, start.character},
{finish.line, finish.character}
highlight_range(bufnr, diagnostic_ns,
underline_highlight_name..hlmap[diagnostic.severity],
{start.line, start.character},
{finish.line, finish.character}
)
end
end

View File

@ -559,6 +559,11 @@ function module.wait()
session:request('nvim_eval', '1')
end
function module.buf_lines(bufnr)
return module.exec_lua("return vim.api.nvim_buf_get_lines((...), 0, -1, false)", bufnr)
end
--@see buf_lines()
function module.curbuf_contents()
module.wait() -- Before inspecting the buffer, process all input.
return table.concat(module.curbuf('get_lines', 0, -1, true), '\n')

View File

@ -1,76 +0,0 @@
local helpers = require('test.functional.helpers')(after_each)
local eq = helpers.eq
local exec_lua = helpers.exec_lua
local dedent = helpers.dedent
local insert = helpers.insert
local clear = helpers.clear
describe('LSP util', function()
local test_text = dedent([[
First line of text
Second line of text
Third line of text
Fourth line of text]])
local function reset()
clear()
insert(test_text)
end
before_each(reset)
local function make_edit(y_0, x_0, y_1, x_1, text)
return {
range = {
start = { line = y_0, character = x_0 };
["end"] = { line = y_1, character = x_1 };
};
newText = type(text) == 'table' and table.concat(text, '\n') or (text or "");
}
end
local function buf_lines(bufnr)
return exec_lua("return vim.api.nvim_buf_get_lines((...), 0, -1, false)", bufnr)
end
describe('apply_edits', function()
it('should apply simple edits', function()
local edits = {
make_edit(0, 0, 0, 0, {"123"});
make_edit(1, 0, 1, 1, {"2"});
make_edit(2, 0, 2, 2, {"3"});
}
exec_lua('vim.lsp.util.apply_text_edits(...)', edits, 1)
eq({
'123First line of text';
'2econd line of text';
'3ird line of text';
'Fourth line of text';
}, buf_lines(1))
end)
it('should apply complex edits', function()
local edits = {
make_edit(0, 0, 0, 0, {"", "12"});
make_edit(0, 0, 0, 0, {"3", "foo"});
make_edit(0, 1, 0, 1, {"bar", "123"});
make_edit(0, #"First ", 0, #"First line of text", {"guy"});
make_edit(1, 0, 1, #'Second', {"baz"});
make_edit(2, #'Th', 2, #"Third", {"e next"});
make_edit(3, #'', 3, #"Fourth", {"another line of text", "before this"});
make_edit(3, #'Fourth', 3, #"Fourth line of text", {"!"});
}
exec_lua('vim.lsp.util.apply_text_edits(...)', edits, 1)
eq({
'';
'123';
'fooFbar';
'123irst guy';
'baz line of text';
'The next line of text';
'another line of text';
'before this!';
}, buf_lines(1))
end)
end)
end)

View File

@ -1,8 +1,11 @@
local helpers = require('test.functional.helpers')(after_each)
local clear = helpers.clear
local buf_lines = helpers.buf_lines
local dedent = helpers.dedent
local exec_lua = helpers.exec_lua
local eq = helpers.eq
local insert = helpers.insert
local iswin = helpers.iswin
local retry = helpers.retry
local NIL = helpers.NIL
@ -706,3 +709,80 @@ describe('LSP', function()
end)
end)
describe('LSP', function()
before_each(function()
clear()
end)
local function make_edit(y_0, x_0, y_1, x_1, text)
return {
range = {
start = { line = y_0, character = x_0 };
["end"] = { line = y_1, character = x_1 };
};
newText = type(text) == 'table' and table.concat(text, '\n') or (text or "");
}
end
it('highlight groups', function()
eq({'LspDiagnosticsError',
'LspDiagnosticsHint',
'LspDiagnosticsInformation',
'LspDiagnosticsUnderline',
'LspDiagnosticsUnderlineError',
'LspDiagnosticsUnderlineHint',
'LspDiagnosticsUnderlineInformation',
'LspDiagnosticsUnderlineWarning',
'LspDiagnosticsWarning',
},
exec_lua([[require'vim.lsp'; return vim.fn.getcompletion('Lsp', 'highlight')]]))
end)
describe('apply_edits', function()
before_each(function()
insert(dedent([[
First line of text
Second line of text
Third line of text
Fourth line of text]]))
end)
it('applies apply simple edits', function()
local edits = {
make_edit(0, 0, 0, 0, {"123"});
make_edit(1, 0, 1, 1, {"2"});
make_edit(2, 0, 2, 2, {"3"});
}
exec_lua('vim.lsp.util.apply_text_edits(...)', edits, 1)
eq({
'123First line of text';
'2econd line of text';
'3ird line of text';
'Fourth line of text';
}, buf_lines(1))
end)
it('applies complex edits', function()
local edits = {
make_edit(0, 0, 0, 0, {"", "12"});
make_edit(0, 0, 0, 0, {"3", "foo"});
make_edit(0, 1, 0, 1, {"bar", "123"});
make_edit(0, #"First ", 0, #"First line of text", {"guy"});
make_edit(1, 0, 1, #'Second', {"baz"});
make_edit(2, #'Th', 2, #"Third", {"e next"});
make_edit(3, #'', 3, #"Fourth", {"another line of text", "before this"});
make_edit(3, #'Fourth', 3, #"Fourth line of text", {"!"});
}
exec_lua('vim.lsp.util.apply_text_edits(...)', edits, 1)
eq({
'';
'123';
'fooFbar';
'123irst guy';
'baz line of text';
'The next line of text';
'another line of text';
'before this!';
}, buf_lines(1))
end)
end)
end)