diff options
| author | William Boman <william@redwill.se> | 2021-09-17 16:05:20 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-09-17 16:05:20 +0200 |
| commit | 9551bbc1e207ea9a9d436f1bf02a22afc33f6aa6 (patch) | |
| tree | 58da4fff57cc3aff4380f501b1845310dff4f2e8 /lua/nvim-lsp-installer/servers/init.lua | |
| parent | texlab: fix ensure_executables (diff) | |
| download | mason-9551bbc1e207ea9a9d436f1bf02a22afc33f6aa6.tar mason-9551bbc1e207ea9a9d436f1bf02a22afc33f6aa6.tar.gz mason-9551bbc1e207ea9a9d436f1bf02a22afc33f6aa6.tar.bz2 mason-9551bbc1e207ea9a9d436f1bf02a22afc33f6aa6.tar.lz mason-9551bbc1e207ea9a9d436f1bf02a22afc33f6aa6.tar.xz mason-9551bbc1e207ea9a9d436f1bf02a22afc33f6aa6.tar.zst mason-9551bbc1e207ea9a9d436f1bf02a22afc33f6aa6.zip | |
optimize io (70%+ startup speedups) (#93)
Diffstat (limited to 'lua/nvim-lsp-installer/servers/init.lua')
| -rw-r--r-- | lua/nvim-lsp-installer/servers/init.lua | 120 |
1 files changed, 102 insertions, 18 deletions
diff --git a/lua/nvim-lsp-installer/servers/init.lua b/lua/nvim-lsp-installer/servers/init.lua index 8f86d69f..5ff1419b 100644 --- a/lua/nvim-lsp-installer/servers/init.lua +++ b/lua/nvim-lsp-installer/servers/init.lua @@ -1,7 +1,41 @@ local Data = require "nvim-lsp-installer.data" +local path = require "nvim-lsp-installer.path" +local fs = require "nvim-lsp-installer.fs" +local opts = require "nvim-lsp-installer.opts" local M = {} +local function vscode_langservers_extracted(name) + return opts.allow_federated_servers() and "vscode-langservers-extracted" or "vscode-langservers-extracted_" .. name +end + +-- By default the install dir will be the same as the server's name. +-- There are two cases when servers should install to a different location: +-- 1. federated server installations, (see :help vim.g.lsp_installer_allow_federated_servers) +-- 2. legacy reasons, where some servers were previously installed to a location different than their name +local INSTALL_DIRS = { + ["bashls"] = "bash", + ["cssls"] = vscode_langservers_extracted "cssls", + ["dockerls"] = "dockerfile", + ["elixirls"] = "elixir", + ["elmls"] = "elm", + ["eslintls"] = "eslint", + ["gopls"] = "go", + ["hls"] = "haskell", + ["html"] = vscode_langservers_extracted "html", + ["intelephense"] = "php", + ["jsonls"] = vscode_langservers_extracted "jsonls", + ["kotlin_language_server"] = "kotlin", + ["purescriptls"] = "purescript", + ["pyright"] = "python", + ["rust_analyzer"] = "rust", + ["tailwindcss"] = "tailwindcss_npm", + ["terraformls"] = "terraform", + ["texlab"] = "latex", + ["vimls"] = "vim", + ["yamlls"] = "yaml", +} + -- :'<,'>!sort local CORE_SERVERS = Data.set_of { "angularls", @@ -55,54 +89,104 @@ local CORE_SERVERS = Data.set_of { "yamlls", } -local CUSTOM_SERVERS_MAP = {} +local INITIALIZED_SERVERS = {} + +local cached_server_roots + +-- TODO rename me and maybe not export +local function scan_server_roots() + if cached_server_roots then + return cached_server_roots + end + local result = {} + local ok, entries = pcall(fs.readdir, path.SERVERS_ROOT_DIR) + if not ok then + -- presume servers root dir has not been created yet (i.e., no servers installed) + return {} + end + for i = 1, #entries do + local entry = entries[i] + if entry.type == "directory" then + result[#result + 1] = entry.name + end + end + cached_server_roots = Data.set_of(result) + vim.schedule(function() + cached_server_roots = nil + end) + return cached_server_roots +end + +local function get_server_install_dir(server_name) + return INSTALL_DIRS[server_name] or server_name +end + +function M.get_server_install_path(dirname) + return path.concat { path.SERVERS_ROOT_DIR, dirname } +end + +function M.is_server_installed(server_name) + local scanned_server_dirs = scan_server_roots() + local dirname = get_server_install_dir(server_name) + return scanned_server_dirs[dirname] or false +end function M.get_server(server_name) - -- Registered custom servers have precedence - if CUSTOM_SERVERS_MAP[server_name] then - return true, CUSTOM_SERVERS_MAP[server_name] + if INITIALIZED_SERVERS[server_name] then + return true, INITIALIZED_SERVERS[server_name] end if not CORE_SERVERS[server_name] then return false, ("Server %s does not exist."):format(server_name) end - local ok, server = pcall(require, ("nvim-lsp-installer.servers.%s"):format(server_name)) + local ok, server_factory = pcall(require, ("nvim-lsp-installer.servers.%s"):format(server_name)) if ok then - return true, server + INITIALIZED_SERVERS[server_name] = server_factory( + server_name, + M.get_server_install_path(get_server_install_dir(server_name)) + ) + return true, INITIALIZED_SERVERS[server_name] end return false, ( "Unable to import server %s.\n\nThis is an unexpected error, please file an issue at %s with the following information:\n%s" - ):format(server_name, "https://github.com/williamboman/nvim-lsp-installer", server) + ):format(server_name, "https://github.com/williamboman/nvim-lsp-installer", server_factory) end -function M.get_available_servers() +local function get_available_server_names() + return vim.tbl_keys(vim.tbl_extend("force", CORE_SERVERS, INITIALIZED_SERVERS)) +end + +local function resolve_servers(server_names) return Data.list_map(function(server_name) local ok, server = M.get_server(server_name) if not ok then error(server) end return server - end, vim.tbl_keys( - vim.tbl_extend("force", CORE_SERVERS, CUSTOM_SERVERS_MAP) - )) + end, server_names) +end + +function M.get_available_servers() + return resolve_servers(get_available_server_names()) end function M.get_installed_servers() - return vim.tbl_filter(function(server) - return server:is_installed() - end, M.get_available_servers()) + return resolve_servers(vim.tbl_filter(function(server_name) + return M.is_server_installed(server_name) + end, get_available_server_names())) end function M.get_uninstalled_servers() - return vim.tbl_filter(function(server) - return not server:is_installed() - end, M.get_available_servers()) + return resolve_servers(vim.tbl_filter(function(server_name) + return not M.is_server_installed(server_name) + end, get_available_server_names())) end function M.register(server) - CUSTOM_SERVERS_MAP[server.name] = server + INSTALL_DIRS[server.name] = vim.fn.fnamemodify(server.root_dir, ":t") + INITIALIZED_SERVERS[server.name] = server end return M |
