aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/lua
diff options
context:
space:
mode:
authorWilliam Boman <william@redwill.se>2022-07-09 01:00:34 +0200
committerGitHub <noreply@github.com>2022-07-09 01:00:34 +0200
commitd132a7a673d43b2da73f75e09fbe7fb49c431514 (patch)
tree4b3b10d68ee149382d71b6977664bcb9d6dd2d20 /scripts/lua
parentfeat: add black (#34) (diff)
downloadmason-d132a7a673d43b2da73f75e09fbe7fb49c431514.tar
mason-d132a7a673d43b2da73f75e09fbe7fb49c431514.tar.gz
mason-d132a7a673d43b2da73f75e09fbe7fb49c431514.tar.bz2
mason-d132a7a673d43b2da73f75e09fbe7fb49c431514.tar.lz
mason-d132a7a673d43b2da73f75e09fbe7fb49c431514.tar.xz
mason-d132a7a673d43b2da73f75e09fbe7fb49c431514.tar.zst
mason-d132a7a673d43b2da73f75e09fbe7fb49c431514.zip
chore(workflow): modularize scripts and remove mason-lspconfig from CI checks (#36)
Diffstat (limited to 'scripts/lua')
-rw-r--r--scripts/lua/mason-scripts/mason-lspconfig/generate.lua39
-rw-r--r--scripts/lua/mason-scripts/mason-schemas/generate.lua63
-rw-r--r--scripts/lua/mason-scripts/mason/generate.lua49
-rw-r--r--scripts/lua/mason-scripts/utils.lua21
4 files changed, 172 insertions, 0 deletions
diff --git a/scripts/lua/mason-scripts/mason-lspconfig/generate.lua b/scripts/lua/mason-scripts/mason-lspconfig/generate.lua
new file mode 100644
index 00000000..2fa58692
--- /dev/null
+++ b/scripts/lua/mason-scripts/mason-lspconfig/generate.lua
@@ -0,0 +1,39 @@
+local a = require "mason-core.async"
+local path = require "mason-core.path"
+local _ = require "mason-core.functional"
+local lspconfig_server_mapping = require "mason-lspconfig.mappings.server"
+local script_utils = require "mason-scripts.utils"
+
+local MASON_LSPCONFIG_DIR = path.concat { vim.loop.cwd(), "lua", "mason-lspconfig" }
+
+local function get_lspconfig(name)
+ return require(("lspconfig.server_configurations.%s"):format(name))
+end
+
+---@async
+local function create_lspconfig_filetype_map()
+ local filetype_map = {}
+
+ for _, server_name in ipairs(_.keys(lspconfig_server_mapping.lspconfig_to_package)) do
+ local config = get_lspconfig(server_name)
+ for _, filetype in ipairs(config.default_config.filetypes or {}) do
+ if not filetype_map[filetype] then
+ filetype_map[filetype] = {}
+ end
+ table.insert(filetype_map[filetype], server_name)
+ table.sort(filetype_map[filetype])
+ end
+ end
+
+ script_utils.write_file(
+ path.concat { MASON_LSPCONFIG_DIR, "mappings", "filetype.lua" },
+ "return " .. vim.inspect(filetype_map),
+ "w"
+ )
+end
+
+a.run_blocking(function()
+ a.wait_all {
+ create_lspconfig_filetype_map,
+ }
+end)
diff --git a/scripts/lua/mason-scripts/mason-schemas/generate.lua b/scripts/lua/mason-scripts/mason-schemas/generate.lua
new file mode 100644
index 00000000..20793fcb
--- /dev/null
+++ b/scripts/lua/mason-scripts/mason-schemas/generate.lua
@@ -0,0 +1,63 @@
+local a = require "mason-core.async"
+local path = require "mason-core.path"
+local fetch = require "mason-core.fetch"
+local _ = require "mason-core.functional"
+local lspconfig_server_mapping = require "mason-lspconfig.mappings.server"
+local script_utils = require "mason-scripts.utils"
+
+local MASON_SCHEMAS_DIR = path.concat { vim.loop.cwd(), "lua", "mason-schemas" }
+
+---@async
+local function create_lsp_setting_schema_files()
+ local lsp_schemas_path = path.concat { MASON_SCHEMAS_DIR, "lsp" }
+
+ for _, file in
+ ipairs(vim.fn.glob(
+ path.concat {
+ lsp_schemas_path,
+ "*",
+ },
+ 1,
+ 1
+ ))
+ do
+ print("Deleting " .. file)
+ vim.fn.delete(file)
+ end
+
+ local gist_data = fetch(
+ "https://gist.githubusercontent.com/williamboman/a01c3ce1884d4b57cc93422e7eae7702/raw/lsp-packages.json"
+ ):get_or_throw()
+ local package_json_mappings = vim.json.decode(gist_data)
+
+ for _, server_name in ipairs(_.keys(lspconfig_server_mapping.lspconfig_to_package)) do
+ local package_json_url = package_json_mappings[server_name]
+ if package_json_url then
+ print(("Fetching %q..."):format(package_json_url))
+ local response = fetch(package_json_url):get_or_throw()
+ local schema = vim.json.decode(response)
+ if schema.contributes and schema.contributes.configuration then
+ schema = schema.contributes.configuration
+ end
+ if not schema.properties then
+ -- Some servers (like dartls) seem to provide an array of configurations (for more than just LSP stuff)
+ print(("Could not find appropriate schema structure for %s."):format(server_name))
+ else
+ script_utils.write_file(
+ path.concat {
+ lsp_schemas_path,
+ ("%s.lua"):format(lspconfig_server_mapping.lspconfig_to_package[server_name]),
+ },
+ "return " .. vim.inspect(schema, { newline = "", indent = "" }),
+ "w"
+ )
+ end
+ end
+ end
+end
+
+a.run_blocking(function()
+ a.wait_all {
+ create_lsp_setting_schema_files,
+ }
+end)
diff --git a/scripts/lua/mason-scripts/mason/generate.lua b/scripts/lua/mason-scripts/mason/generate.lua
new file mode 100644
index 00000000..5d02ab56
--- /dev/null
+++ b/scripts/lua/mason-scripts/mason/generate.lua
@@ -0,0 +1,49 @@
+local a = require "mason-core.async"
+local path = require "mason-core.path"
+local _ = require "mason-core.functional"
+local registry = require "mason-registry"
+local script_utils = require "mason-scripts.utils"
+
+local MASON_DIR = path.concat { vim.loop.cwd(), "lua", "mason" }
+local MASON_REGISTRY_DIR = path.concat { vim.loop.cwd(), "lua", "mason-registry" }
+
+---@async
+local function create_language_map()
+ local language_map = {}
+ local sorted_packages = _.sort_by(_.prop "name", registry.get_all_packages())
+ _.each(function(pkg)
+ _.each(function(language)
+ local language_lc = language:lower()
+ language_map[language_lc] = _.append(pkg.name, language_map[language_lc] or {})
+ end, pkg.spec.languages)
+ end, sorted_packages)
+
+ script_utils.write_file(
+ path.concat { MASON_DIR, "mappings", "language.lua" },
+ "return " .. vim.inspect(language_map),
+ "w"
+ )
+end
+
+---@async
+local function create_package_index()
+ a.scheduler()
+ local packages = {}
+ local to_lua_path = _.compose(_.gsub("/", "."), _.gsub("^lua/", ""))
+ for _, package_path in ipairs(vim.fn.glob("lua/mason-registry/*/init.lua", false, true)) do
+ local package_filename = vim.fn.fnamemodify(package_path, ":h:t")
+ local lua_path = to_lua_path(vim.fn.fnamemodify(package_path, ":h"))
+ local pkg = require(lua_path)
+ assert(package_filename == pkg.name, ("Package name is not the same as its module name %s"):format(lua_path))
+ packages[pkg.name] = lua_path
+ end
+
+ script_utils.write_file(path.concat { MASON_REGISTRY_DIR, "index.lua" }, "return " .. vim.inspect(packages), "w")
+end
+
+a.run_blocking(function()
+ a.wait_all {
+ create_language_map,
+ create_package_index,
+ }
+end)
diff --git a/scripts/lua/mason-scripts/utils.lua b/scripts/lua/mason-scripts/utils.lua
new file mode 100644
index 00000000..771d419a
--- /dev/null
+++ b/scripts/lua/mason-scripts/utils.lua
@@ -0,0 +1,21 @@
+local fs = require "mason-core.fs"
+
+local M = {}
+
+---@async
+---@param path string
+---@param contents string
+---@param flags string
+function M.write_file(path, contents, flags)
+ fs.async.write_file(
+ path,
+ table.concat({
+ "-- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.",
+ "-- stylua: ignore start",
+ contents,
+ }, "\n"),
+ flags
+ )
+end
+
+return M