aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilliam Boman <william@redwill.se>2023-12-01 16:11:39 +0100
committerGitHub <noreply@github.com>2023-12-01 16:11:39 +0100
commitdd67d01335a27bff4b5dcb580c7a4bce0f4e2105 (patch)
tree6a5a7b5cea269d26cc48656773b2c41714caf44f
parentfeat: add hydra_lsp mapping (#333) (diff)
downloadmason-lspconfig-dd67d01335a27bff4b5dcb580c7a4bce0f4e2105.tar
mason-lspconfig-dd67d01335a27bff4b5dcb580c7a4bce0f4e2105.tar.gz
mason-lspconfig-dd67d01335a27bff4b5dcb580c7a4bce0f4e2105.tar.bz2
mason-lspconfig-dd67d01335a27bff4b5dcb580c7a4bce0f4e2105.tar.lz
mason-lspconfig-dd67d01335a27bff4b5dcb580c7a4bce0f4e2105.tar.xz
mason-lspconfig-dd67d01335a27bff4b5dcb580c7a4bce0f4e2105.tar.zst
mason-lspconfig-dd67d01335a27bff4b5dcb580c7a4bce0f4e2105.zip
feat: add support for `*` filetype specifier (#335)
-rw-r--r--lua/mason-lspconfig/api/command.lua41
-rw-r--r--tests/mason-lspconfig/api/command_spec.lua18
2 files changed, 35 insertions, 24 deletions
diff --git a/lua/mason-lspconfig/api/command.lua b/lua/mason-lspconfig/api/command.lua
index 77db6eb..b0b100d 100644
--- a/lua/mason-lspconfig/api/command.lua
+++ b/lua/mason-lspconfig/api/command.lua
@@ -61,27 +61,26 @@ local function parse_packages_from_heuristics()
-- Prompt user which server they want to install (based on the current filetype)
local current_ft = vim.api.nvim_buf_get_option(vim.api.nvim_get_current_buf(), "filetype")
local filetype_mapping = require "mason-lspconfig.mappings.filetype"
- return Optional.of_nilable(filetype_mapping[current_ft])
- :if_not_present(function()
- notify(("No LSP servers found for filetype %q."):format(current_ft), vim.log.levels.ERROR)
- end)
- :map(function(server_names)
- return a.promisify(vim.ui.select)(server_names, {
- prompt = ("Please select which server you want to install for filetype %q:"):format(current_ft),
- format_item = function(server_name)
- if registry.is_installed(server_mapping.lspconfig_to_package[server_name]) then
- return ("%s (installed)"):format(server_name)
- else
- return server_name
- end
- end,
- })
- end)
- :map(function(server_name)
- local package_name = server_mapping.lspconfig_to_package[server_name]
- return { { package = package_name, version = nil } }
- end)
- :or_else_get(_.always {})
+ local server_names = _.flatten(_.concat(filetype_mapping[current_ft] or {}, filetype_mapping["*"] or {}))
+ if #server_names == 0 then
+ notify(("No LSP servers found for filetype %q."):format(current_ft), vim.log.levels.ERROR)
+ return {}
+ end
+ local server_name = a.promisify(vim.ui.select)(server_names, {
+ prompt = ("Please select which server you want to install for filetype %q:"):format(current_ft),
+ format_item = function(server_name)
+ if registry.is_installed(server_mapping.lspconfig_to_package[server_name]) then
+ return ("%s (installed)"):format(server_name)
+ else
+ return server_name
+ end
+ end,
+ })
+ if server_name == nil then
+ return {}
+ end
+ local package_name = server_mapping.lspconfig_to_package[server_name]
+ return { { package = package_name, version = nil } }
end
local parse_packages_to_install = _.cond {
diff --git a/tests/mason-lspconfig/api/command_spec.lua b/tests/mason-lspconfig/api/command_spec.lua
index adf0a33..0eeddea 100644
--- a/tests/mason-lspconfig/api/command_spec.lua
+++ b/tests/mason-lspconfig/api/command_spec.lua
@@ -9,9 +9,12 @@ local registry = require "mason-registry"
local server_mappings = require "mason-lspconfig.mappings.server"
describe(":LspInstall", function()
- server_mappings.lspconfig_to_package["dummylsp"] = "dummy"
- server_mappings.package_to_lspconfig["dummy"] = "dummylsp"
- filetype_mappings.dummylang = { "dummylsp" }
+ before_each(function()
+ server_mappings.lspconfig_to_package["dummylsp"] = "dummy"
+ server_mappings.package_to_lspconfig["dummy"] = "dummylsp"
+ filetype_mappings.dummylang = { "dummylsp" }
+ filetype_mappings["*"] = {}
+ end)
it("should install the provided servers", function()
local dummy = registry.get_package "dummy"
@@ -54,6 +57,15 @@ describe(":LspInstall", function()
assert.spy(vim.ui.select).was_called(0)
end)
)
+
+ it("should consider servers mapped to all filetypes", function()
+ filetype_mappings["*"] = { "omnilsp" }
+ spy.on(vim.ui, "select")
+ vim.cmd [[new | setf nolsplang]]
+ api.LspInstall {}
+ assert.spy(vim.ui.select).was_called(1)
+ assert.spy(vim.ui.select).was_called_with({ "omnilsp" }, match.is_table(), match.is_function())
+ end)
end)
describe(":LspUninstall", function()