aboutsummaryrefslogtreecommitdiff
path: root/test/functional/plugin/lsp/incremental_sync_spec.lua
diff options
context:
space:
mode:
authorJaehwang Jung <tomtomjhj@gmail.com>2024-07-31 23:18:24 +0900
committerGitHub <noreply@github.com>2024-07-31 16:18:24 +0200
commit6bb40f3dbffb4b9858d9b13486d1832db8f51755 (patch)
treee23791d44d85f18c9e85e17d981c995636481a3b /test/functional/plugin/lsp/incremental_sync_spec.lua
parent4e90bc30237ae81bf15e77c17ac8089a2cc74046 (diff)
downloadrneovim-6bb40f3dbffb4b9858d9b13486d1832db8f51755.tar.gz
rneovim-6bb40f3dbffb4b9858d9b13486d1832db8f51755.tar.bz2
rneovim-6bb40f3dbffb4b9858d9b13486d1832db8f51755.zip
fix(lsp): prevent desync due to empty buffer (#29904)
Problem: Some language servers (e.g., rust-analyzer, texlab) are desynced when the user deletes the entire contents of the buffer. This is due to the discrepancy between how nvim computes diff and how nvim treats empty buffer. * diff: If the buffer became empty, then the diff includes the last line's eol. * empty buffer: Even if the buffer is empty, nvim regards it as having a single empty line with eol. Solution: Add special case for diff computation when the buffer becomes empty so that it does not include the eol of the last line.
Diffstat (limited to 'test/functional/plugin/lsp/incremental_sync_spec.lua')
-rw-r--r--test/functional/plugin/lsp/incremental_sync_spec.lua44
1 files changed, 41 insertions, 3 deletions
diff --git a/test/functional/plugin/lsp/incremental_sync_spec.lua b/test/functional/plugin/lsp/incremental_sync_spec.lua
index 238b90b57d..1e463d5117 100644
--- a/test/functional/plugin/lsp/incremental_sync_spec.lua
+++ b/test/functional/plugin/lsp/incremental_sync_spec.lua
@@ -170,7 +170,7 @@ describe('incremental synchronization', function()
}
test_edit({ 'a' }, { 'rb' }, expected_text_changes, 'utf-16', '\n')
end)
- it('deleting a line', function()
+ it('deleting the first line', function()
local expected_text_changes = {
{
range = {
@@ -183,11 +183,49 @@ describe('incremental synchronization', function()
line = 1,
},
},
- rangeLength = 12,
+ rangeLength = 6,
+ text = '',
+ },
+ }
+ test_edit({ 'hello', 'world' }, { 'ggdd' }, expected_text_changes, 'utf-16', '\n')
+ end)
+ it('deleting the last line', function()
+ local expected_text_changes = {
+ {
+ range = {
+ ['start'] = {
+ character = 0,
+ line = 1,
+ },
+ ['end'] = {
+ character = 0,
+ line = 2,
+ },
+ },
+ rangeLength = 6,
+ text = '',
+ },
+ }
+ test_edit({ 'hello', 'world' }, { '2ggdd' }, expected_text_changes, 'utf-16', '\n')
+ end)
+ it('deleting all lines', function()
+ local expected_text_changes = {
+ {
+ range = {
+ ['start'] = {
+ character = 0,
+ line = 0,
+ },
+ ['end'] = {
+ character = 5,
+ line = 1,
+ },
+ },
+ rangeLength = 11,
text = '',
},
}
- test_edit({ 'hello world' }, { 'dd' }, expected_text_changes, 'utf-16', '\n')
+ test_edit({ 'hello', 'world' }, { 'ggdG' }, expected_text_changes, 'utf-16', '\n')
end)
it('deleting an empty line', function()
local expected_text_changes = {