aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilliam Boman <william@redwill.se>2022-01-10 19:33:09 +0100
committerGitHub <noreply@github.com>2022-01-10 19:33:09 +0100
commit57398ee78d055b3fc566092c1a09ca8df9df1d71 (patch)
tree21fb975fb20ba5d28fab5559f399803ed0f778ae
parentAdd OpenFOAM language server (#405) (diff)
downloadmason-57398ee78d055b3fc566092c1a09ca8df9df1d71.tar
mason-57398ee78d055b3fc566092c1a09ca8df9df1d71.tar.gz
mason-57398ee78d055b3fc566092c1a09ca8df9df1d71.tar.bz2
mason-57398ee78d055b3fc566092c1a09ca8df9df1d71.tar.lz
mason-57398ee78d055b3fc566092c1a09ca8df9df1d71.tar.xz
mason-57398ee78d055b3fc566092c1a09ca8df9df1d71.tar.zst
mason-57398ee78d055b3fc566092c1a09ca8df9df1d71.zip
add rnix (#408)
-rw-r--r--lua/nvim-lsp-installer/_generated/filetype_map.lua1
-rw-r--r--lua/nvim-lsp-installer/_generated/language_autocomplete_map.lua1
-rw-r--r--lua/nvim-lsp-installer/_generated/metadata.lua3
-rw-r--r--lua/nvim-lsp-installer/core/clients/crates.lua23
-rw-r--r--lua/nvim-lsp-installer/core/receipt.lua2
-rw-r--r--lua/nvim-lsp-installer/installers/cargo.lua33
-rw-r--r--lua/nvim-lsp-installer/jobs/outdated-servers/cargo.lua59
-rw-r--r--lua/nvim-lsp-installer/jobs/outdated-servers/init.lua2
-rw-r--r--lua/nvim-lsp-installer/servers/init.lua1
-rw-r--r--lua/nvim-lsp-installer/servers/rnix/init.lua15
-rw-r--r--tests/jobs/outdated-servers/cargo_spec.lua32
11 files changed, 172 insertions, 0 deletions
diff --git a/lua/nvim-lsp-installer/_generated/filetype_map.lua b/lua/nvim-lsp-installer/_generated/filetype_map.lua
index 802b6742..0d62a8fb 100644
--- a/lua/nvim-lsp-installer/_generated/filetype_map.lua
+++ b/lua/nvim-lsp-installer/_generated/filetype_map.lua
@@ -65,6 +65,7 @@ return {
mustache = { "tailwindcss" },
mysql = { "sqlls", "sqls" },
nim = { "nimls" },
+ nix = { "rnix" },
njk = { "tailwindcss" },
nunjucks = { "tailwindcss" },
objc = { "ccls", "clangd" },
diff --git a/lua/nvim-lsp-installer/_generated/language_autocomplete_map.lua b/lua/nvim-lsp-installer/_generated/language_autocomplete_map.lua
index 7950cc14..b431c2f0 100644
--- a/lua/nvim-lsp-installer/_generated/language_autocomplete_map.lua
+++ b/lua/nvim-lsp-installer/_generated/language_autocomplete_map.lua
@@ -16,6 +16,7 @@ return {
latex = { "ltex", "texlab" },
lua = { "sumneko_lua" },
markdown = { "remark_ls", "zk" },
+ nix = { "rnix" },
["objective-c"] = { "ccls" },
openapi = { "spectral" },
php = { "intelephense", "phpactor" },
diff --git a/lua/nvim-lsp-installer/_generated/metadata.lua b/lua/nvim-lsp-installer/_generated/metadata.lua
index 4cb7ebb0..0ae0be89 100644
--- a/lua/nvim-lsp-installer/_generated/metadata.lua
+++ b/lua/nvim-lsp-installer/_generated/metadata.lua
@@ -169,6 +169,9 @@ return {
rescriptls = {
filetypes = { "rescript" }
},
+ rnix = {
+ filetypes = { "nix" }
+ },
rome = {
filetypes = { "javascript", "javascriptreact", "json", "typescript", "typescript.tsx", "typescriptreact" }
},
diff --git a/lua/nvim-lsp-installer/core/clients/crates.lua b/lua/nvim-lsp-installer/core/clients/crates.lua
new file mode 100644
index 00000000..f12a8356
--- /dev/null
+++ b/lua/nvim-lsp-installer/core/clients/crates.lua
@@ -0,0 +1,23 @@
+local fetch = require "nvim-lsp-installer.core.fetch"
+local M = {}
+
+---@alias Crate {crate: {id: string, max_stable_version: string, max_version: string, newest_version: string}}
+
+---@param crate string
+---@param callback fun(err: string|nil, data: Crate|nil)
+function M.fetch_crate(crate, callback)
+ fetch(("https://crates.io/api/v1/crates/%s"):format(crate), function(err, data)
+ if err then
+ callback(err, nil)
+ return
+ end
+ local ok, response = pcall(vim.json.decode, data)
+ if not ok then
+ callback("Failed to deserialize crates.io API response.", nil)
+ return
+ end
+ callback(nil, response)
+ end)
+end
+
+return M
diff --git a/lua/nvim-lsp-installer/core/receipt.lua b/lua/nvim-lsp-installer/core/receipt.lua
index 834bb68c..c29ebde7 100644
--- a/lua/nvim-lsp-installer/core/receipt.lua
+++ b/lua/nvim-lsp-installer/core/receipt.lua
@@ -9,6 +9,7 @@ local M = {}
---| '"pip3"'
---| '"gem"'
---| '"go"'
+---| '"cargo"'
---| '"dotnet"'
---| '"unmanaged"'
---| '"system"'
@@ -115,6 +116,7 @@ InstallReceiptBuilder.pip3 = package_source "pip3"
InstallReceiptBuilder.gem = package_source "gem"
InstallReceiptBuilder.go = package_source "go"
InstallReceiptBuilder.dotnet = package_source "dotnet"
+InstallReceiptBuilder.cargo = package_source "cargo"
InstallReceiptBuilder.unmanaged = { type = "unmanaged" }
diff --git a/lua/nvim-lsp-installer/installers/cargo.lua b/lua/nvim-lsp-installer/installers/cargo.lua
new file mode 100644
index 00000000..11b69ea5
--- /dev/null
+++ b/lua/nvim-lsp-installer/installers/cargo.lua
@@ -0,0 +1,33 @@
+local process = require "nvim-lsp-installer.process"
+local path = require "nvim-lsp-installer.path"
+
+local M = {}
+
+---@param crate string The crate to install.
+function M.crate(crate)
+ ---@type ServerInstallerFunction
+ return function(_, callback, ctx)
+ local args = { "install", "--root", ".", "--locked" }
+ if ctx.requested_server_version then
+ vim.list_extend(args, { "--version", ctx.requested_server_version })
+ end
+ vim.list_extend(args, { crate })
+
+ ctx.receipt:with_primary_source(ctx.receipt.cargo(crate))
+
+ process.spawn("cargo", {
+ cwd = ctx.install_dir,
+ args = args,
+ stdio_sink = ctx.stdio_sink,
+ }, callback)
+ end
+end
+
+---@param root_dir string The directory to resolve the executable from.
+function M.env(root_dir)
+ return {
+ PATH = process.extend_path { path.concat { root_dir, "bin" } },
+ }
+end
+
+return M
diff --git a/lua/nvim-lsp-installer/jobs/outdated-servers/cargo.lua b/lua/nvim-lsp-installer/jobs/outdated-servers/cargo.lua
new file mode 100644
index 00000000..19fe7448
--- /dev/null
+++ b/lua/nvim-lsp-installer/jobs/outdated-servers/cargo.lua
@@ -0,0 +1,59 @@
+local process = require "nvim-lsp-installer.process"
+local VersionCheckResult = require "nvim-lsp-installer.jobs.outdated-servers.version-check-result"
+local crates = require "nvim-lsp-installer.core.clients.crates"
+
+---@param output string The `cargo install --list` output.
+local function parse_installed_crates(output)
+ local installed_crates = {}
+ for _, line in ipairs(vim.split(output, "\n")) do
+ local name, version = line:match "^(.+)%s+v([.%S]+)[%s:]"
+ if name and version then
+ installed_crates[name] = version
+ end
+ end
+ return installed_crates
+end
+
+---@param server Server
+---@param source InstallReceiptSource
+---@param on_result fun(result: VersionCheckResult)
+local function cargo_check(server, source, on_result)
+ local stdio = process.in_memory_sink()
+ process.spawn("cargo", {
+ args = { "install", "--list", "--root", "." },
+ cwd = server.root_dir,
+ stdio_sink = stdio.sink,
+ }, function(success)
+ if not success then
+ return on_result(VersionCheckResult.fail(server))
+ end
+ local installed_crates = parse_installed_crates(table.concat(stdio.buffers.stdout, ""))
+ if not installed_crates[source.package] then
+ return on_result(VersionCheckResult.fail(server))
+ end
+ crates.fetch_crate(source.package, function(err, response)
+ if err then
+ return on_result(VersionCheckResult.fail(server))
+ end
+ if response.crate.max_stable_version ~= installed_crates[source.package] then
+ return on_result(VersionCheckResult.success(server, {
+ {
+ name = source.package,
+ current_version = installed_crates[source.package],
+ latest_version = response.crate.max_stable_version,
+ },
+ }))
+ else
+ return on_result(VersionCheckResult.empty(server))
+ end
+ end)
+ end)
+end
+
+return setmetatable({
+ parse_installed_crates = parse_installed_crates,
+}, {
+ __call = function(_, ...)
+ return cargo_check(...)
+ end,
+})
diff --git a/lua/nvim-lsp-installer/jobs/outdated-servers/init.lua b/lua/nvim-lsp-installer/jobs/outdated-servers/init.lua
index 31015b72..c2c45178 100644
--- a/lua/nvim-lsp-installer/jobs/outdated-servers/init.lua
+++ b/lua/nvim-lsp-installer/jobs/outdated-servers/init.lua
@@ -3,6 +3,7 @@ local VersionCheckResult = require "nvim-lsp-installer.jobs.outdated-servers.ver
local log = require "nvim-lsp-installer.log"
local npm_check = require "nvim-lsp-installer.jobs.outdated-servers.npm"
+local cargo_check = require "nvim-lsp-installer.jobs.outdated-servers.cargo"
local pip3_check = require "nvim-lsp-installer.jobs.outdated-servers.pip3"
local gem_check = require "nvim-lsp-installer.jobs.outdated-servers.gem"
local git_check = require "nvim-lsp-installer.jobs.outdated-servers.git"
@@ -23,6 +24,7 @@ end
local checkers = {
["npm"] = npm_check,
["pip3"] = pip3_check,
+ ["cargo"] = cargo_check,
["gem"] = gem_check,
["go"] = noop, -- TODO
["dotnet"] = noop, -- TODO
diff --git a/lua/nvim-lsp-installer/servers/init.lua b/lua/nvim-lsp-installer/servers/init.lua
index 6fbd33ef..e911fdf8 100644
--- a/lua/nvim-lsp-installer/servers/init.lua
+++ b/lua/nvim-lsp-installer/servers/init.lua
@@ -40,6 +40,7 @@ local CORE_SERVERS = Data.set_of {
"clangd",
"clojure_lsp",
"cmake",
+ "rnix",
"codeqlls",
"csharp_ls",
"cssls",
diff --git a/lua/nvim-lsp-installer/servers/rnix/init.lua b/lua/nvim-lsp-installer/servers/rnix/init.lua
new file mode 100644
index 00000000..35290aae
--- /dev/null
+++ b/lua/nvim-lsp-installer/servers/rnix/init.lua
@@ -0,0 +1,15 @@
+local server = require "nvim-lsp-installer.server"
+local cargo = require "nvim-lsp-installer.installers.cargo"
+
+return function(name, root_dir)
+ return server.Server:new {
+ name = name,
+ root_dir = root_dir,
+ languages = { "nix" },
+ homepage = "https://github.com/nix-community/rnix-lsp",
+ installer = cargo.crate "rnix-lsp",
+ default_options = {
+ cmd_env = cargo.env(root_dir),
+ },
+ }
+end
diff --git a/tests/jobs/outdated-servers/cargo_spec.lua b/tests/jobs/outdated-servers/cargo_spec.lua
new file mode 100644
index 00000000..f99e6b7c
--- /dev/null
+++ b/tests/jobs/outdated-servers/cargo_spec.lua
@@ -0,0 +1,32 @@
+local cargo_check = require "nvim-lsp-installer.jobs.outdated-servers.cargo"
+
+describe("cargo outdated package checker", function()
+ it("parses cargo installed packages output", function()
+ assert.equal(
+ vim.inspect {
+ ["bat"] = "0.18.3",
+ ["exa"] = "0.10.1",
+ ["git-select-branch"] = "0.1.1",
+ ["hello_world"] = "0.0.1",
+ ["rust-analyzer"] = "0.0.0",
+ ["stylua"] = "0.11.2",
+ ["zoxide"] = "0.5.0",
+ },
+ vim.inspect(cargo_check.parse_installed_crates [[bat v0.18.3:
+ bat
+exa v0.10.1:
+ exa
+git-select-branch v0.1.1:
+ git-select-branch
+hello_world v0.0.1 (/private/var/folders/ky/s6yyhm_d24d0jsrql4t8k4p40000gn/T/tmp.LGbguATJHj):
+ hello_world
+rust-analyzer v0.0.0 (/private/var/folders/ky/s6yyhm_d24d0jsrql4t8k4p40000gn/T/tmp.YlsHeA9JVL/crates/rust-analyzer):
+ rust-analyzer
+stylua v0.11.2:
+ stylua
+zoxide v0.5.0:
+ zoxide
+]])
+ )
+ end)
+end)