diff options
| author | William Boman <william@redwill.se> | 2022-05-27 16:23:51 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-05-27 16:23:51 +0200 |
| commit | b7813e1ac72271edbb78916d2e87d94a6b0f4039 (patch) | |
| tree | 4132329e3e3fbf1170501234f0048c971c442fd2 /lua | |
| parent | run autogen_metadata.lua (diff) | |
| download | mason-b7813e1ac72271edbb78916d2e87d94a6b0f4039.tar mason-b7813e1ac72271edbb78916d2e87d94a6b0f4039.tar.gz mason-b7813e1ac72271edbb78916d2e87d94a6b0f4039.tar.bz2 mason-b7813e1ac72271edbb78916d2e87d94a6b0f4039.tar.lz mason-b7813e1ac72271edbb78916d2e87d94a6b0f4039.tar.xz mason-b7813e1ac72271edbb78916d2e87d94a6b0f4039.tar.zst mason-b7813e1ac72271edbb78916d2e87d94a6b0f4039.zip | |
feat: add teal_ls (#724)
Closes #723.
Diffstat (limited to 'lua')
| -rw-r--r-- | lua/nvim-lsp-installer/_generated/filetype_map.lua | 1 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/_generated/metadata.lua | 3 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/core/functional/init.lua | 2 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/core/functional/list.lua | 13 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/core/functional/string.lua | 12 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/core/managers/luarocks/init.lua | 128 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/core/receipt.lua | 1 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/health/init.lua | 1 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/jobs/outdated-servers/init.lua | 2 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/jobs/version-check/init.lua | 4 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/servers/init.lua | 1 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/servers/teal_ls/init.lua | 15 |
12 files changed, 180 insertions, 3 deletions
diff --git a/lua/nvim-lsp-installer/_generated/filetype_map.lua b/lua/nvim-lsp-installer/_generated/filetype_map.lua index 9af45af0..24057ae7 100644 --- a/lua/nvim-lsp-installer/_generated/filetype_map.lua +++ b/lua/nvim-lsp-installer/_generated/filetype_map.lua @@ -135,6 +135,7 @@ return { svg = { "lemminx" }, swift = { "sourcekit" }, systemverilog = { "svls", "verible" }, + teal = { "teal_ls" }, terraform = { "terraformls", "tflint" }, tex = { "ltex", "texlab" }, toml = { "taplo" }, diff --git a/lua/nvim-lsp-installer/_generated/metadata.lua b/lua/nvim-lsp-installer/_generated/metadata.lua index dfeecce4..10cddde2 100644 --- a/lua/nvim-lsp-installer/_generated/metadata.lua +++ b/lua/nvim-lsp-installer/_generated/metadata.lua @@ -310,6 +310,9 @@ return { taplo = { filetypes = { "toml" } }, + teal_ls = { + filetypes = { "teal" } + }, terraformls = { filetypes = { "terraform" } }, diff --git a/lua/nvim-lsp-installer/core/functional/init.lua b/lua/nvim-lsp-installer/core/functional/init.lua index 9337ccef..8fb97450 100644 --- a/lua/nvim-lsp-installer/core/functional/init.lua +++ b/lua/nvim-lsp-installer/core/functional/init.lua @@ -29,6 +29,7 @@ _.filter = list.filter _.map = list.map _.each = list.each _.concat = list.concat +_.zip_table = list.zip_table -- relation local relation = require "nvim-lsp-installer.core.functional.relation" @@ -58,6 +59,7 @@ _.dec = number.dec local string = require "nvim-lsp-installer.core.functional.string" _.matches = string.matches _.format = string.format +_.split = string.split -- table local tbl = require "nvim-lsp-installer.core.functional.table" diff --git a/lua/nvim-lsp-installer/core/functional/list.lua b/lua/nvim-lsp-installer/core/functional/list.lua index 11742f1c..1fcfe8c3 100644 --- a/lua/nvim-lsp-installer/core/functional/list.lua +++ b/lua/nvim-lsp-installer/core/functional/list.lua @@ -87,4 +87,17 @@ _.concat = fun.curryN(function(a, b) end end, 2) +---@generic T +---@generic U +---@param keys T[] +---@param values U[] +---@return table<T, U> +_.zip_table = fun.curryN(function(keys, values) + local res = {} + for i, key in ipairs(keys) do + res[key] = values[i] + end + return res +end, 2) + return _ diff --git a/lua/nvim-lsp-installer/core/functional/string.lua b/lua/nvim-lsp-installer/core/functional/string.lua index 0061a33e..3fd3aa03 100644 --- a/lua/nvim-lsp-installer/core/functional/string.lua +++ b/lua/nvim-lsp-installer/core/functional/string.lua @@ -9,9 +9,15 @@ _.matches = fun.curryN(function(pattern, str) end, 2) ---@param template string ----@param string string -_.format = fun.curryN(function(template, string) - return template:format(string) +---@param str string +_.format = fun.curryN(function(template, str) + return template:format(str) +end, 2) + +---@param sep string +---@param str string +_.split = fun.curryN(function(sep, str) + return vim.split(str, sep) end, 2) return _ diff --git a/lua/nvim-lsp-installer/core/managers/luarocks/init.lua b/lua/nvim-lsp-installer/core/managers/luarocks/init.lua new file mode 100644 index 00000000..39a02a7d --- /dev/null +++ b/lua/nvim-lsp-installer/core/managers/luarocks/init.lua @@ -0,0 +1,128 @@ +local installer = require "nvim-lsp-installer.core.installer" +local _ = require "nvim-lsp-installer.core.functional" +local std = require "nvim-lsp-installer.core.managers.std" +local process = require "nvim-lsp-installer.core.process" +local path = require "nvim-lsp-installer.core.path" +local Result = require "nvim-lsp-installer.core.result" +local spawn = require "nvim-lsp-installer.core.spawn" +local Optional = require "nvim-lsp-installer.core.optional" + +local M = {} + +---@param package string +local function with_receipt(package) + return function() + local ctx = installer.context() + ctx.receipt:with_primary_source(ctx.receipt.luarocks(package)) + end +end + +function M.package(package) + return function() + return M.install(package).with_receipt() + end +end + +---@async +---@param package string @The luarock package to install. +function M.install(package) + std.ensure_executable("luarocks", { help_url = "https://luarocks.org/" }) + local ctx = installer.context() + ctx:promote_cwd() + ctx.spawn.luarocks { + "install", + "--dev", + "--tree", + ctx.cwd:get(), + package, + ctx.requested_version:or_else(vim.NIL), + } + return { + with_receipt = with_receipt(package), + } +end + +---@alias InstalledLuarock {package: string, version: string, arch: string, nrepo: string, namespace: string} + +---@type fun(output: string): InstalledLuarock[] +M.parse_installed_rocks = _.compose( + _.map(_.compose( + -- https://github.com/luarocks/luarocks/blob/fbd3566a312e647cde57b5d774533731e1aa844d/src/luarocks/search.lua#L317 + _.zip_table { "package", "version", "arch", "nrepo", "namespace" }, + _.split "\t" + )), + _.split "\n" +) + +---@async +---@param receipt InstallReceipt +---@param install_dir string +function M.get_installed_primary_package_version(receipt, install_dir) + if receipt.primary_source.type ~= "luarocks" then + return Result.failure "Receipt does not have a primary source of type luarocks" + end + local primary_package = receipt.primary_source.package + return spawn.luarocks({ + "list", + "--tree", + install_dir, + "--porcelain", + }):map_catching(function(result) + local luarocks = M.parse_installed_rocks(result.stdout) + return Optional.of_nilable(_.find_first(_.prop_eq("package", primary_package), luarocks)) + :map(_.prop "version") + :or_else_throw() + end) +end + +---@alias OutdatedLuarock {name: string, installed: string, available: string, repo: string} + +---@type fun(output: string): OutdatedLuarock[] +M.parse_outdated_rocks = _.compose( + _.map(_.compose( + -- https://github.com/luarocks/luarocks/blob/fbd3566a312e647cde57b5d774533731e1aa844d/src/luarocks/cmd/list.lua#L59 + _.zip_table { "name", "installed", "available", "repo" }, + _.split "\t" + )), + _.split "\n" +) + +---@async +---@param receipt InstallReceipt +---@param install_dir string +function M.check_outdated_primary_package(receipt, install_dir) + if receipt.primary_source.type ~= "luarocks" then + return Result.failure "Receipt does not have a primary source of type luarocks" + end + local primary_package = receipt.primary_source.package + return spawn.luarocks({ + "list", + "--outdated", + "--tree", + install_dir, + "--porcelain", + }):map_catching(function(result) + local outdated_rocks = M.parse_outdated_rocks(result.stdout) + return Optional.of_nilable(_.find_first(_.prop_eq("name", primary_package), outdated_rocks)) + :map( + ---@param outdated_rock OutdatedLuarock + function(outdated_rock) + return { + name = outdated_rock.name, + current_version = assert(outdated_rock.installed), + latest_version = assert(outdated_rock.available), + } + end + ) + :or_else_throw() + end) +end + +---@param install_dir string +function M.env(install_dir) + return { + PATH = process.extend_path { path.concat { install_dir, "bin" } }, + } +end + +return M diff --git a/lua/nvim-lsp-installer/core/receipt.lua b/lua/nvim-lsp-installer/core/receipt.lua index b2300774..608673a6 100644 --- a/lua/nvim-lsp-installer/core/receipt.lua +++ b/lua/nvim-lsp-installer/core/receipt.lua @@ -123,6 +123,7 @@ InstallReceiptBuilder.cargo = package_source "cargo" InstallReceiptBuilder.composer = package_source "composer" InstallReceiptBuilder.r_package = package_source "r_package" InstallReceiptBuilder.opam = package_source "opam" +InstallReceiptBuilder.luarocks = package_source "luarocks" InstallReceiptBuilder.unmanaged = { type = "unmanaged" } diff --git a/lua/nvim-lsp-installer/health/init.lua b/lua/nvim-lsp-installer/health/init.lua index 5dedbefa..e429185a 100644 --- a/lua/nvim-lsp-installer/health/init.lua +++ b/lua/nvim-lsp-installer/health/init.lua @@ -159,6 +159,7 @@ function M.check() end, }, check { cmd = "cargo", args = { "--version" }, name = "cargo", relaxed = true }, + check { cmd = "luarocks", args = { "--version" }, name = "luarocks", relaxed = true }, check { cmd = "ruby", args = { "--version" }, name = "Ruby", relaxed = true }, check { cmd = gem_cmd, args = { "--version" }, name = "RubyGem", relaxed = true }, check { cmd = composer_cmd, args = { "--version" }, name = "Composer", relaxed = true }, diff --git a/lua/nvim-lsp-installer/jobs/outdated-servers/init.lua b/lua/nvim-lsp-installer/jobs/outdated-servers/init.lua index acb73f13..6e1befa0 100644 --- a/lua/nvim-lsp-installer/jobs/outdated-servers/init.lua +++ b/lua/nvim-lsp-installer/jobs/outdated-servers/init.lua @@ -12,6 +12,7 @@ local cargo = require "nvim-lsp-installer.core.managers.cargo" local github = require "nvim-lsp-installer.core.managers.github" local composer = require "nvim-lsp-installer.core.managers.composer" local jdtls_check = require "nvim-lsp-installer.jobs.outdated-servers.jdtls" +local luarocks = require "nvim-lsp-installer.core.managers.luarocks" local M = {} @@ -28,6 +29,7 @@ local checkers = { ["composer"] = composer.check_outdated_primary_package, ["gem"] = gem.check_outdated_primary_package, ["go"] = go.check_outdated_primary_package, + ["luarocks"] = luarocks.check_outdated_primary_package, ["jdtls"] = jdtls_check, ["github_release_file"] = github.check_outdated_primary_package_release, ["github_release"] = github.check_outdated_primary_package_release, diff --git a/lua/nvim-lsp-installer/jobs/version-check/init.lua b/lua/nvim-lsp-installer/jobs/version-check/init.lua index 827c9fa9..3062bb78 100644 --- a/lua/nvim-lsp-installer/jobs/version-check/init.lua +++ b/lua/nvim-lsp-installer/jobs/version-check/init.lua @@ -4,6 +4,7 @@ local cargo = require "nvim-lsp-installer.core.managers.cargo" local pip3 = require "nvim-lsp-installer.core.managers.pip3" local gem = require "nvim-lsp-installer.core.managers.gem" local go = require "nvim-lsp-installer.core.managers.go" +local luarocks = require "nvim-lsp-installer.core.managers.luarocks" local git = require "nvim-lsp-installer.core.managers.git" local composer = require "nvim-lsp-installer.core.managers.composer" @@ -48,6 +49,9 @@ local version_checker = { ["go"] = function(server, receipt) return go.get_installed_primary_package_version(receipt, server.root_dir) end, + ["luarocks"] = function(server, receipt) + return luarocks.get_installed_primary_package_version(receipt, server.root_dir) + end, ["github_release_file"] = version_in_receipt "release", ["github_release"] = version_in_receipt "release", ["github_tag"] = version_in_receipt "tag", diff --git a/lua/nvim-lsp-installer/servers/init.lua b/lua/nvim-lsp-installer/servers/init.lua index 9d78d651..6c385675 100644 --- a/lua/nvim-lsp-installer/servers/init.lua +++ b/lua/nvim-lsp-installer/servers/init.lua @@ -135,6 +135,7 @@ local CORE_SERVERS = _.set_of { "svls", "tailwindcss", "taplo", + "teal_ls", "terraformls", "texlab", "tflint", diff --git a/lua/nvim-lsp-installer/servers/teal_ls/init.lua b/lua/nvim-lsp-installer/servers/teal_ls/init.lua new file mode 100644 index 00000000..0f372639 --- /dev/null +++ b/lua/nvim-lsp-installer/servers/teal_ls/init.lua @@ -0,0 +1,15 @@ +local server = require "nvim-lsp-installer.server" +local luarocks = require "nvim-lsp-installer.core.managers.luarocks" + +return function(name, root_dir) + return server.Server:new { + name = name, + root_dir = root_dir, + languages = { "teal" }, + homepage = "https://github.com/teal-language/teal-language-server", + installer = luarocks.package "teal-language-server", + default_options = { + cmd_env = luarocks.env(root_dir), + }, + } +end |
