Skip to content

Commit 6a054de

Browse files
sportsheadMattSturgeon
authored andcommitted
plugins/lsp: add packageFallback option
#3445 (review)
1 parent ee71554 commit 6a054de

File tree

4 files changed

+77
-6
lines changed

4 files changed

+77
-6
lines changed

plugins/lsp/language-servers/_mk-lsp.nix

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,16 @@ in
5555
lib.nixvim.mkMaybeUnpackagedOption "plugins.lsp.servers.${name}.package" pkgs name
5656
package;
5757

58+
packageFallback = mkOption {
59+
type = types.bool;
60+
default = false;
61+
description = ''
62+
When enabled, the language server package will be added to the end of the `PATH` _(suffix)_ instead of the beginning _(prefix)_.
63+
64+
This can be useful if you want local versions of the language server (e.g. from a devshell) to override the nixvim version.
65+
'';
66+
};
67+
5868
cmd = mkOption {
5969
type = with types; nullOr (listOf str);
6070
default =
@@ -148,7 +158,8 @@ in
148158
};
149159

150160
config = lib.mkIf enabled {
151-
extraPackages = [ cfg.package ];
161+
extraPackages = lib.optional (!cfg.packageFallback) cfg.package;
162+
extraPackagesAfter = lib.optional cfg.packageFallback cfg.package;
152163

153164
plugins.lsp.enabledServers = [
154165
{

plugins/lsp/language-servers/hls.nix

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
let
88
cfg = config.plugins.lsp.servers.hls;
99
inherit (lib) types;
10+
11+
ghcPackage = lib.optional (cfg.installGhc == true) cfg.ghcPackage;
1012
in
1113
{
1214
options.plugins.lsp.servers.hls = {
@@ -32,6 +34,7 @@ in
3234
'';
3335
};
3436

35-
extraPackages = lib.optional (cfg.installGhc == true) cfg.ghcPackage;
37+
extraPackages = lib.optionals (!cfg.packageFallback) ghcPackage;
38+
extraPackagesAfter = lib.optionals cfg.packageFallback ghcPackage;
3639
};
3740
}

plugins/lsp/language-servers/rust-analyzer.nix

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ let
99
inherit (lib) mkPackageOption types;
1010
inherit (lib.nixvim) mkNullOrOption';
1111

12+
extraPackages =
13+
lib.optional (cfg.installCargo == true) cfg.cargoPackage
14+
++ lib.optional (cfg.installRustc == true) cfg.rustcPackage
15+
++ lib.optional (cfg.installRustfmt == true) cfg.rustfmtPackage;
16+
1217
in
1318
{
1419
options.plugins.lsp.servers.rust_analyzer = {
@@ -72,9 +77,7 @@ in
7277
}
7378
];
7479

75-
extraPackages =
76-
lib.optional (cfg.installCargo == true) cfg.cargoPackage
77-
++ lib.optional (cfg.installRustc == true) cfg.rustcPackage
78-
++ lib.optional (cfg.installRustfmt == true) cfg.rustfmtPackage;
80+
extraPackages = lib.optionals (!cfg.packageFallback) extraPackages;
81+
extraPackagesAfter = lib.optionals cfg.packageFallback extraPackages;
7982
};
8083
}

tests/test-sources/plugins/lsp/_lsp.nix

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,4 +265,58 @@
265265
}
266266
];
267267
};
268+
269+
package-fallback =
270+
{ config, ... }:
271+
{
272+
test.buildNixvim = false;
273+
274+
plugins.lsp = {
275+
enable = true;
276+
servers = {
277+
nil_ls = {
278+
enable = true;
279+
280+
packageFallback = true;
281+
};
282+
rust_analyzer = {
283+
enable = true;
284+
285+
installCargo = true;
286+
installRustc = true;
287+
288+
packageFallback = true;
289+
};
290+
hls = {
291+
enable = true;
292+
293+
installGhc = true;
294+
packageFallback = true;
295+
};
296+
};
297+
};
298+
299+
assertions =
300+
let
301+
assertAfter = name: pkg: [
302+
{
303+
assertion = lib.all (x: x != pkg) config.extraPackages;
304+
message = "Expected `${name}` not to be in extraPackages";
305+
}
306+
{
307+
assertion = lib.any (x: x == pkg) config.extraPackagesAfter;
308+
message = "Expected `${name}` to be in extraPackagesAfter";
309+
}
310+
];
311+
in
312+
with config.plugins.lsp.servers;
313+
(
314+
assertAfter "nil" nil_ls.package
315+
++ assertAfter "rust-analyzer" rust_analyzer.package
316+
++ assertAfter "cargo" rust_analyzer.cargoPackage
317+
++ assertAfter "rustc" rust_analyzer.rustcPackage
318+
++ assertAfter "haskell-language-server" hls.package
319+
++ assertAfter "ghc" hls.ghcPackage
320+
);
321+
};
268322
}

0 commit comments

Comments
 (0)