From ba1ca20bb5f89a8bdd94b268411263275550843a Mon Sep 17 00:00:00 2001 From: Steven Arcangeli <506791+stevearc@users.noreply.github.com> Date: Thu, 5 Oct 2023 20:43:18 -0700 Subject: feat: expose configuration options for injected formatter (#118) --- lua/conform/formatters/injected.lua | 35 ++++++++++++++++++++++++++++++----- lua/conform/init.lua | 7 ++++--- lua/conform/runner.lua | 2 +- 3 files changed, 35 insertions(+), 9 deletions(-) (limited to 'lua') diff --git a/lua/conform/formatters/injected.lua b/lua/conform/formatters/injected.lua index db5b3ae..b9d3acd 100644 --- a/lua/conform/formatters/injected.lua +++ b/lua/conform/formatters/injected.lua @@ -60,17 +60,29 @@ local function apply_indent(lines, indentation) end end ----@type conform.FileLuaFormatterConfig +---@class conform.InjectedFormatterConfig : conform.FileLuaFormatterConfig +---@field format fun(self: conform.InjectedFormatterConfig, ctx: conform.Context, lines: string[], callback: fun(err: nil|string, new_lines: nil|string[])) +---@field condition? fun(self: conform.InjectedFormatterConfig, ctx: conform.Context): boolean +---@field options conform.InjectedFormatterOptions + +---@class (exact) conform.InjectedFormatterOptions +---@field ignore_errors boolean + +---@type conform.InjectedFormatterConfig return { meta = { url = "lua/conform/formatters/injected.lua", description = "Format treesitter injected languages.", }, - condition = function(ctx) + options = { + -- Set to true to ignore errors + ignore_errors = false, + }, + condition = function(self, ctx) local ok = pcall(vim.treesitter.get_parser, ctx.buf) return ok end, - format = function(ctx, lines, callback) + format = function(self, ctx, lines, callback) local conform = require("conform") local log = require("conform.log") local util = require("conform.util") @@ -112,8 +124,20 @@ return { local function apply_format_results() if format_error then - callback(format_error) - return + if self.options.ignore_errors then + -- Find all of the conform errors in the replacements table and remove them + local i = 1 + while i <= #replacements do + if replacements[i].code then + table.remove(replacements, i) + else + i = i + 1 + end + end + else + callback(format_error) + return + end end local formatted_lines = vim.deepcopy(lines) @@ -133,6 +157,7 @@ return { local formatter_cb = function(err, idx, start_lnum, end_lnum, new_lines) if err then format_error = err + replacements[idx] = err else replacements[idx] = { start_lnum, end_lnum, new_lines } end diff --git a/lua/conform/init.lua b/lua/conform/init.lua index ba2f8fc..fe6f934 100644 --- a/lua/conform/init.lua +++ b/lua/conform/init.lua @@ -19,8 +19,8 @@ local M = {} ---@field env? table|fun(ctx: conform.Context): table ---@class (exact) conform.LuaFormatterConfig ----@field format fun(ctx: conform.Context, lines: string[], callback: fun(err: nil|string, new_lines: nil|string[])) ----@field condition? fun(ctx: conform.Context): boolean +---@field format fun(self: conform.LuaFormatterConfig, ctx: conform.Context, lines: string[], callback: fun(err: nil|string, new_lines: nil|string[])) +---@field condition? fun(self: conform.LuaFormatterConfig, ctx: conform.Context): boolean ---@class (exact) conform.FileLuaFormatterConfig : conform.LuaFormatterConfig ---@field meta conform.FormatterMeta @@ -574,7 +574,8 @@ M.get_formatter_info = function(formatter, bufnr) local available = true local available_msg = nil if config.format then - if config.condition and not config.condition(ctx) then + ---@cast config conform.LuaFormatterConfig + if config.condition and not config:condition(ctx) then available = false available_msg = "Condition failed" end diff --git a/lua/conform/runner.lua b/lua/conform/runner.lua index b77678f..ef96e42 100644 --- a/lua/conform/runner.lua +++ b/lua/conform/runner.lua @@ -265,7 +265,7 @@ local function run_formatter(bufnr, formatter, config, ctx, input_lines, opts, c log.trace("Input lines: %s", input_lines) if config.format then ---@cast config conform.LuaFormatterConfig - local ok, err = pcall(config.format, ctx, input_lines, callback) + local ok, err = pcall(config.format, config, ctx, input_lines, callback) if not ok then callback({ code = M.ERROR_CODE.RUNTIME, -- cgit v1.2.3-70-g09d2