diff --git a/lua/rustaceanvim/config/internal.lua b/lua/rustaceanvim/config/internal.lua index 8f68710d..c5f2c30a 100644 --- a/lua/rustaceanvim/config/internal.lua +++ b/lua/rustaceanvim/config/internal.lua @@ -84,6 +84,14 @@ local function get_test_executor() return get_crate_test_executor() end +---@return fun(edits: rust.lsp.SnippetTextEdit[], bufnr: integer, offset_encoding: string, apply_text_edits: function) | nil +local function get_snippet_text_edit_handler() + local ok, luasnip = pcall(require, 'luasnip.extras.lsp') + if ok and luasnip.apply_text_edits then + return luasnip.apply_text_edits + end +end + ---@class RustaceanConfig local RustaceanDefaultConfig = { ---@class RustaceanToolsConfig @@ -100,6 +108,9 @@ local RustaceanDefaultConfig = { ---@type RustaceanExecutor crate_test_executor = get_crate_test_executor(), + ---@type fun(edits: rust.lsp.SnippetTextEdit[], bufnr: integer, offset_encoding: string, apply_text_edits: function) | nil + snippet_text_edit_handler = get_snippet_text_edit_handler(), + ---@type string | nil cargo_override = nil, diff --git a/lua/rustaceanvim/lsp.lua b/lua/rustaceanvim/lsp.lua index 00c73b91..e1353746 100644 --- a/lua/rustaceanvim/lsp.lua +++ b/lua/rustaceanvim/lsp.lua @@ -11,11 +11,21 @@ local os = require('rustaceanvim.os') local function override_apply_text_edits() local old_func = vim.lsp.util.apply_text_edits ---@diagnostic disable-next-line - vim.lsp.util.apply_text_edits = function(edits, bufnr, offset_encoding) - local overrides = require('rustaceanvim.overrides') - overrides.snippet_text_edits_to_text_edits(edits) - old_func(edits, bufnr, offset_encoding) - end + vim.lsp.util.apply_text_edits = config.tools.snippet_text_edit_handler + ---@param edits rust.lsp.SnippetTextEdit[] + ---@param bufnr number + ---@param offset_encoding string + and function(edits, bufnr, offset_encoding) + config.tools.snippet_text_edit_handler(edits, bufnr, offset_encoding, old_func) + end + ---@param edits rust.lsp.SnippetTextEdit[] + ---@param bufnr number + ---@param offset_encoding string + or function(edits, bufnr, offset_encoding) + local overrides = require('rustaceanvim.overrides') + overrides.snippet_text_edits_to_text_edits(edits) + old_func(edits, bufnr, offset_encoding) + end end ---@param client lsp.Client diff --git a/lua/rustaceanvim/meta.lua b/lua/rustaceanvim/meta.lua new file mode 100644 index 00000000..24b25adf --- /dev/null +++ b/lua/rustaceanvim/meta.lua @@ -0,0 +1,4 @@ +---@class rust.lsp.SnippetTextEdit +---@field insertTextFormat number +---@field newText string +---@field range table see |vim.lsp.util.make_range_params()| diff --git a/lua/rustaceanvim/overrides.lua b/lua/rustaceanvim/overrides.lua index 17521a74..e721ff1f 100644 --- a/lua/rustaceanvim/overrides.lua +++ b/lua/rustaceanvim/overrides.lua @@ -23,7 +23,7 @@ local function parse_snippet(input) return ok and tostring(parsed) or parse_snippet_fallback(input) end ----@param spe? table +---@param spe? rust.lsp.SnippetTextEdit[] function M.snippet_text_edits_to_text_edits(spe) if type(spe) ~= 'table' then return