From f42970ac8476ca173f45f11f7537e320730066e7 Mon Sep 17 00:00:00 2001 From: NotAShelf Date: Thu, 21 Aug 2025 11:14:51 +0300 Subject: [PATCH] languages/rust: move crates-nvim dependency to extensions attribute; modernize Signed-off-by: NotAShelf Change-Id: I6a6a696490046c3a59d8b9dddd112a6f5120d236 --- modules/extra/deprecations.nix | 8 ++++ modules/plugins/languages/rust.nix | 76 ++++++++++++++++++------------ 2 files changed, 54 insertions(+), 30 deletions(-) diff --git a/modules/extra/deprecations.nix b/modules/extra/deprecations.nix index 77f4bcc6..0db5af69 100644 --- a/modules/extra/deprecations.nix +++ b/modules/extra/deprecations.nix @@ -259,6 +259,14 @@ in { (mkRenamedLspServer "zig") (mkRemovedLspPackage "zig") + + # 2025-08-21 + (mkRenamedOptionModule ["vim" "languages" "rust" "crates" "enable"] ["vim" "languages" "rust" "extensions" "crates-nvim" "enable"]) + (mkRemovedOptionModule ["vim" "languages" "rust" "crates" "codeActions"] '' + 'vim.languages.rust.crates' option has been moved to 'vim.languages.rust.extensions.crates-nvim' in full and the + codeActions option has been removed. To set up code actions again, you may use the the new 'setupOpts' option + located under 'vim.languages.rust.extensions.crates-nvim'. Refer to crates.nvim documentation for setup steps. + '') ] # Migrated via batchRenameOptions. Further batch renames must be below this line. diff --git a/modules/plugins/languages/rust.nix b/modules/plugins/languages/rust.nix index 09c54ae6..3f7eeb4b 100644 --- a/modules/plugins/languages/rust.nix +++ b/modules/plugins/languages/rust.nix @@ -4,16 +4,15 @@ lib, ... }: let - inherit (builtins) attrNames; inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; inherit (lib.options) mkOption mkEnableOption literalMD; inherit (lib.strings) optionalString; - inherit (lib.trivial) boolToString; inherit (lib.lists) isList; + inherit (lib.attrsets) attrNames optionalAttrs; inherit (lib.types) bool package str listOf either enum; - inherit (lib.nvim.types) mkGrammarOption; - inherit (lib.nvim.lua) expToLua; + inherit (lib.nvim.types) mkGrammarOption mkPluginSetupOption; + inherit (lib.nvim.lua) expToLua toLuaObject; inherit (lib.nvim.dag) entryAfter entryAnywhere; cfg = config.vim.languages.rust; @@ -33,15 +32,6 @@ in { package = mkGrammarOption pkgs "rust"; }; - crates = { - enable = mkEnableOption "crates-nvim, tools for managing dependencies"; - codeActions = mkOption { - description = "Enable code actions through null-ls"; - type = bool; - default = true; - }; - }; - lsp = { enable = mkEnableOption "Rust LSP support (rust-analyzer with extra tools)" // {default = config.vim.lsp.enable;}; package = mkOption { @@ -103,25 +93,32 @@ in { default = pkgs.lldb; }; }; + + extensions = { + crates-nvim = { + enable = mkEnableOption "crates.io dependency management [crates-nvim]"; + + setupOpts = mkPluginSetupOption "crates-nvim" { + completion.enable = mkOption { + type = bool; + default = config.vim.autocomplete.nvim-cmp.enable; + defaultText = "{option}`config.vim.autocomplete.nvim-cmp.enable`"; + description = '' + Whether to add crates.nvim as a source for completion plugins. The following + plugins are supported by crates.nvim: + + * nvim-cmp + * coq.nvim + + However nvf only supports auto-setup for nvim-cmp. + ''; + }; + }; + }; + }; }; config = mkIf cfg.enable (mkMerge [ - (mkIf cfg.crates.enable { - vim = { - startPlugins = ["crates-nvim"]; - lsp.null-ls.enable = mkIf cfg.crates.codeActions true; - autocomplete.nvim-cmp.sources = {crates = "[Crates]";}; - pluginRC.rust-crates = entryAnywhere '' - require('crates').setup { - null_ls = { - enabled = ${boolToString cfg.crates.codeActions}, - name = "crates.nvim", - } - } - ''; - }; - }) - (mkIf cfg.treesitter.enable { vim.treesitter.enable = true; vim.treesitter.grammars = [cfg.treesitter.package]; @@ -140,7 +137,6 @@ in { (mkIf (cfg.lsp.enable || cfg.dap.enable) { vim = { startPlugins = ["rustaceanvim"]; - pluginRC.rustaceanvim = entryAfter ["lsp-setup"] '' vim.g.rustaceanvim = { ${optionalString cfg.lsp.enable '' @@ -199,5 +195,25 @@ in { ''; }; }) + + (mkIf cfg.extensions.crates-nvim.enable { + vim = let + withCompletion = cfg.extensions.crates-nvim.withCmpSource; + in + mkMerge [ + { + startPlugins = ["crates-nvim"]; + pluginRC.rust-crates = entryAnywhere '' + require("crates").setup(${toLuaObject cfg.extensions.crates-nvim.setupOpts}) + ''; + } + + # FIXME: this will no longer be necessary when a new crates.nvim release is made. + # If updating crates.nvim, remember to remove this section. + (mkIf withCompletion { + autocomplete.nvim-cmp.sources = {crates = "[Crates]";}; + }) + ]; + }) ]); }