mirror of
https://github.com/LazyVim/LazyVim.git
synced 2025-12-25 12:14:19 +01:00
91 lines
2.3 KiB
Lua
91 lines
2.3 KiB
Lua
---@class lazyvim.util.lsp
|
|
local M = {}
|
|
|
|
---@param opts? LazyFormatter| {filter?: (string|vim.lsp.get_clients.Filter)}
|
|
function M.formatter(opts)
|
|
opts = opts or {}
|
|
local filter = opts.filter or {}
|
|
filter = type(filter) == "string" and { name = filter } or filter
|
|
---@cast filter vim.lsp.get_clients.Filter
|
|
---@type LazyFormatter
|
|
local ret = {
|
|
name = "LSP",
|
|
primary = true,
|
|
priority = 1,
|
|
format = function(buf)
|
|
M.format(LazyVim.merge({}, filter, { bufnr = buf }))
|
|
end,
|
|
sources = function(buf)
|
|
local clients = vim.lsp.get_clients(LazyVim.merge({}, filter, { bufnr = buf }))
|
|
---@param client vim.lsp.Client
|
|
local ret = vim.tbl_filter(function(client)
|
|
return client:supports_method("textDocument/formatting")
|
|
or client:supports_method("textDocument/rangeFormatting")
|
|
end, clients)
|
|
---@param client vim.lsp.Client
|
|
return vim.tbl_map(function(client)
|
|
return client.name
|
|
end, ret)
|
|
end,
|
|
}
|
|
return LazyVim.merge(ret, opts) --[[@as LazyFormatter]]
|
|
end
|
|
|
|
---@alias lsp.Client.format {timeout_ms?: number, format_options?: table} | vim.lsp.get_clients.Filter
|
|
|
|
---@param opts? lsp.Client.format
|
|
function M.format(opts)
|
|
opts = vim.tbl_deep_extend(
|
|
"force",
|
|
{},
|
|
opts or {},
|
|
LazyVim.opts("nvim-lspconfig").format or {},
|
|
LazyVim.opts("conform.nvim").format or {}
|
|
)
|
|
local ok, conform = pcall(require, "conform")
|
|
-- use conform for formatting with LSP when available,
|
|
-- since it has better format diffing
|
|
if ok then
|
|
opts.formatters = {}
|
|
conform.format(opts)
|
|
else
|
|
vim.lsp.buf.format(opts)
|
|
end
|
|
end
|
|
|
|
M.action = setmetatable({}, {
|
|
__index = function(_, action)
|
|
return function()
|
|
vim.lsp.buf.code_action({
|
|
apply = true,
|
|
context = {
|
|
only = { action },
|
|
diagnostics = {},
|
|
},
|
|
})
|
|
end
|
|
end,
|
|
})
|
|
|
|
---@class LspCommand: lsp.ExecuteCommandParams
|
|
---@field open? boolean
|
|
---@field handler? lsp.Handler
|
|
|
|
---@param opts LspCommand
|
|
function M.execute(opts)
|
|
local params = {
|
|
command = opts.command,
|
|
arguments = opts.arguments,
|
|
}
|
|
if opts.open then
|
|
require("trouble").open({
|
|
mode = "lsp_command",
|
|
params = params,
|
|
})
|
|
else
|
|
return vim.lsp.buf_request(0, "workspace/executeCommand", params, opts.handler)
|
|
end
|
|
end
|
|
|
|
return M
|