1
0
Fork 0
mirror of https://github.com/nix-community/nixvim.git synced 2025-11-08 19:46:06 +01:00

modules/lsp: auto-import per-server custom modules

Adding a module in the following places will import the module into that
specific server's submodule.

This allows creating server-specific options.

Added a test case to ensure all custom modules correspond to an actual
server option to avoid accidental dead code.
This commit is contained in:
Matt Sturgeon 2025-10-06 10:48:18 +01:00
parent cf6c8ef1fa
commit 2414e8e99f
3 changed files with 50 additions and 1 deletions

View file

@ -0,0 +1,8 @@
# Custom LSP server modules
This directory contains modules that relate to a specific server.
Files are auto-imported into the submodule based on their name.
For example, a file named `foo.nix` or `foo/default.nix` would be imported into the `lsp.servers.foo` submodule.
A corresponding `lsp.servers.<name>` option must exist for every module in this directory.

View file

@ -90,5 +90,13 @@ in
imports = [ imports = [
./server-renames.nix ./server-renames.nix
]; ]
# We cannot use `config._module.args.name` in imports, since `config` causes inf-rec.
# Therefore we can only import custom modules when we have an externally supplied `name`.
++ lib.optionals (args ? name) (
lib.filter lib.pathExists [
./custom/${args.name}.nix
./custom/${args.name}/default.nix
]
);
} }

View file

@ -221,4 +221,37 @@
++ assertSuffix "haskell-language-server" hls.package ++ assertSuffix "haskell-language-server" hls.package
); );
}; };
# Assert that we don't have any redundant custom modules
custom-server-modules =
{ lib, options, ... }:
let
rootPrefix = toString ../../../. + "/";
customDir = ../../../modules/lsp/servers/custom;
serverOptions = (opt: opt.type.getSubOptions opt.loc) options.lsp.servers;
modules = lib.pipe customDir [
builtins.readDir
(lib.filterAttrs (name: _: !(serverOptions ? ${lib.strings.removeSuffix ".nix" name})))
(lib.mapAttrsToList (
name: type: customDir + "/${name}" + lib.optionalString (type == "directory") "/default.nix"
))
(builtins.filter (lib.strings.hasSuffix ".nix"))
(builtins.filter lib.pathExists)
(map (module: lib.strings.removePrefix rootPrefix (toString module)))
];
in
{
test.buildNixvim = false;
assertions = [
{
assertion = modules == [ ];
message = ''
The following custom modules do not correspond to an LSP server option:${
lib.concatMapStrings (module: "\n- ${module}") modules
}
'';
}
];
};
} }