aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkylo252 <59826753+kylo252@users.noreply.github.com>2021-10-18 14:04:54 +0200
committerGitHub <noreply@github.com>2021-10-18 14:04:54 +0200
commitc87e2fec9f54a438ddfd50642426a2dd628de180 (patch)
tree3970936cb1227ccfde5a809f3e6fdb30d5a1aa3e
parentsort :LspInstall, :LspUninstall completion items (diff)
downloadmason-c87e2fec9f54a438ddfd50642426a2dd628de180.tar
mason-c87e2fec9f54a438ddfd50642426a2dd628de180.tar.gz
mason-c87e2fec9f54a438ddfd50642426a2dd628de180.tar.bz2
mason-c87e2fec9f54a438ddfd50642426a2dd628de180.tar.lz
mason-c87e2fec9f54a438ddfd50642426a2dd628de180.tar.xz
mason-c87e2fec9f54a438ddfd50642426a2dd628de180.tar.zst
mason-c87e2fec9f54a438ddfd50642426a2dd628de180.zip
feat: autogen metadata table(s) (#159)
Co-authored-by: William Boman <william@redwill.se>
-rw-r--r--.github/workflows/metadata-diff.yml29
-rw-r--r--.github/workflows/stylua.yml1
-rw-r--r--lua/nvim-lsp-installer/_generated/metadata.lua196
-rw-r--r--lua/nvim-lsp-installer/server.lua10
-rw-r--r--lua/nvim-lsp-installer/servers/angularls/init.lua19
-rw-r--r--lua/nvim-lsp-installer/servers/eslintls/init.lua2
-rw-r--r--lua/nvim-lsp-installer/servers/ltex/init.lua1
-rw-r--r--lua/nvim-lsp-installer/ui/status-win/init.lua5
-rw-r--r--scripts/autogen_metadata.lua79
-rwxr-xr-xscripts/autogen_metadata.sh12
10 files changed, 344 insertions, 10 deletions
diff --git a/.github/workflows/metadata-diff.yml b/.github/workflows/metadata-diff.yml
new file mode 100644
index 00000000..9be6f3c2
--- /dev/null
+++ b/.github/workflows/metadata-diff.yml
@@ -0,0 +1,29 @@
+name: Metadata diff checker
+
+on:
+ schedule:
+ - cron: '0 * * * *'
+ push:
+ branches:
+ - 'main'
+ pull_request:
+
+jobs:
+ metadata-diff-check:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - uses: rhysd/action-setup-vim@v1
+ with:
+ neovim: true
+ version: v0.5.1
+ - name: Clone latest lspconfig
+ run: |
+ mkdir -p ~/.local/share/nvim/site/pack/packer/start
+ git clone --depth 1 https://github.com/neovim/nvim-lspconfig ~/.local/share/nvim/site/pack/packer/start/nvim-lspconfig
+ - name: Run autogen_metadata.sh script
+ run: ./scripts/autogen_metadata.sh
+ - name: Ensure there are no diffs
+ run: |
+ git update-index --refresh
+ git diff-index --quiet HEAD --
diff --git a/.github/workflows/stylua.yml b/.github/workflows/stylua.yml
index b4498d93..8fb28a28 100644
--- a/.github/workflows/stylua.yml
+++ b/.github/workflows/stylua.yml
@@ -14,6 +14,7 @@ jobs:
- name: Run Stylua check
uses: JohnnyMorganz/stylua-action@1.0.0
with:
+ # token is needed because the action allegedly downloads binary from github releases
token: ${{ secrets.GITHUB_TOKEN }}
# CLI arguments
args: --check .
diff --git a/lua/nvim-lsp-installer/_generated/metadata.lua b/lua/nvim-lsp-installer/_generated/metadata.lua
new file mode 100644
index 00000000..3b1f3755
--- /dev/null
+++ b/lua/nvim-lsp-installer/_generated/metadata.lua
@@ -0,0 +1,196 @@
+-- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.
+-- stylua: ignore start
+return {
+ angularls = {
+ filetypes = { "typescript", "html", "typescriptreact", "typescript.tsx" }
+ },
+ ansiblels = {
+ filetypes = { "yaml", "yaml.ansible" }
+ },
+ bashls = {
+ filetypes = { "sh" }
+ },
+ bicep = {
+ filetypes = { "bicep" }
+ },
+ clangd = {
+ filetypes = { "c", "cpp", "objc", "objcpp" }
+ },
+ clojure_lsp = {
+ filetypes = { "clojure", "edn" }
+ },
+ cmake = {
+ filetypes = { "cmake" }
+ },
+ cssls = {
+ filetypes = { "css", "scss", "less" }
+ },
+ denols = {
+ filetypes = { "javascript", "javascriptreact", "javascript.jsx", "typescript", "typescriptreact", "typescript.tsx" }
+ },
+ diagnosticls = {
+ filetypes = {}
+ },
+ dockerls = {
+ filetypes = { "Dockerfile", "dockerfile" }
+ },
+ dotls = {
+ filetypes = { "dot" }
+ },
+ efm = {
+ filetypes = {}
+ },
+ elixirls = {
+ filetypes = { "elixir", "eelixir" }
+ },
+ elmls = {
+ filetypes = { "elm" }
+ },
+ ember = {
+ filetypes = { "handlebars", "typescript", "javascript" }
+ },
+ emmet_ls = {
+ filetypes = { "html", "css" }
+ },
+ erlangls = {
+ filetypes = { "erlang" }
+ },
+ eslint = {
+ filetypes = { "javascript", "javascriptreact", "javascript.jsx", "typescript", "typescriptreact", "typescript.tsx", "vue" }
+ },
+ eslintls = {
+ filetypes = { "javascript", "javascriptreact", "typescript", "typescriptreact" }
+ },
+ fortls = {
+ filetypes = { "fortran" }
+ },
+ gopls = {
+ filetypes = { "go", "gomod" }
+ },
+ graphql = {
+ filetypes = { "typescriptreact", "javascriptreact", "graphql" }
+ },
+ groovyls = {
+ filetypes = { "groovy" }
+ },
+ hls = {
+ filetypes = { "haskell", "lhaskell" }
+ },
+ html = {
+ filetypes = { "html" }
+ },
+ intelephense = {
+ filetypes = { "php" }
+ },
+ jdtls = {
+ filetypes = { "java" }
+ },
+ jedi_language_server = {
+ filetypes = { "python" }
+ },
+ jsonls = {
+ filetypes = { "json" }
+ },
+ kotlin_language_server = {
+ filetypes = { "kotlin" }
+ },
+ lemminx = {
+ filetypes = { "xml", "xsd", "svg" }
+ },
+ ltex = {
+ filetypes = { "tex", "bib", "markdown" }
+ },
+ ocamlls = {
+ filetypes = { "ocaml", "reason" }
+ },
+ omnisharp = {
+ filetypes = { "cs", "vb" }
+ },
+ phpactor = {
+ filetypes = { "php" }
+ },
+ powershell_es = {
+ filetypes = { "ps1" }
+ },
+ prismals = {
+ filetypes = { "prisma" }
+ },
+ puppet = {
+ filetypes = { "puppet" }
+ },
+ purescriptls = {
+ filetypes = { "purescript" }
+ },
+ pylsp = {
+ filetypes = { "python" }
+ },
+ pyright = {
+ filetypes = { "python" }
+ },
+ rescriptls = {
+ filetypes = { "rescript" }
+ },
+ rome = {
+ filetypes = { "javascript", "javascriptreact", "json", "typescript", "typescript.tsx", "typescriptreact" }
+ },
+ rust_analyzer = {
+ filetypes = { "rust" }
+ },
+ serve_d = {
+ filetypes = { "d" }
+ },
+ solang = {
+ filetypes = { "solidity" }
+ },
+ solargraph = {
+ filetypes = { "ruby" }
+ },
+ sqlls = {
+ filetypes = { "sql", "mysql" }
+ },
+ sqls = {
+ filetypes = { "sql", "mysql" }
+ },
+ stylelint_lsp = {
+ filetypes = { "css", "less", "scss", "sugarss", "vue", "wxss", "javascript", "javascriptreact", "typescript", "typescriptreact" }
+ },
+ sumneko_lua = {
+ filetypes = { "lua" }
+ },
+ svelte = {
+ filetypes = { "svelte" }
+ },
+ tailwindcss = {
+ filetypes = { "aspnetcorerazor", "astro", "astro-markdown", "blade", "django-html", "edge", "eelixir", "ejs", "erb", "eruby", "gohtml", "haml", "handlebars", "hbs", "html", "html-eex", "jade", "leaf", "liquid", "markdown", "mdx", "mustache", "njk", "nunjucks", "php", "razor", "slim", "twig", "css", "less", "postcss", "sass", "scss", "stylus", "sugarss", "javascript", "javascriptreact", "reason", "rescript", "typescript", "typescriptreact", "vue", "svelte" }
+ },
+ terraformls = {
+ filetypes = { "terraform" }
+ },
+ texlab = {
+ filetypes = { "tex", "bib" }
+ },
+ tflint = {
+ filetypes = { "terraform" }
+ },
+ tsserver = {
+ filetypes = { "javascript", "javascriptreact", "javascript.jsx", "typescript", "typescriptreact", "typescript.tsx" }
+ },
+ vala_ls = {
+ filetypes = { "vala", "genie" }
+ },
+ vimls = {
+ filetypes = { "vim" }
+ },
+ volar = {
+ filetypes = { "vue" }
+ },
+ vuels = {
+ filetypes = { "vue" }
+ },
+ yamlls = {
+ filetypes = { "yaml" }
+ },
+ zls = {
+ filetypes = { "zig", "zir" }
+ }
+} \ No newline at end of file
diff --git a/lua/nvim-lsp-installer/server.lua b/lua/nvim-lsp-installer/server.lua
index ba90c5cf..2c46d00e 100644
--- a/lua/nvim-lsp-installer/server.lua
+++ b/lua/nvim-lsp-installer/server.lua
@@ -74,6 +74,16 @@ function M.Server:get_default_options()
return vim.deepcopy(self._default_options)
end
+function M.Server:get_supported_filetypes()
+ local metadata = require "nvim-lsp-installer._generated.metadata"
+
+ if metadata[self.name] then
+ return metadata[self.name].filetypes
+ end
+
+ return {}
+end
+
function M.Server:is_installed()
return servers.is_server_installed(self.name)
end
diff --git a/lua/nvim-lsp-installer/servers/angularls/init.lua b/lua/nvim-lsp-installer/servers/angularls/init.lua
index 5a545cd2..102ad32f 100644
--- a/lua/nvim-lsp-installer/servers/angularls/init.lua
+++ b/lua/nvim-lsp-installer/servers/angularls/init.lua
@@ -1,17 +1,18 @@
-local util = require "lspconfig/util"
local server = require "nvim-lsp-installer.server"
local npm = require "nvim-lsp-installer.installers.npm"
--- Angular requires a node_modules directory to probe for @angular/language-service and typescript
--- in order to use your projects configured versions.
--- This defaults to the vim cwd, but will get overwritten by the resolved root of the file.
-local function get_probe_dir(root_dir)
- local project_root = util.find_node_modules_ancestor(root_dir)
+return function(name, root_dir)
+ local util = require "lspconfig/util"
+ --
+ -- Angular requires a node_modules directory to probe for @angular/language-service and typescript
+ -- in order to use your projects configured versions.
+ -- This defaults to the vim cwd, but will get overwritten by the resolved root of the file.
+ local function get_probe_dir(root_dir)
+ local project_root = util.find_node_modules_ancestor(root_dir)
- return project_root and (project_root .. "/node_modules") or ""
-end
+ return project_root and (project_root .. "/node_modules") or ""
+ end
-return function(name, root_dir)
local default_probe_dir = get_probe_dir(vim.fn.getcwd())
local executable_path = npm.executable(root_dir, "ngserver")
diff --git a/lua/nvim-lsp-installer/servers/eslintls/init.lua b/lua/nvim-lsp-installer/servers/eslintls/init.lua
index 7ffad30f..ec0afe2f 100644
--- a/lua/nvim-lsp-installer/servers/eslintls/init.lua
+++ b/lua/nvim-lsp-installer/servers/eslintls/init.lua
@@ -31,7 +31,6 @@ return function(name, root_dir)
if not configs.eslintls then
configs.eslintls = {
default_config = {
- filetypes = { "javascript", "javascriptreact", "typescript", "typescriptreact" },
root_dir = lspconfig.util.root_pattern(".eslintrc*", "package.json", ".git"),
-- Refer to https://github.com/Microsoft/vscode-eslint#settings-options for documentation.
settings = {
@@ -71,6 +70,7 @@ return function(name, root_dir)
end
end,
default_options = {
+ filetypes = { "javascript", "javascriptreact", "typescript", "typescriptreact" },
cmd = { "node", path.concat { root_dir, "server", "out", "eslintServer.js" }, "--stdio" },
handlers = {
["eslint/openDoc"] = function(_, _, open_doc)
diff --git a/lua/nvim-lsp-installer/servers/ltex/init.lua b/lua/nvim-lsp-installer/servers/ltex/init.lua
index 27d8bb7c..aaae5543 100644
--- a/lua/nvim-lsp-installer/servers/ltex/init.lua
+++ b/lua/nvim-lsp-installer/servers/ltex/init.lua
@@ -81,6 +81,7 @@ return function(name, root_dir)
require "nvim-lsp-installer.servers.ltex.configure"
end,
default_options = {
+ filetypes = { "tex", "bib", "markdown" },
cmd = { path.concat { root_dir, platform.is_win and "ltex-ls.bat" or "ltex-ls" } },
},
}
diff --git a/lua/nvim-lsp-installer/ui/status-win/init.lua b/lua/nvim-lsp-installer/ui/status-win/init.lua
index e8931bce..ac5b997e 100644
--- a/lua/nvim-lsp-installer/ui/status-win/init.lua
+++ b/lua/nvim-lsp-installer/ui/status-win/init.lua
@@ -178,6 +178,10 @@ local function ServerMetadata(server)
{ get_relative_install_time(server.metadata.install_timestamp_seconds), "" },
}
end),
+ {
+ { "filetypes", "LspInstallerMuted" },
+ { server.metadata.filetypes, "" },
+ },
Data.when(server.is_installed, {
{ "path", "LspInstallerMuted" },
{ server.metadata.install_dir, "" },
@@ -380,6 +384,7 @@ local function create_initial_server_state(server)
homepage = server.homepage,
install_timestamp_seconds = nil, -- lazy
install_dir = server.root_dir,
+ filetypes = table.concat(server:get_supported_filetypes(), ", "),
},
installer = {
is_queued = false,
diff --git a/scripts/autogen_metadata.lua b/scripts/autogen_metadata.lua
new file mode 100644
index 00000000..5bee63f7
--- /dev/null
+++ b/scripts/autogen_metadata.lua
@@ -0,0 +1,79 @@
+local uv = vim.loop
+local Path = require "nvim-lsp-installer.path"
+local Data = require "nvim-lsp-installer.data"
+
+local coalesce = Data.coalesce
+
+package.loaded["nvim-lsp-installer.servers"] = nil
+package.loaded["nvim-lsp-installer.fs"] = nil
+local servers = require "nvim-lsp-installer.servers"
+
+local generated_dir = Path.concat { vim.fn.getcwd(), "lua", "nvim-lsp-installer", "_generated" }
+
+print("Creating directory " .. generated_dir)
+vim.fn.mkdir(generated_dir, "p")
+
+for _, file in ipairs(vim.fn.glob(generated_dir .. "*", 1, 1)) do
+ print("Deleting " .. file)
+ vim.fn.delete(file)
+end
+
+local function write_file(path, txt, flag)
+ uv.fs_open(path, flag, 438, function(open_err, fd)
+ assert(not open_err, open_err)
+ uv.fs_write(fd, txt, -1, function(write_err)
+ assert(not write_err, write_err)
+ uv.fs_close(fd, function(close_err)
+ assert(not close_err, close_err)
+ end)
+ end)
+ end)
+end
+
+local function get_supported_filetypes(server)
+ local configs = require "lspconfig/configs"
+ local lspconfig_server_ok = pcall(require, ("lspconfig/" .. server.name))
+ if not lspconfig_server_ok then
+ -- This is expected behavior for servers that does not exist in lspconfig.
+ print(("Unable to import lspconfig/%s, continuing..."):format(server.name))
+ end
+ local default_options = server:get_default_options()
+ local filetypes = coalesce(
+ -- nvim-lsp-installer options has precedence
+ default_options.filetypes,
+ lspconfig_server_ok and configs[server.name].document_config.default_config.filetypes,
+ {}
+ )
+ -- it's probably still not safe to do this in runtime, but just in case
+ package.loaded["lspconfig/configs"] = nil
+ return filetypes
+end
+
+local function generate_metadata_table()
+ local metadata = {}
+
+ 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)
+ end
+ print(string.format("found [%s] configurations", #vim.tbl_keys(metadata)))
+
+ return metadata
+end
+
+local mt = generate_metadata_table()
+
+local metadata_file_lua = Path.concat { generated_dir, "metadata.lua" }
+write_file(
+ metadata_file_lua,
+ table.concat({
+ "-- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.",
+ "-- stylua: ignore start",
+ "return " .. vim.inspect(mt),
+ }, "\n"),
+ "w"
+)
diff --git a/scripts/autogen_metadata.sh b/scripts/autogen_metadata.sh
new file mode 100755
index 00000000..92a96bba
--- /dev/null
+++ b/scripts/autogen_metadata.sh
@@ -0,0 +1,12 @@
+#!/usr/bin/env bash
+set -ex
+
+declare -x XDG_DATA_HOME="${XDG_DATA_HOME:-"$HOME/.local/share"}"
+declare -x NVIM_PACK_DIR="$XDG_DATA_HOME/nvim/site/pack"
+
+declare -x LSP_CONFIG_DIR="$NVIM_PACK_DIR/packer/start/nvim-lspconfig"
+declare -x LSP_INSTALLER_DIR="$PWD"
+
+nvim -u NONE -E -R --headless \
+ --cmd "set rtp+=${LSP_INSTALLER_DIR},${LSP_CONFIG_DIR}" \
+ +"luafile scripts/autogen_metadata.lua" +q