diff options
| author | William Boman <william@redwill.se> | 2021-04-05 02:47:57 +0200 |
|---|---|---|
| committer | William Boman <william@redwill.se> | 2021-04-05 02:48:17 +0200 |
| commit | 12291707e5838dc90eeb5643dd16424e23937b82 (patch) | |
| tree | b949b257b67994770d28757eb576267433bd1257 /lua/nvim-lsp-installer | |
| parent | remove capabilities (diff) | |
| download | mason-12291707e5838dc90eeb5643dd16424e23937b82.tar mason-12291707e5838dc90eeb5643dd16424e23937b82.tar.gz mason-12291707e5838dc90eeb5643dd16424e23937b82.tar.bz2 mason-12291707e5838dc90eeb5643dd16424e23937b82.tar.lz mason-12291707e5838dc90eeb5643dd16424e23937b82.tar.xz mason-12291707e5838dc90eeb5643dd16424e23937b82.tar.zst mason-12291707e5838dc90eeb5643dd16424e23937b82.zip | |
use metatables, more error handling
Diffstat (limited to 'lua/nvim-lsp-installer')
| -rw-r--r-- | lua/nvim-lsp-installer/installer.lua | 138 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/installers/bashls.lua | 2 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/installers/cssls.lua | 2 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/installers/dockerls.lua | 2 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/installers/eslintls.lua | 2 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/installers/graphql.lua | 2 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/installers/html.lua | 2 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/installers/jsonls.lua | 2 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/installers/pyright.lua | 2 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/installers/solargraph.lua | 2 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/installers/sumneko_lua.lua | 2 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/installers/tsserver.lua | 2 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/installers/vimls.lua | 2 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/installers/yamlls.lua | 2 |
14 files changed, 93 insertions, 71 deletions
diff --git a/lua/nvim-lsp-installer/installer.lua b/lua/nvim-lsp-installer/installer.lua index bba50976..a6789d7d 100644 --- a/lua/nvim-lsp-installer/installer.lua +++ b/lua/nvim-lsp-installer/installer.lua @@ -20,18 +20,23 @@ local function escape_quotes(str) end local function get_server_installer(server) - return require('nvim-lsp-installer.installers.' .. server) + return pcall(require, 'nvim-lsp-installer.installers.' .. server) end function M.get_available_servers() return _INSTALLERS end function M.get_installed_servers() local installed_servers = {} - for _, server in ipairs(M.get_available_servers()) do - local module = get_server_installer(server) - if os.execute('test -d ' .. escape_quotes(module.root_dir)) == 0 then + for _, server in pairs(M.get_available_servers()) do + local ok, module = get_server_installer(server) + if not ok then + vim.api.nvim_err_writeln("Unable to find installer for " .. server) + goto continue + end + if module:is_installed() then table.insert(installed_servers, module) end + ::continue:: end return installed_servers end @@ -46,44 +51,93 @@ function M.get_uninstalled_servers() ) end -local function _uninstall(server) - local installer = get_server_installer(server) +function M.install(server) + local ok, installer = get_server_installer(server) + if not ok then + return vim.api.nvim_err_writeln("Unable to find installer for " .. server) + end + local success, error = pcall(installer.install, installer) + if not success then + pcall(installer.uninstall, installer) + return vim.api.nvim_err_writeln("Failed to install " .. server .. ". Error=" .. vim.inspect(error)) + end +end - -- giggity - if os.execute('rm -rf ' .. escape_quotes(installer.root_dir)) ~= 0 then - error('Could not remove LSP server directory ' .. installer.root_dir) +function M.uninstall(server) + local ok, installer = get_server_installer(server) + if not ok then + return vim.api.nvim_err_writeln("Unable to find installer for " .. server) + end + local success, error = pcall(installer.uninstall, installer) + if not success then + vim.api.nvim_err_writeln('Unable to uninstall ' .. server .. '. Error=' .. vim.inspect(error)) + return success end + print("Successfully uninstalled " .. server) +end + +function M.get_server_root_path(server) + return vim.fn.stdpath('data') .. "/lsp_servers/" .. server end -local function _install(server) - local installer = get_server_installer(server) +M.Installer = {} +M.Installer.__index = M.Installer - if installer.pre_install then - installer.pre_install() +---@class Installer +function M.Installer:new(opts) + return setmetatable({ + name = opts.name, + _install_cmd = opts.install_cmd, + _root_dir = opts.root_dir, + _default_options = opts.default_options, + _pre_install = opts.pre_install, + }, M.Installer) +end + +function M.Installer:setup(opts) + -- We require the lspconfig server here in order to do it as late as possible. + -- The reason for this is because once a lspconfig server has been imported, it's + -- automatically registered with lspconfig and causes it to show up in :LspInfo and whatnot. + require'lspconfig'[self.name].setup( + vim.tbl_deep_extend('force', self._default_options, opts) + ) +end + +function M.Installer:is_installed() + return os.execute('test -d ' .. escape_quotes(self._root_dir)) == 0 +end + +function M.Installer:create_root_dir() + if os.execute('mkdir -p ' .. escape_quotes(self._root_dir)) ~= 0 then + error('Could not create LSP server directory ' .. self._root_dir) + end +end + +function M.Installer:install() + if self._pre_install then + self._pre_install() end -- We run uninstall after pre_install because we don't want to -- unnecessarily uninstall a server should it no longer pass the -- pre_install check. - _uninstall(server) + self:uninstall() - if os.execute('mkdir -p ' .. escape_quotes(installer.root_dir)) ~= 0 then - error('Could not create LSP server directory ' .. installer.root_dir) - end + self:create_root_dir() local shell = vim.o.shell vim.o.shell = '/bin/bash' vim.cmd [[new]] vim.fn.termopen( - 'set -e;\n' .. installer.install_cmd, + 'set -e;\n' .. self._install_cmd, { - cwd = installer.root_dir, + cwd = self._root_dir, on_exit = function (_, exit_code) if exit_code ~= 0 then - vim.api.nvim_err_writeln("Installer failed for " .. server .. ". Exit code: " .. exit_code) - _uninstall(server) + vim.api.nvim_err_writeln("Installer failed for " .. self.name .. ". Exit code: " .. exit_code) + self:uninstall() else - print("Successfully installed " .. server) + print("Successfully installed " .. self.name) end end @@ -93,44 +147,12 @@ local function _install(server) vim.cmd([[startinsert]]) -- so that the buffer tails the term log nicely end -function M.install(server) - local success, error = pcall(_install, server) - if not success then - pcall(_uninstall, server) - vim.api.nvim_err_writeln("Failed to install " .. server .. ". Error=" .. vim.inspect(error)) - end - return success -end - -function M.uninstall(server) - local success, error = pcall(_uninstall, server) - if not success then - vim.api.nvim_err_writeln('Unable to uninstall ' .. server .. '. Error=' .. vim.inspect(error)) - return success +function M.Installer:uninstall() + -- giggity + if os.execute('rm -rf ' .. escape_quotes(self._root_dir)) ~= 0 then + error('Could not remove LSP server directory ' .. self._root_dir) end - print("Successfully uninstalled " .. server) - return success -end -function M.get_server_root_path(server) - return vim.fn.stdpath('data') .. "/lsp_servers/" .. server -end - -function M.create_lsp_config_installer(module) - return { - name = module.name, - install_cmd = module.install_cmd, - root_dir = module.root_dir, - pre_install = module.pre_install, - setup = function(opts) - -- We require the lspconfig server here in order to do it as late as possible. - -- The reason for this is because once a lspconfig server has been imported, it's - -- automatically registered with lspconfig and causes it to show up in :LspInfo and whatnot. - require'lspconfig'[module.name].setup( - vim.tbl_deep_extend('force', module.default_options, opts) - ) - end, - } end return M diff --git a/lua/nvim-lsp-installer/installers/bashls.lua b/lua/nvim-lsp-installer/installers/bashls.lua index cf1ddfd5..68b29c41 100644 --- a/lua/nvim-lsp-installer/installers/bashls.lua +++ b/lua/nvim-lsp-installer/installers/bashls.lua @@ -2,7 +2,7 @@ local installer = require('nvim-lsp-installer.installer') local root_dir = installer.get_server_root_path('bash') -return installer.create_lsp_config_installer { +return installer.Installer:new { name = "bashls", root_dir = root_dir, install_cmd = [[npm install bash-language-server@latest]], diff --git a/lua/nvim-lsp-installer/installers/cssls.lua b/lua/nvim-lsp-installer/installers/cssls.lua index ed0cc347..23010cd2 100644 --- a/lua/nvim-lsp-installer/installers/cssls.lua +++ b/lua/nvim-lsp-installer/installers/cssls.lua @@ -2,7 +2,7 @@ local installer = require('nvim-lsp-installer.installer') local root_dir = installer.get_server_root_path('css') -return installer.create_lsp_config_installer { +return installer.Installer:new { name = 'cssls', root_dir = root_dir, install_cmd = [[npm install vscode-css-languageserver-bin]], diff --git a/lua/nvim-lsp-installer/installers/dockerls.lua b/lua/nvim-lsp-installer/installers/dockerls.lua index 919ff777..021b098b 100644 --- a/lua/nvim-lsp-installer/installers/dockerls.lua +++ b/lua/nvim-lsp-installer/installers/dockerls.lua @@ -2,7 +2,7 @@ local installer = require('nvim-lsp-installer.installer') local root_dir = installer.get_server_root_path('dockerfile') -return installer.create_lsp_config_installer { +return installer.Installer:new { name = 'dockerls', root_dir = root_dir, install_cmd = [[npm install dockerfile-language-server-nodejs@latest]], diff --git a/lua/nvim-lsp-installer/installers/eslintls.lua b/lua/nvim-lsp-installer/installers/eslintls.lua index 1682209b..1a699e36 100644 --- a/lua/nvim-lsp-installer/installers/eslintls.lua +++ b/lua/nvim-lsp-installer/installers/eslintls.lua @@ -47,7 +47,7 @@ npm install; npx tsc; ]] -return installer.create_lsp_config_installer { +return installer.Installer:new { name = "eslintls", root_dir = root_dir, install_cmd = install_cmd, diff --git a/lua/nvim-lsp-installer/installers/graphql.lua b/lua/nvim-lsp-installer/installers/graphql.lua index 0cda122a..471eb3ba 100644 --- a/lua/nvim-lsp-installer/installers/graphql.lua +++ b/lua/nvim-lsp-installer/installers/graphql.lua @@ -4,7 +4,7 @@ local installer = require('nvim-lsp-installer.installer') local root_dir = installer.get_server_root_path('graphql') -return installer.create_lsp_config_installer { +return installer.Installer:new { name = "graphql", root_dir = root_dir, install_cmd = [[npm install graphql-language-service-cli@latest graphql]], diff --git a/lua/nvim-lsp-installer/installers/html.lua b/lua/nvim-lsp-installer/installers/html.lua index d40c7d13..8e269e18 100644 --- a/lua/nvim-lsp-installer/installers/html.lua +++ b/lua/nvim-lsp-installer/installers/html.lua @@ -2,7 +2,7 @@ local installer = require('nvim-lsp-installer.installer') local root_dir = installer.get_server_root_path('html') -return installer.create_lsp_config_installer { +return installer.Installer:new { name = "html", root_dir = root_dir, install_cmd = [[npm install vscode-html-languageserver-bin]], diff --git a/lua/nvim-lsp-installer/installers/jsonls.lua b/lua/nvim-lsp-installer/installers/jsonls.lua index 5237e908..0298f5ae 100644 --- a/lua/nvim-lsp-installer/installers/jsonls.lua +++ b/lua/nvim-lsp-installer/installers/jsonls.lua @@ -2,7 +2,7 @@ local installer = require('nvim-lsp-installer.installer') local root_dir = installer.get_server_root_path('json') -return installer.create_lsp_config_installer { +return installer.Installer:new { name = "jsonls", root_dir = root_dir, install_cmd = [[npm install vscode-json-languageserver-bin]], diff --git a/lua/nvim-lsp-installer/installers/pyright.lua b/lua/nvim-lsp-installer/installers/pyright.lua index 767c5a98..a6684def 100644 --- a/lua/nvim-lsp-installer/installers/pyright.lua +++ b/lua/nvim-lsp-installer/installers/pyright.lua @@ -2,7 +2,7 @@ local installer = require('nvim-lsp-installer.installer') local root_dir = installer.get_server_root_path('python') -return installer.create_lsp_config_installer { +return installer.Installer:new { name = "pyright", root_dir = root_dir, install_cmd = [[npm install pyright]], diff --git a/lua/nvim-lsp-installer/installers/solargraph.lua b/lua/nvim-lsp-installer/installers/solargraph.lua index e3461be3..c227c2b3 100644 --- a/lua/nvim-lsp-installer/installers/solargraph.lua +++ b/lua/nvim-lsp-installer/installers/solargraph.lua @@ -19,7 +19,7 @@ echo 'bundle exec solargraph $*' >> solargraph; chmod +x solargraph; ]] -return installer.create_lsp_config_installer { +return installer.Installer:new { name = "solargraph", root_dir = root_dir, install_cmd = install_cmd, diff --git a/lua/nvim-lsp-installer/installers/sumneko_lua.lua b/lua/nvim-lsp-installer/installers/sumneko_lua.lua index 243e3335..947ae276 100644 --- a/lua/nvim-lsp-installer/installers/sumneko_lua.lua +++ b/lua/nvim-lsp-installer/installers/sumneko_lua.lua @@ -26,7 +26,7 @@ local uname_alias = { local uname = vim.fn.system('uname'):gsub("%s+", "") local bin_dir = uname_alias[uname] or uname -return installer.create_lsp_config_installer { +return installer.Installer:new { name = "sumneko_lua", root_dir = root_dir, install_cmd = install_cmd, diff --git a/lua/nvim-lsp-installer/installers/tsserver.lua b/lua/nvim-lsp-installer/installers/tsserver.lua index e1d980d4..87310e02 100644 --- a/lua/nvim-lsp-installer/installers/tsserver.lua +++ b/lua/nvim-lsp-installer/installers/tsserver.lua @@ -2,7 +2,7 @@ local installer = require('nvim-lsp-installer.installer') local root_dir = installer.get_server_root_path('tsserver') -return installer.create_lsp_config_installer { +return installer.Installer:new { name = "tsserver", root_dir = root_dir, install_cmd = [[npm install typescript-language-server]], diff --git a/lua/nvim-lsp-installer/installers/vimls.lua b/lua/nvim-lsp-installer/installers/vimls.lua index d67af661..3e6786b7 100644 --- a/lua/nvim-lsp-installer/installers/vimls.lua +++ b/lua/nvim-lsp-installer/installers/vimls.lua @@ -2,7 +2,7 @@ local installer = require('nvim-lsp-installer.installer') local root_dir = installer.get_server_root_path('vim') -return installer.create_lsp_config_installer { +return installer.Installer:new { name = "vimls", root_dir = root_dir, install_cmd = [[npm install vim-language-server@latest]], diff --git a/lua/nvim-lsp-installer/installers/yamlls.lua b/lua/nvim-lsp-installer/installers/yamlls.lua index 3ed20970..5d68915a 100644 --- a/lua/nvim-lsp-installer/installers/yamlls.lua +++ b/lua/nvim-lsp-installer/installers/yamlls.lua @@ -2,7 +2,7 @@ local installer = require('nvim-lsp-installer.installer') local root_dir = installer.get_server_root_path('yaml') -return installer.create_lsp_config_installer { +return installer.Installer:new { name = "yamlls", root_dir = root_dir, install_cmd = [[npm install yaml-language-server]], |
