From 671186e4b29e26ee9fc0f1df4e529134bc334666 Mon Sep 17 00:00:00 2001 From: Steven Arcangeli Date: Fri, 29 Sep 2023 13:06:27 -0700 Subject: fix: injected formatter hangs on empty file --- lua/conform/formatters/injected.lua | 7 +++++++ lua/conform/runner.lua | 12 +++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/lua/conform/formatters/injected.lua b/lua/conform/formatters/injected.lua index 4990e05..bc4016c 100644 --- a/lua/conform/formatters/injected.lua +++ b/lua/conform/formatters/injected.lua @@ -53,6 +53,7 @@ return { end, format = function(ctx, lines, callback) local conform = require("conform") + local log = require("conform.log") local util = require("conform.util") local ok, parser = pcall(vim.treesitter.get_parser, ctx.buf) if not ok then @@ -78,6 +79,7 @@ return { table.sort(regions, function(a, b) return a[2] > b[2] end) + log.trace("Injected formatter regions %s", regions) local replacements = {} local format_error = nil @@ -124,6 +126,8 @@ return { local formatter_names = conform.formatters_by_ft[lang] local format_opts = { async = true, bufnr = ctx.buf, quiet = true } local idx = num_format + log.debug("Injected format %s:%d:%d: %s", lang, start_lnum, end_lnum, formatter_names) + log.trace("Injected format lines %s", input_lines) conform.format_lines(formatter_names, input_lines, format_opts, function(err, new_lines) -- Preserve indentation in case the code block is indented apply_indent(input_lines, new_lines) @@ -131,5 +135,8 @@ return { end) end end + if num_format == 0 then + apply_format_results() + end end, } diff --git a/lua/conform/runner.lua b/lua/conform/runner.lua index a8ea203..7530008 100644 --- a/lua/conform/runner.lua +++ b/lua/conform/runner.lua @@ -257,9 +257,17 @@ local last_run_errored = {} ---@param callback fun(err?: conform.Error, output?: string[]) ---@return integer? job_id local function run_formatter(bufnr, formatter, config, ctx, input_lines, callback) + log.info("Run %s on %s", formatter.name, vim.api.nvim_buf_get_name(bufnr)) + log.trace("Input lines: %s", input_lines) if config.format then ---@cast config conform.LuaFormatterConfig - config.format(ctx, input_lines, callback) + local ok, err = pcall(config.format, ctx, input_lines, callback) + if not ok then + callback({ + code = M.ERROR_CODE.RUNTIME, + message = string.format("Formatter '%s' error: %s", formatter.name, err), + }) + end return end ---@cast config conform.JobFormatterConfig @@ -283,14 +291,12 @@ local function run_formatter(bufnr, formatter, config, ctx, input_lines, callbac end end) - log.info("Run %s on %s", formatter.name, vim.api.nvim_buf_get_name(bufnr)) local buffer_text -- If the buffer has a newline at the end, make sure we include that in the input to the formatter local add_extra_newline = vim.bo[bufnr].eol if add_extra_newline then table.insert(input_lines, "") end - log.trace("Input lines: %s", input_lines) buffer_text = table.concat(input_lines, "\n") if add_extra_newline then table.remove(input_lines) -- cgit v1.2.3-70-g09d2