mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
Merge pull request #11433 from bfredl/lspeol
lsp: transmit "\n" after last line when 'eol' is set
This commit is contained in:
commit
cc5487e32f
@ -23,7 +23,6 @@ local lsp = {
|
|||||||
-- format_rpc_error = lsp_rpc.format_rpc_error;
|
-- format_rpc_error = lsp_rpc.format_rpc_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
-- TODO consider whether 'eol' or 'fixeol' should change the nvim_buf_get_lines that send.
|
|
||||||
-- TODO improve handling of scratch buffers with LSP attached.
|
-- TODO improve handling of scratch buffers with LSP attached.
|
||||||
|
|
||||||
local function resolve_bufnr(bufnr)
|
local function resolve_bufnr(bufnr)
|
||||||
@ -175,6 +174,14 @@ local function validate_client_config(config)
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function buf_get_full_text(bufnr)
|
||||||
|
local text = table.concat(nvim_buf_get_lines(bufnr, 0, -1, true), '\n')
|
||||||
|
if nvim_buf_get_option(bufnr, 'eol') then
|
||||||
|
text = text .. '\n'
|
||||||
|
end
|
||||||
|
return text
|
||||||
|
end
|
||||||
|
|
||||||
local function text_document_did_open_handler(bufnr, client)
|
local function text_document_did_open_handler(bufnr, client)
|
||||||
if not client.resolved_capabilities.text_document_open_close then
|
if not client.resolved_capabilities.text_document_open_close then
|
||||||
return
|
return
|
||||||
@ -188,7 +195,7 @@ local function text_document_did_open_handler(bufnr, client)
|
|||||||
uri = vim.uri_from_bufnr(bufnr);
|
uri = vim.uri_from_bufnr(bufnr);
|
||||||
-- TODO make sure our filetypes are compatible with languageId names.
|
-- TODO make sure our filetypes are compatible with languageId names.
|
||||||
languageId = nvim_buf_get_option(bufnr, 'filetype');
|
languageId = nvim_buf_get_option(bufnr, 'filetype');
|
||||||
text = table.concat(nvim_buf_get_lines(bufnr, 0, -1, false), '\n');
|
text = buf_get_full_text(bufnr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
client.notify('textDocument/didOpen', params)
|
client.notify('textDocument/didOpen', params)
|
||||||
@ -551,7 +558,7 @@ do
|
|||||||
end)
|
end)
|
||||||
local full_changes = once(function()
|
local full_changes = once(function()
|
||||||
return {
|
return {
|
||||||
text = table.concat(nvim_buf_get_lines(bufnr, 0, -1, false), "\n");
|
text = buf_get_full_text(bufnr);
|
||||||
};
|
};
|
||||||
end)
|
end)
|
||||||
local uri = vim.uri_from_bufnr(bufnr)
|
local uri = vim.uri_from_bufnr(bufnr)
|
||||||
|
@ -170,7 +170,7 @@ function tests.basic_check_buffer_open()
|
|||||||
expect_notification('textDocument/didOpen', {
|
expect_notification('textDocument/didOpen', {
|
||||||
textDocument = {
|
textDocument = {
|
||||||
languageId = "";
|
languageId = "";
|
||||||
text = table.concat({"testing"; "123"}, "\n");
|
text = table.concat({"testing"; "123"}, "\n") .. '\n';
|
||||||
uri = "file://";
|
uri = "file://";
|
||||||
version = 0;
|
version = 0;
|
||||||
};
|
};
|
||||||
@ -197,7 +197,7 @@ function tests.basic_check_buffer_open_and_change()
|
|||||||
expect_notification('textDocument/didOpen', {
|
expect_notification('textDocument/didOpen', {
|
||||||
textDocument = {
|
textDocument = {
|
||||||
languageId = "";
|
languageId = "";
|
||||||
text = table.concat({"testing"; "123"}, "\n");
|
text = table.concat({"testing"; "123"}, "\n") .. '\n';
|
||||||
uri = "file://";
|
uri = "file://";
|
||||||
version = 0;
|
version = 0;
|
||||||
};
|
};
|
||||||
@ -208,7 +208,7 @@ function tests.basic_check_buffer_open_and_change()
|
|||||||
version = 3;
|
version = 3;
|
||||||
};
|
};
|
||||||
contentChanges = {
|
contentChanges = {
|
||||||
{ text = table.concat({"testing"; "boop"}, "\n"); };
|
{ text = table.concat({"testing"; "boop"}, "\n") .. '\n'; };
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
expect_notification("finish")
|
expect_notification("finish")
|
||||||
@ -217,7 +217,7 @@ function tests.basic_check_buffer_open_and_change()
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
function tests.basic_check_buffer_open_and_change_multi()
|
function tests.basic_check_buffer_open_and_change_noeol()
|
||||||
skeleton {
|
skeleton {
|
||||||
on_init = function(params)
|
on_init = function(params)
|
||||||
local expected_capabilities = protocol.make_client_capabilities()
|
local expected_capabilities = protocol.make_client_capabilities()
|
||||||
@ -244,7 +244,42 @@ function tests.basic_check_buffer_open_and_change_multi()
|
|||||||
version = 3;
|
version = 3;
|
||||||
};
|
};
|
||||||
contentChanges = {
|
contentChanges = {
|
||||||
{ text = table.concat({"testing"; "321"}, "\n"); };
|
{ text = table.concat({"testing"; "boop"}, "\n"); };
|
||||||
|
}
|
||||||
|
})
|
||||||
|
expect_notification("finish")
|
||||||
|
notify('finish')
|
||||||
|
end;
|
||||||
|
}
|
||||||
|
end
|
||||||
|
function tests.basic_check_buffer_open_and_change_multi()
|
||||||
|
skeleton {
|
||||||
|
on_init = function(params)
|
||||||
|
local expected_capabilities = protocol.make_client_capabilities()
|
||||||
|
assert_eq(params.capabilities, expected_capabilities)
|
||||||
|
return {
|
||||||
|
capabilities = {
|
||||||
|
textDocumentSync = protocol.TextDocumentSyncKind.Full;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end;
|
||||||
|
body = function()
|
||||||
|
notify('start')
|
||||||
|
expect_notification('textDocument/didOpen', {
|
||||||
|
textDocument = {
|
||||||
|
languageId = "";
|
||||||
|
text = table.concat({"testing"; "123"}, "\n") .. '\n';
|
||||||
|
uri = "file://";
|
||||||
|
version = 0;
|
||||||
|
};
|
||||||
|
})
|
||||||
|
expect_notification('textDocument/didChange', {
|
||||||
|
textDocument = {
|
||||||
|
uri = "file://";
|
||||||
|
version = 3;
|
||||||
|
};
|
||||||
|
contentChanges = {
|
||||||
|
{ text = table.concat({"testing"; "321"}, "\n") .. '\n'; };
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
expect_notification('textDocument/didChange', {
|
expect_notification('textDocument/didChange', {
|
||||||
@ -253,7 +288,7 @@ function tests.basic_check_buffer_open_and_change_multi()
|
|||||||
version = 4;
|
version = 4;
|
||||||
};
|
};
|
||||||
contentChanges = {
|
contentChanges = {
|
||||||
{ text = table.concat({"testing"; "boop"}, "\n"); };
|
{ text = table.concat({"testing"; "boop"}, "\n") .. '\n'; };
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
expect_notification("finish")
|
expect_notification("finish")
|
||||||
@ -278,7 +313,7 @@ function tests.basic_check_buffer_open_and_change_multi_and_close()
|
|||||||
expect_notification('textDocument/didOpen', {
|
expect_notification('textDocument/didOpen', {
|
||||||
textDocument = {
|
textDocument = {
|
||||||
languageId = "";
|
languageId = "";
|
||||||
text = table.concat({"testing"; "123"}, "\n");
|
text = table.concat({"testing"; "123"}, "\n") .. '\n';
|
||||||
uri = "file://";
|
uri = "file://";
|
||||||
version = 0;
|
version = 0;
|
||||||
};
|
};
|
||||||
@ -289,7 +324,7 @@ function tests.basic_check_buffer_open_and_change_multi_and_close()
|
|||||||
version = 3;
|
version = 3;
|
||||||
};
|
};
|
||||||
contentChanges = {
|
contentChanges = {
|
||||||
{ text = table.concat({"testing"; "321"}, "\n"); };
|
{ text = table.concat({"testing"; "321"}, "\n") .. '\n'; };
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
expect_notification('textDocument/didChange', {
|
expect_notification('textDocument/didChange', {
|
||||||
@ -298,7 +333,7 @@ function tests.basic_check_buffer_open_and_change_multi_and_close()
|
|||||||
version = 4;
|
version = 4;
|
||||||
};
|
};
|
||||||
contentChanges = {
|
contentChanges = {
|
||||||
{ text = table.concat({"testing"; "boop"}, "\n"); };
|
{ text = table.concat({"testing"; "boop"}, "\n") .. '\n'; };
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
expect_notification('textDocument/didClose', {
|
expect_notification('textDocument/didClose', {
|
||||||
@ -328,7 +363,7 @@ function tests.basic_check_buffer_open_and_change_incremental()
|
|||||||
expect_notification('textDocument/didOpen', {
|
expect_notification('textDocument/didOpen', {
|
||||||
textDocument = {
|
textDocument = {
|
||||||
languageId = "";
|
languageId = "";
|
||||||
text = table.concat({"testing"; "123"}, "\n");
|
text = table.concat({"testing"; "123"}, "\n") .. '\n';
|
||||||
uri = "file://";
|
uri = "file://";
|
||||||
version = 0;
|
version = 0;
|
||||||
};
|
};
|
||||||
|
@ -410,6 +410,54 @@ describe('Language Client API', function()
|
|||||||
}
|
}
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('should check the body and didChange full with noeol', function()
|
||||||
|
local expected_callbacks = {
|
||||||
|
{NIL, "shutdown", {}, 1};
|
||||||
|
{NIL, "finish", {}, 1};
|
||||||
|
{NIL, "start", {}, 1};
|
||||||
|
}
|
||||||
|
local client
|
||||||
|
test_rpc_server {
|
||||||
|
test_name = "basic_check_buffer_open_and_change_noeol";
|
||||||
|
on_setup = function()
|
||||||
|
exec_lua [[
|
||||||
|
BUFFER = vim.api.nvim_create_buf(false, true)
|
||||||
|
vim.api.nvim_buf_set_lines(BUFFER, 0, -1, false, {
|
||||||
|
"testing";
|
||||||
|
"123";
|
||||||
|
})
|
||||||
|
vim.api.nvim_buf_set_option(BUFFER, 'eol', false)
|
||||||
|
]]
|
||||||
|
end;
|
||||||
|
on_init = function(_client)
|
||||||
|
client = _client
|
||||||
|
local full_kind = exec_lua("return require'vim.lsp.protocol'.TextDocumentSyncKind.Full")
|
||||||
|
eq(full_kind, client.resolved_capabilities().text_document_did_change)
|
||||||
|
eq(true, client.resolved_capabilities().text_document_open_close)
|
||||||
|
exec_lua [[
|
||||||
|
assert(lsp.buf_attach_client(BUFFER, TEST_RPC_CLIENT_ID))
|
||||||
|
]]
|
||||||
|
end;
|
||||||
|
on_exit = function(code, signal)
|
||||||
|
eq(0, code, "exit code") eq(0, signal, "exit signal")
|
||||||
|
end;
|
||||||
|
on_callback = function(err, method, params, client_id)
|
||||||
|
if method == 'start' then
|
||||||
|
exec_lua [[
|
||||||
|
vim.api.nvim_buf_set_lines(BUFFER, 1, 2, false, {
|
||||||
|
"boop";
|
||||||
|
})
|
||||||
|
]]
|
||||||
|
client.notify('finish')
|
||||||
|
end
|
||||||
|
eq(table.remove(expected_callbacks), {err, method, params, client_id}, "expected callback")
|
||||||
|
if method == 'finish' then
|
||||||
|
client.stop()
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
}
|
||||||
|
end)
|
||||||
|
|
||||||
-- TODO(askhan) we don't support full for now, so we can disable these tests.
|
-- TODO(askhan) we don't support full for now, so we can disable these tests.
|
||||||
pending('should check the body and didChange incremental', function()
|
pending('should check the body and didChange incremental', function()
|
||||||
local expected_callbacks = {
|
local expected_callbacks = {
|
||||||
|
Loading…
Reference in New Issue
Block a user