aboutsummaryrefslogtreecommitdiffstats
path: root/lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua')
-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
10 files changed, 140 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