aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim/lsp.lua
diff options
context:
space:
mode:
authorMathias Fußenegger <mfussenegger@users.noreply.github.com>2022-08-01 22:32:53 +0200
committerGitHub <noreply@github.com>2022-08-01 22:32:53 +0200
commite99de3f12f00662e8131fed9912792f6d43c4975 (patch)
tree45b75fa49f1dc134d6cf84f69a66c25a425d7fba /runtime/lua/vim/lsp.lua
parent711ef4eac9e5126d37dd4acd1384b7df372d7315 (diff)
downloadrneovim-e99de3f12f00662e8131fed9912792f6d43c4975.tar.gz
rneovim-e99de3f12f00662e8131fed9912792f6d43c4975.tar.bz2
rneovim-e99de3f12f00662e8131fed9912792f6d43c4975.zip
fix(lsp): send didOpen if name changes on write (#19583)
`:saveas newName` changes the name of an existing buffer. Due to the buffer re-use it skips the lsp attach phase and immediately sends a `didSave` notification to the server. Servers get confused about this, because they expect a `didOpen` notification first. Closes https://github.com/neovim/neovim/issues/18688
Diffstat (limited to 'runtime/lua/vim/lsp.lua')
-rw-r--r--runtime/lua/vim/lsp.lua26
1 files changed, 25 insertions, 1 deletions
diff --git a/runtime/lua/vim/lsp.lua b/runtime/lua/vim/lsp.lua
index 61586ca44f..bf2201d9c8 100644
--- a/runtime/lua/vim/lsp.lua
+++ b/runtime/lua/vim/lsp.lua
@@ -371,7 +371,9 @@ do
state_by_client[client.id] = state
end
if not state.buffers[bufnr] then
- local buf_state = {}
+ local buf_state = {
+ name = api.nvim_buf_get_name(bufnr),
+ }
state.buffers[bufnr] = buf_state
if use_incremental_sync then
buf_state.lines = nvim_buf_get_lines(bufnr, 0, -1, true)
@@ -382,6 +384,15 @@ do
end
---@private
+ function changetracking._get_and_set_name(client, bufnr, name)
+ local state = state_by_client[client.id] or {}
+ local buf_state = (state.buffers or {})[bufnr]
+ local old_name = buf_state.name
+ buf_state.name = name
+ return old_name
+ end
+
+ ---@private
function changetracking.reset_buf(client, bufnr)
changetracking.flush(client, bufnr)
local state = state_by_client[client.id]
@@ -1405,6 +1416,19 @@ local function text_document_did_save_handler(bufnr)
local uri = vim.uri_from_bufnr(bufnr)
local text = once(buf_get_full_text)
for_each_buffer_client(bufnr, function(client)
+ local name = api.nvim_buf_get_name(bufnr)
+ local old_name = changetracking._get_and_set_name(client, bufnr, name)
+ if old_name and name ~= old_name then
+ client.notify('textDocument/didOpen', {
+ textDocument = {
+ version = 0,
+ uri = uri,
+ languageId = client.config.get_language_id(bufnr, vim.bo[bufnr].filetype),
+ text = buf_get_full_text(bufnr),
+ },
+ })
+ util.buf_versions[bufnr] = 0
+ end
local save_capability = vim.tbl_get(client.server_capabilities, 'textDocumentSync', 'save')
if save_capability then
local included_text