diff options
-rw-r--r-- | lua/conform/lsp_format.lua | 13 | ||||
-rw-r--r-- | lua/conform/runner.lua | 8 | ||||
-rw-r--r-- | lua/conform/util.lua | 16 |
3 files changed, 29 insertions, 8 deletions
diff --git a/lua/conform/lsp_format.lua b/lua/conform/lsp_format.lua index 0315314..17d835f 100644 --- a/lua/conform/lsp_format.lua +++ b/lua/conform/lsp_format.lua @@ -1,4 +1,5 @@ ---This module replaces the default vim.lsp.buf.format() so that we can inject our own logic +local log = require("conform.log") local util = require("vim.lsp.util") local M = {} @@ -75,12 +76,22 @@ function M.format(options, callback) return callback() end local params = set_range(client, util.make_formatting_params(options.formatting_options)) + local auto_id = vim.api.nvim_create_autocmd("LspDetach", { + buffer = bufnr, + callback = function(args) + if args.data.client_id == client.id then + log.warn("LSP %s detached during format request", client.name) + callback("LSP detached") + end + end, + }) client.request(method, params, function(err, result, ctx, _) + vim.api.nvim_del_autocmd(auto_id) if not result then return callback(err or "No result returned from LSP formatter") elseif not vim.api.nvim_buf_is_valid(bufnr) then return callback("buffer was deleted") - elseif vim.b[bufnr].changedtick ~= changedtick then + elseif changedtick ~= util.buf_get_changedtick(bufnr) then return callback( string.format( diff --git a/lua/conform/runner.lua b/lua/conform/runner.lua index 7b3e468..a8ea203 100644 --- a/lua/conform/runner.lua +++ b/lua/conform/runner.lua @@ -467,14 +467,8 @@ M.format_async = function(bufnr, formatters, range, callback) return callback(err) end assert(output_lines) - local new_changedtick = vim.b[bufnr].changedtick - -- changedtick gets set to -1 when vim is exiting. We have an autocmd that should store it in - -- last_changedtick before it is set to -1. - if new_changedtick == -1 then - new_changedtick = vim.b[bufnr].last_changedtick or -1 - end -- discard formatting if buffer has changed - if not vim.api.nvim_buf_is_valid(bufnr) or changedtick ~= new_changedtick then + if not vim.api.nvim_buf_is_valid(bufnr) or changedtick ~= util.buf_get_changedtick(bufnr) then callback({ code = M.ERROR_CODE.CONCURRENT_MODIFICATION, message = string.format( diff --git a/lua/conform/util.lua b/lua/conform/util.lua index ec6af45..8a0073a 100644 --- a/lua/conform/util.lua +++ b/lua/conform/util.lua @@ -156,4 +156,20 @@ M.add_formatter_args = function(formatter, extra_args, opts) end end +---@param bufnr integer +---@return integer +M.buf_get_changedtick = function(bufnr) + if not vim.api.nvim_buf_is_valid(bufnr) then + return -2 + end + local changedtick = vim.b[bufnr].changedtick + -- changedtick gets set to -1 when vim is exiting. We have an autocmd that should store it in + -- last_changedtick before it is set to -1. + if changedtick == -1 then + return vim.b[bufnr].last_changedtick or -1 + else + return changedtick + end +end + return M |