diff options
| author | kylo252 <59826753+kylo252@users.noreply.github.com> | 2021-10-18 14:04:54 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-10-18 14:04:54 +0200 |
| commit | c87e2fec9f54a438ddfd50642426a2dd628de180 (patch) | |
| tree | 3970936cb1227ccfde5a809f3e6fdb30d5a1aa3e | |
| parent | sort :LspInstall, :LspUninstall completion items (diff) | |
| download | mason-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.yml | 29 | ||||
| -rw-r--r-- | .github/workflows/stylua.yml | 1 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/_generated/metadata.lua | 196 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/server.lua | 10 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/servers/angularls/init.lua | 19 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/servers/eslintls/init.lua | 2 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/servers/ltex/init.lua | 1 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/ui/status-win/init.lua | 5 | ||||
| -rw-r--r-- | scripts/autogen_metadata.lua | 79 | ||||
| -rwxr-xr-x | scripts/autogen_metadata.sh | 12 |
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 |
