aboutsummaryrefslogtreecommitdiffstats
path: root/lua/nvim-lsp-installer
diff options
context:
space:
mode:
authorWilliam Boman <william@redwill.se>2021-04-05 02:47:57 +0200
committerWilliam Boman <william@redwill.se>2021-04-05 02:48:17 +0200
commit12291707e5838dc90eeb5643dd16424e23937b82 (patch)
treeb949b257b67994770d28757eb576267433bd1257 /lua/nvim-lsp-installer
parentremove capabilities (diff)
downloadmason-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.lua138
-rw-r--r--lua/nvim-lsp-installer/installers/bashls.lua2
-rw-r--r--lua/nvim-lsp-installer/installers/cssls.lua2
-rw-r--r--lua/nvim-lsp-installer/installers/dockerls.lua2
-rw-r--r--lua/nvim-lsp-installer/installers/eslintls.lua2
-rw-r--r--lua/nvim-lsp-installer/installers/graphql.lua2
-rw-r--r--lua/nvim-lsp-installer/installers/html.lua2
-rw-r--r--lua/nvim-lsp-installer/installers/jsonls.lua2
-rw-r--r--lua/nvim-lsp-installer/installers/pyright.lua2
-rw-r--r--lua/nvim-lsp-installer/installers/solargraph.lua2
-rw-r--r--lua/nvim-lsp-installer/installers/sumneko_lua.lua2
-rw-r--r--lua/nvim-lsp-installer/installers/tsserver.lua2
-rw-r--r--lua/nvim-lsp-installer/installers/vimls.lua2
-rw-r--r--lua/nvim-lsp-installer/installers/yamlls.lua2
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]],