diff options
author | Mathias Fußenegger <mfussenegger@users.noreply.github.com> | 2022-08-01 22:32:53 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-01 22:32:53 +0200 |
commit | e99de3f12f00662e8131fed9912792f6d43c4975 (patch) | |
tree | 45b75fa49f1dc134d6cf84f69a66c25a425d7fba /runtime/lua/vim/lsp.lua | |
parent | 711ef4eac9e5126d37dd4acd1384b7df372d7315 (diff) | |
download | rneovim-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.lua | 26 |
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 |