diff options
Diffstat (limited to 'scripts/autogen_metadata.lua')
| -rw-r--r-- | scripts/autogen_metadata.lua | 143 |
1 files changed, 41 insertions, 102 deletions
diff --git a/scripts/autogen_metadata.lua b/scripts/autogen_metadata.lua index dcc137f6..803a48de 100644 --- a/scripts/autogen_metadata.lua +++ b/scripts/autogen_metadata.lua @@ -1,12 +1,12 @@ -local a = require "nvim-lsp-installer.core.async" -local Path = require "nvim-lsp-installer.core.path" -local fetch = require "nvim-lsp-installer.core.fetch" -local _ = require "nvim-lsp-installer.core.functional" -local servers = require "nvim-lsp-installer.servers" -local fs = require "nvim-lsp-installer.core.fs" +local a = require "mason.core.async" +local Path = require "mason.core.path" +local fetch = require "mason.core.fetch" +local _ = require "mason.core.functional" +local fs = require "mason.core.fs" +local lspconfig_server_mapping = require "mason-lspconfig.server-mapping" -local generated_dir = Path.concat { vim.fn.getcwd(), "lua", "nvim-lsp-installer", "_generated" } -local schemas_dir = Path.concat { generated_dir, "schemas" } +local generated_dir = Path.concat { vim.fn.getcwd(), "lua", "mason", "_generated" } +local schemas_dir = Path.concat { generated_dir, "lsp-schemas" } print("Creating directory " .. generated_dir) vim.fn.mkdir(generated_dir, "p") @@ -14,16 +14,6 @@ vim.fn.mkdir(generated_dir, "p") print("Creating directory " .. schemas_dir) vim.fn.mkdir(schemas_dir, "p") -for _, file in ipairs(vim.fn.glob(Path.concat { generated_dir, "*" }, 1, 1)) do - print("Deleting " .. file) - vim.fn.delete(file) -end - -for _, file in ipairs(vim.fn.glob(Path.concat { schemas_dir, "*" }, 1, 1)) do - print("Deleting " .. file) - vim.fn.delete(file) -end - ---@async ---@param path string ---@param contents string @@ -44,103 +34,37 @@ local function get_lspconfig(name) return require(("lspconfig.server_configurations.%s"):format(name)) end ----@param server Server -local function get_supported_filetypes(server) - local config = get_lspconfig(server.name) - local default_options = server:get_default_options() - local filetypes = _.coalesce( - -- nvim-lsp-installer options has precedence - default_options and default_options.filetypes, - config.default_config.filetypes, - {} - ) - return filetypes -end - ---@async -local function create_filetype_map() +local function create_lspconfig_filetype_map() local filetype_map = {} - local available_servers = servers.get_available_servers() - for _, server in pairs(available_servers) do - for _, filetype in pairs(get_supported_filetypes(server)) do + 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.insert(filetype_map[filetype], server_name) table.sort(filetype_map[filetype]) end end - write_file(Path.concat { generated_dir, "filetype_map.lua" }, "return " .. vim.inspect(filetype_map), "w") -end - ----@async -local function create_autocomplete_map() - ---@type table<string, Server> - local language_map = {} - - local available_servers = servers.get_available_servers() - for _, server in pairs(available_servers) do - local languages = server.languages - for _, language in pairs(languages) do - if not language_map[language] then - language_map[language] = {} - end - table.insert(language_map[language], server) - end - end - - local autocomplete_candidates = {} - for language, language_servers in pairs(language_map) do - local non_deprecated_servers = _.filter(_.prop_eq("deprecated", nil), language_servers) - local is_candidate = #non_deprecated_servers > 0 - - if #non_deprecated_servers == 1 then - local server = non_deprecated_servers[1] - is_candidate = not vim.startswith(server.name, language) - end - - if is_candidate then - autocomplete_candidates[language] = _.map(_.prop "name", non_deprecated_servers) - table.sort(autocomplete_candidates[language]) - end - end - - write_file( - Path.concat { generated_dir, "language_autocomplete_map.lua" }, - "return " .. vim.inspect(autocomplete_candidates), - "w" - ) + write_file(Path.concat { generated_dir, "lspconfig_filetype_map.lua" }, "return " .. vim.inspect(filetype_map), "w") end - ---@async -local function create_server_metadata() - local metadata = {} - - ---@param server Server - local function create_metadata_entry(server) - return { filetypes = get_supported_filetypes(server) } - end - - local available_servers = servers.get_available_servers() - for _, server in pairs(available_servers) do - metadata[server.name] = create_metadata_entry(server) +local function create_lsp_setting_schema_files() + for _, file in ipairs(vim.fn.glob(Path.concat { schemas_dir, "*" }, 1, 1)) do + print("Deleting " .. file) + vim.fn.delete(file) end - write_file(Path.concat { generated_dir, "metadata.lua" }, "return " .. vim.inspect(metadata), "w") -end - ----@async -local function create_setting_schema_files() - local available_servers = servers.get_available_servers() 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 in pairs(available_servers) do - local package_json_url = package_json_mappings[server.name] + 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() @@ -150,10 +74,10 @@ local function create_setting_schema_files() 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)) + print(("Could not find appropriate schema structure for %s."):format(server_name)) else write_file( - Path.concat { schemas_dir, ("%s.lua"):format(server.name) }, + Path.concat { schemas_dir, ("%s.lua"):format(lspconfig_server_mapping.lspconfig_to_package[server_name]) }, "return " .. vim.inspect(schema, { newline = "", indent = "" }), "w" ) @@ -162,11 +86,26 @@ local function create_setting_schema_files() end 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/packages/*/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 + + write_file(Path.concat { generated_dir, "package_index.lua" }, "return " .. vim.inspect(packages), "w") +end + a.run_blocking(function() a.wait_all { - create_filetype_map, - create_autocomplete_map, - create_server_metadata, - create_setting_schema_files, + create_lspconfig_filetype_map, -- TODO is this needed? + create_lsp_setting_schema_files, + create_package_index, } end) |
