aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Arcangeli <stevearc@stevearc.com>2023-09-29 12:04:30 -0700
committerSteven Arcangeli <stevearc@stevearc.com>2023-09-29 12:23:26 -0700
commit0c52ee248245f40610a4957b6bc9515ce1fd9ab6 (patch)
tree451e753d11427e91aaf995609eda6653ce9ef10a
parentc5280d586e50ad6193b42df27e494b74a9efc5b7 (diff)
fix: format_after_save blocks on exit for lsp formatting
-rw-r--r--lua/conform/lsp_format.lua13
-rw-r--r--lua/conform/runner.lua8
-rw-r--r--lua/conform/util.lua16
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