87 lines
2.9 KiB
Lua
87 lines
2.9 KiB
Lua
|
local M = {}
|
||
|
|
||
|
M.setup = function()
|
||
|
local diagnostics_virtual_text = require("core.settings").diagnostics_virtual_text
|
||
|
local diagnostics_level = require("core.settings").diagnostics_level
|
||
|
|
||
|
local nvim_lsp = require("lspconfig")
|
||
|
local mason_lspconfig = require("mason-lspconfig")
|
||
|
require("lspconfig.ui.windows").default_options.border = "rounded"
|
||
|
|
||
|
require("modules.utils").load_plugin("mason-lspconfig", {
|
||
|
ensure_installed = require("core.settings").lsp_deps,
|
||
|
})
|
||
|
|
||
|
vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with(vim.lsp.diagnostic.on_publish_diagnostics, {
|
||
|
signs = true,
|
||
|
underline = true,
|
||
|
virtual_text = diagnostics_virtual_text and {
|
||
|
severity = {
|
||
|
min = vim.diagnostic.severity[diagnostics_level],
|
||
|
},
|
||
|
} or false,
|
||
|
-- set update_in_insert to false because it was enabled by lspsaga
|
||
|
update_in_insert = false,
|
||
|
})
|
||
|
|
||
|
local opts = {
|
||
|
capabilities = vim.tbl_deep_extend(
|
||
|
"force",
|
||
|
vim.lsp.protocol.make_client_capabilities(),
|
||
|
require("cmp_nvim_lsp").default_capabilities()
|
||
|
),
|
||
|
}
|
||
|
---A handler to setup all servers defined under `completion/servers/*.lua`
|
||
|
---@param lsp_name string
|
||
|
local function mason_lsp_handler(lsp_name)
|
||
|
-- rust_analyzer is configured using mrcjkb/rustaceanvim
|
||
|
-- warn users if they have set it up manually
|
||
|
if lsp_name == "rust_analyzer" then
|
||
|
local config_exist = pcall(require, "completion.servers." .. lsp_name)
|
||
|
if config_exist then
|
||
|
vim.notify(
|
||
|
[[
|
||
|
`rust_analyzer` is configured independently via `mrcjkb/rustaceanvim`. To get rid of this warning,
|
||
|
please REMOVE your LSP configuration (rust_analyzer.lua) from the `servers` directory and configure
|
||
|
`rust_analyzer` using the appropriate init options provided by `rustaceanvim` instead.]],
|
||
|
vim.log.levels.WARN,
|
||
|
{ title = "nvim-lspconfig" }
|
||
|
)
|
||
|
end
|
||
|
return
|
||
|
end
|
||
|
|
||
|
local ok, custom_handler = pcall(require, "user.configs.lsp-servers." .. lsp_name)
|
||
|
-- Use preset if there is no user definition
|
||
|
if not ok then
|
||
|
ok, custom_handler = pcall(require, "completion.servers." .. lsp_name)
|
||
|
end
|
||
|
if not ok then
|
||
|
-- Default to use factory config for server(s) that doesn't include a spec
|
||
|
nvim_lsp[lsp_name].setup(opts)
|
||
|
return
|
||
|
elseif type(custom_handler) == "function" then
|
||
|
--- Case where language server requires its own setup
|
||
|
--- Make sure to call require("lspconfig")[lsp_name].setup() in the function
|
||
|
--- See `clangd.lua` for example.
|
||
|
custom_handler(opts)
|
||
|
elseif type(custom_handler) == "table" then
|
||
|
nvim_lsp[lsp_name].setup(vim.tbl_deep_extend("force", opts, custom_handler))
|
||
|
else
|
||
|
vim.notify(
|
||
|
string.format(
|
||
|
"Failed to setup [%s].\n\nServer definition under `completion/servers` must return\neither a fun(opts) or a table (got '%s' instead)",
|
||
|
lsp_name,
|
||
|
type(custom_handler)
|
||
|
),
|
||
|
vim.log.levels.ERROR,
|
||
|
{ title = "nvim-lspconfig" }
|
||
|
)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
mason_lspconfig.setup_handlers({ mason_lsp_handler })
|
||
|
end
|
||
|
|
||
|
return M
|