aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/lua/mason-scripts
diff options
context:
space:
mode:
authorWilliam Boman <william@redwill.se>2024-08-05 00:27:13 +0200
committerGitHub <noreply@github.com>2024-08-05 00:27:13 +0200
commitf3d1e41d812b5a4cfc98f646fbc9135dc91ccd59 (patch)
tree900565001954954b9e1c721dbf5a9c05f4407b18 /scripts/lua/mason-scripts
parentfeat: add steep configuration (#422) (diff)
downloadmason-lspconfig-f3d1e41d812b5a4cfc98f646fbc9135dc91ccd59.tar
mason-lspconfig-f3d1e41d812b5a4cfc98f646fbc9135dc91ccd59.tar.gz
mason-lspconfig-f3d1e41d812b5a4cfc98f646fbc9135dc91ccd59.tar.bz2
mason-lspconfig-f3d1e41d812b5a4cfc98f646fbc9135dc91ccd59.tar.lz
mason-lspconfig-f3d1e41d812b5a4cfc98f646fbc9135dc91ccd59.tar.xz
mason-lspconfig-f3d1e41d812b5a4cfc98f646fbc9135dc91ccd59.tar.zst
mason-lspconfig-f3d1e41d812b5a4cfc98f646fbc9135dc91ccd59.zip
docs: auto-generate available LSP servers list in readme (#445)
Diffstat (limited to 'scripts/lua/mason-scripts')
-rw-r--r--scripts/lua/mason-scripts/mason-lspconfig/generate.lua110
1 files changed, 104 insertions, 6 deletions
diff --git a/scripts/lua/mason-scripts/mason-lspconfig/generate.lua b/scripts/lua/mason-scripts/mason-lspconfig/generate.lua
index b522c26..3c31069 100644
--- a/scripts/lua/mason-scripts/mason-lspconfig/generate.lua
+++ b/scripts/lua/mason-scripts/mason-lspconfig/generate.lua
@@ -3,13 +3,14 @@ local Optional = require "mason-core.optional"
local _ = require "mason-core.functional"
local a = require "mason-core.async"
+local fs = require "mason-core.fs"
local lspconfig = require "lspconfig"
local lspconfig_server_mapping = require "mason-lspconfig.mappings.server"
local path = require "mason-core.path"
local script_utils = require "mason-scripts.utils"
-local DOCS_DIR = path.concat { vim.loop.cwd(), "doc" }
-local MASON_LSPCONFIG_DIR = path.concat { vim.loop.cwd(), "lua", "mason-lspconfig" }
+local DOCS_DIR = "doc"
+local MASON_LSPCONFIG_DIR = path.concat { "lua", "mason-lspconfig" }
require("mason").setup()
require("mason-registry").refresh()
@@ -50,6 +51,9 @@ local function ensure_valid_package_name_translations()
end
end
+local get_lspconfig_url =
+ _.format "https://github.com/neovim/nvim-lspconfig/blob/master/doc/server_configurations.md#%s"
+
local get_server_mappings = _.compose(
_.filter_map(function(pair)
local lspconfig_name, mason_name =
@@ -57,14 +61,11 @@ local get_server_mappings = _.compose(
if not pcall(require, ("lspconfig.server_configurations.%s"):format(lspconfig_name)) then
return Optional.empty()
end
- local lspconfig_url = ("https://github.com/neovim/nvim-lspconfig/blob/master/doc/server_configurations.md#%s"):format(
- lspconfig_name
- )
local mason_url = ("https://mason-registry.dev/registry/list#%s"):format(mason_name)
return Optional.of {
lspconfig_name = lspconfig_name,
mason_name = mason_name,
- lspconfig_url = lspconfig_url,
+ lspconfig_url = get_lspconfig_url(lspconfig_name),
mason_url = mason_url,
}
end),
@@ -128,10 +129,107 @@ local function create_server_mapping_docs()
end
end
+local find_index = _.curryN(function(predicate, list)
+ for i, item in ipairs(list) do
+ if predicate(item) then
+ return i
+ end
+ end
+ return -1
+end, 2)
+
+---@async
+local function update_available_lsp_servers()
+ local readme_path = "README.md"
+ local readme_contents = fs.sync.read_file(readme_path)
+ local readme_lines = _.split("\n", readme_contents)
+
+ local start = find_index(_.equals "<!-- available-lsp-servers:start -->", readme_lines) + 1
+ local stop = find_index(_.equals "<!-- available-lsp-servers:end -->", readme_lines) - 1
+
+ for i = stop, start, -1 do
+ table.remove(readme_lines, i)
+ end
+
+ local server_mappings = require("mason-lspconfig.mappings.server").lspconfig_to_package
+ local registry = require "mason-registry"
+
+ ---@type {languages: string[], name: string}[]
+ local servers = {}
+
+ for lspconfig_name, mason_name in pairs(server_mappings) do
+ local pkg = registry.get_package(mason_name)
+ table.insert(servers, {
+ languages = pkg.spec.languages,
+ name = lspconfig_name,
+ })
+ end
+
+ local servers_markdown_list = _.compose(
+ _.map(function(entry)
+ local server_docs = path.concat { MASON_LSPCONFIG_DIR, "server_configurations", entry.server, "README.md" }
+ if fs.sync.file_exists(server_docs) then
+ return ("| %s ([docs](%s)) | [`%s`](%s) |"):format(
+ entry.language,
+ server_docs,
+ entry.server,
+ get_lspconfig_url(entry.server)
+ )
+ else
+ return ("| %s | [`%s`](%s) |"):format(entry.language, entry.server, get_lspconfig_url(entry.server))
+ end
+ end),
+ _.sort_by(function(entry)
+ if entry.language == "-" then
+ -- brother eww
+ return "zzzz" .. (entry.language .. entry.server):lower()
+ else
+ return (entry.language .. entry.server):lower()
+ end
+ end),
+ function(tbl)
+ return vim.iter(tbl):flatten():totable()
+ end,
+ _.map(function(server)
+ if #server.languages == 0 then
+ return {
+ {
+ server = server.name,
+ language = "-",
+ },
+ }
+ else
+ return _.map(function(language)
+ return {
+ server = server.name,
+ language = language,
+ }
+ end, server.languages)
+ end
+ end)
+ )(servers)
+
+ for i = #servers_markdown_list, 1, -1 do
+ table.insert(readme_lines, start, servers_markdown_list[i])
+ end
+
+ for _, line in
+ ipairs(_.reverse {
+ "| Language | Server name |",
+ "| --- | --- |",
+ })
+ do
+ table.insert(readme_lines, start, line)
+ end
+
+ fs.sync.write_file(readme_path, _.join("\n", readme_lines))
+end
+
a.run_blocking(function()
a.wait_all {
create_lspconfig_filetype_map,
ensure_valid_package_name_translations,
create_server_mapping_docs,
+ update_available_lsp_servers,
}
end)