2023-10-22 15:10:28 +00:00
|
|
|
# From home-manager: https://github.com/nix-community/home-manager/blob/master/modules/lib/booleans.nix
|
2024-03-24 00:14:39 +00:00
|
|
|
{lib}: let
|
|
|
|
inherit (builtins) isString getAttr;
|
|
|
|
inherit (lib.options) mkOption;
|
|
|
|
inherit (lib.types) bool;
|
2024-10-16 02:01:09 +00:00
|
|
|
inherit (lib.meta) getExe;
|
2024-10-16 02:42:01 +00:00
|
|
|
inherit (lib.strings) optionalString;
|
|
|
|
inherit (lib.lists) optionals;
|
2024-10-16 02:01:09 +00:00
|
|
|
inherit (lib.generators) mkLuaInline;
|
2024-10-09 17:50:34 +00:00
|
|
|
inherit (lib.nvim.attrsets) mapListToAttrs;
|
2024-10-16 02:01:09 +00:00
|
|
|
inherit (lib.nvim.lua) toLuaObject;
|
2024-03-24 00:14:39 +00:00
|
|
|
in {
|
2024-07-04 14:36:07 +00:00
|
|
|
# A wrapper around `mkOption` to create a boolean option that is
|
|
|
|
# used for Language Server modules.
|
|
|
|
mkEnable = desc:
|
|
|
|
mkOption {
|
|
|
|
description = "Turn on ${desc} for enabled languages by default";
|
|
|
|
type = bool;
|
|
|
|
default = false;
|
|
|
|
};
|
|
|
|
|
2023-10-22 15:10:28 +00:00
|
|
|
# Converts a boolean to a yes/no string. This is used in lots of
|
|
|
|
# configuration formats.
|
2023-04-17 20:27:27 +00:00
|
|
|
diagnosticsToLua = {
|
|
|
|
lang,
|
|
|
|
config,
|
2024-03-24 00:14:39 +00:00
|
|
|
diagnosticsProviders,
|
2023-04-17 20:27:27 +00:00
|
|
|
}:
|
2024-10-09 17:50:34 +00:00
|
|
|
mapListToAttrs
|
|
|
|
(v: let
|
|
|
|
type =
|
|
|
|
if isString v
|
|
|
|
then v
|
|
|
|
else getAttr v.type;
|
|
|
|
package =
|
|
|
|
if isString v
|
|
|
|
then diagnosticsProviders.${type}.package
|
|
|
|
else v.package;
|
|
|
|
in {
|
|
|
|
name = "${lang}-diagnostics-${type}";
|
|
|
|
value = diagnosticsProviders.${type}.nullConfig package;
|
|
|
|
})
|
|
|
|
config;
|
2024-10-16 02:01:09 +00:00
|
|
|
|
|
|
|
# `mkLspConfig` is a helper function that generates a LspConfig configuration
|
|
|
|
# from at least a name and a package, optionally also `capabilities`, and
|
|
|
|
# `on_attach`.
|
|
|
|
# TODO: nixpkgs-like doc comments from that one RFC
|
|
|
|
mkLspConfig = {
|
2024-10-16 02:42:01 +00:00
|
|
|
# Mandatory arguments
|
2024-10-16 02:01:09 +00:00
|
|
|
name,
|
|
|
|
package,
|
2024-10-16 02:42:01 +00:00
|
|
|
# Optional arguments for the sake of flexibility
|
2024-10-16 02:01:09 +00:00
|
|
|
args ? [],
|
2024-10-16 02:42:01 +00:00
|
|
|
cmd ? [(getExe package)] ++ optionals (args != []) args,
|
2024-10-16 02:01:09 +00:00
|
|
|
capabilities ? "capabilities",
|
|
|
|
on_attach ? "on_attach",
|
2024-10-16 02:42:01 +00:00
|
|
|
init_opts ? "",
|
2024-10-16 02:01:09 +00:00
|
|
|
}: let
|
|
|
|
generatedConfig = {
|
|
|
|
inherit cmd;
|
|
|
|
capabilities = mkLuaInline capabilities;
|
|
|
|
on_attach = mkLuaInline on_attach;
|
2024-10-16 02:42:01 +00:00
|
|
|
init_opts = mkLuaInline (optionalString (init_opts != "") init_opts);
|
2024-10-16 02:01:09 +00:00
|
|
|
};
|
|
|
|
in {
|
|
|
|
inherit package;
|
|
|
|
lspConfig = ''
|
|
|
|
lspconfig.${name}.setup(${toLuaObject generatedConfig})
|
|
|
|
'';
|
|
|
|
};
|
2023-04-17 20:27:27 +00:00
|
|
|
}
|