Skip to content

Commit 167ea86

Browse files
committed
modules/lsp: port packageFallback option from plugins.lsp
Added to `plugins.lsp` in 6a054de
1 parent 4cec676 commit 167ea86

File tree

3 files changed

+68
-1
lines changed

3 files changed

+68
-1
lines changed

modules/lsp/servers/default.nix

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,9 +138,16 @@ in
138138
(builtins.catAttrs "warnings")
139139
builtins.concatLists
140140
];
141+
142+
packages = lib.pipe enabledServers [
143+
(builtins.filter (server: server ? package))
144+
(builtins.groupBy (server: if server.packageFallback then "suffix" else "prefix"))
145+
(builtins.mapAttrs (_: builtins.catAttrs "package"))
146+
];
141147
in
142148
{
143-
extraPackages = builtins.catAttrs "package" enabledServers;
149+
extraPackages = lib.mkIf (packages.prefix or [ ] != [ ]) packages.prefix;
150+
extraPackagesAfter = lib.mkIf (packages.suffix or [ ] != [ ]) packages.suffix;
144151

145152
lsp.luaConfig.content =
146153
let

modules/lsp/servers/server.nix

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,16 @@ in
5454
'';
5555
};
5656

57+
packageFallback = lib.mkOption {
58+
type = types.bool;
59+
default = false;
60+
description = ''
61+
When enabled, the language server package will be added to the end of the `PATH` _(suffix)_ instead of the beginning _(prefix)_.
62+
63+
This can be useful if you want local versions of the language server (e.g. from a devshell) to override the nixvim version.
64+
'';
65+
};
66+
5767
settings = lib.mkOption {
5868
type = with types; attrsOf anything;
5969
description = ''

tests/test-sources/modules/lsp.nix

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,54 @@
2828
};
2929
};
3030
};
31+
32+
package-fallback =
33+
{ lib, config, ... }:
34+
{
35+
test.buildNixvim = false;
36+
37+
lsp = {
38+
servers = {
39+
nil_ls.enable = true;
40+
rust_analyzer = {
41+
enable = true;
42+
packageFallback = true;
43+
};
44+
hls = {
45+
enable = true;
46+
packageFallback = true;
47+
};
48+
};
49+
};
50+
51+
assertions =
52+
let
53+
assertPrefix = name: pkg: [
54+
{
55+
assertion = lib.all (x: x == pkg) config.extraPackages;
56+
message = "Expected `${name}` to be in extraPackages";
57+
}
58+
{
59+
assertion = lib.any (x: x != pkg) config.extraPackagesAfter;
60+
message = "Expected `${name}` not to be in extraPackagesAfter";
61+
}
62+
];
63+
assertSuffix = name: pkg: [
64+
{
65+
assertion = lib.all (x: x != pkg) config.extraPackages;
66+
message = "Expected `${name}` not to be in extraPackages";
67+
}
68+
{
69+
assertion = lib.any (x: x == pkg) config.extraPackagesAfter;
70+
message = "Expected `${name}` to be in extraPackagesAfter";
71+
}
72+
];
73+
in
74+
with config.lsp.servers;
75+
(
76+
assertPrefix "nil" nil_ls.package
77+
++ assertSuffix "rust-analyzer" rust_analyzer.package
78+
++ assertSuffix "haskell-language-server" hls.package
79+
);
80+
};
3181
}

0 commit comments

Comments
 (0)