Files
LazyVim/lua/lazyvim/plugins/extras/lang/rust.lua
Felix Rath 5ddad99bac fix(rust): only use mason.nvim if it is present (#4963)
## Description

Fix the lang/rust extra for users that don't use mason. Uses the fix
suggested in
https://github.com/LazyVim/LazyVim/issues/4957#issuecomment-2521787846,
which works perfectly!

## Related Issue(s)

Fixes https://github.com/LazyVim/LazyVim/issues/4957

## Screenshots

n/a

## Checklist

- [x] I've read the
[CONTRIBUTING](https://github.com/LazyVim/LazyVim/blob/main/CONTRIBUTING.md)
guidelines.

Co-authored-by: Felix Rath <frath@cloudflare.com>
2024-12-06 16:35:27 +01:00

145 lines
4.0 KiB
Lua

if lazyvim_docs then
-- LSP Server to use for Rust.
-- Set to "bacon-ls" to use bacon-ls instead of rust-analyzer.
-- only for diagnostics. The rest of LSP support will still be
-- provided by rust-analyzer.
vim.g.lazyvim_rust_diagnostics = "rust-analyzer"
end
local diagnostics = vim.g.lazyvim_rust_diagnostics or "rust-analyzer"
return {
recommended = function()
return LazyVim.extras.wants({
ft = "rust",
root = { "Cargo.toml", "rust-project.json" },
})
end,
-- LSP for Cargo.toml
{
"Saecki/crates.nvim",
event = { "BufRead Cargo.toml" },
opts = {
completion = {
crates = {
enabled = true,
},
},
lsp = {
enabled = true,
actions = true,
completion = true,
hover = true,
},
},
},
-- Add Rust & related to treesitter
{
"nvim-treesitter/nvim-treesitter",
opts = { ensure_installed = { "rust", "ron" } },
},
-- Ensure Rust debugger is installed
{
"williamboman/mason.nvim",
optional = true,
opts = function(_, opts)
opts.ensure_installed = opts.ensure_installed or {}
vim.list_extend(opts.ensure_installed, { "codelldb" })
if diagnostics == "bacon-ls" then
vim.list_extend(opts.ensure_installed, { "bacon" })
end
end,
},
{
"mrcjkb/rustaceanvim",
version = vim.fn.has("nvim-0.10.0") == 0 and "^4" or false,
ft = { "rust" },
opts = {
server = {
on_attach = function(_, bufnr)
vim.keymap.set("n", "<leader>cR", function()
vim.cmd.RustLsp("codeAction")
end, { desc = "Code Action", buffer = bufnr })
vim.keymap.set("n", "<leader>dr", function()
vim.cmd.RustLsp("debuggables")
end, { desc = "Rust Debuggables", buffer = bufnr })
end,
default_settings = {
-- rust-analyzer language server configuration
["rust-analyzer"] = {
cargo = {
allFeatures = true,
loadOutDirsFromCheck = true,
buildScripts = {
enable = true,
},
},
-- Add clippy lints for Rust if using rust-analyzer
checkOnSave = diagnostics == "rust-analyzer",
-- Enable diagnostics if using rust-analyzer
diagnostics = {
enable = diagnostics == "rust-analyzer",
},
procMacro = {
enable = true,
ignored = {
["async-trait"] = { "async_trait" },
["napi-derive"] = { "napi" },
["async-recursion"] = { "async_recursion" },
},
},
},
},
},
},
config = function(_, opts)
if LazyVim.has("mason.nvim") then
local package_path = require("mason-registry").get_package("codelldb"):get_install_path()
local codelldb = package_path .. "/extension/adapter/codelldb"
local library_path = package_path .. "/extension/lldb/lib/liblldb.dylib"
local uname = io.popen("uname"):read("*l")
if uname == "Linux" then
library_path = package_path .. "/extension/lldb/lib/liblldb.so"
end
opts.dap = {
adapter = require("rustaceanvim.config").get_codelldb_adapter(codelldb, library_path),
}
end
vim.g.rustaceanvim = vim.tbl_deep_extend("keep", vim.g.rustaceanvim or {}, opts or {})
if vim.fn.executable("rust-analyzer") == 0 then
LazyVim.error(
"**rust-analyzer** not found in PATH, please install it.\nhttps://rust-analyzer.github.io/",
{ title = "rustaceanvim" }
)
end
end,
},
-- Correctly setup lspconfig for Rust 🚀
{
"neovim/nvim-lspconfig",
opts = {
servers = {
bacon_ls = {
enabled = diagnostics == "bacon-ls",
},
rust_analyzer = { enabled = false },
},
},
},
{
"nvim-neotest/neotest",
optional = true,
opts = {
adapters = {
["rustaceanvim.neotest"] = {},
},
},
},
}