diff --git a/plugins/none-ls/_mk-source-plugin.nix b/plugins/none-ls/_mk-source-plugin.nix new file mode 100644 index 00000000..a2cc2ab5 --- /dev/null +++ b/plugins/none-ls/_mk-source-plugin.nix @@ -0,0 +1,58 @@ +# mkSourcePlugin, returns a module +sourceType: sourceName: +{ + config, + pkgs, + lib, + helpers, + ... +}: +let + inherit (import ./packages.nix pkgs) packaged unpackaged; + + cfg = config.plugins.none-ls; + cfg' = config.plugins.none-ls.sources.${sourceType}.${sourceName}; +in +{ + options.plugins.none-ls.sources.${sourceType}.${sourceName} = + { + enable = lib.mkEnableOption "the ${sourceName} ${sourceType} source for none-ls"; + withArgs = helpers.mkNullOrOption helpers.nixvimTypes.strLua '' + Raw Lua code passed as an argument to the source's `with` method. + ''; + } + # Only declare a package option if a package is required + // lib.optionalAttrs (packaged ? ${sourceName} || lib.elem sourceName unpackaged) { + package = + let + pkg = packaged.${sourceName} or null; + in + lib.mkOption ( + { + type = lib.types.nullOr lib.types.package; + description = + "Package to use for ${sourceName}." + + (lib.optionalString (pkg == null) ( + "\n\n" + + '' + Currently not packaged in nixpkgs. + Either set this to `null` and install ${sourceName} outside of nix, + or set this to a custom nix package. + '' + )); + } + // lib.optionalAttrs (pkg != null) { default = pkg; } + ); + }; + + config = lib.mkIf (cfg.enable && cfg'.enable) { + plugins.none-ls.settings.sources = lib.mkDefault [ + ( + "require('null-ls').builtins.${sourceType}.${sourceName}" + + lib.optionalString (cfg'.withArgs != null) ".with(${cfg'.withArgs})" + ) + ]; + + extraPackages = [ (cfg'.package or null) ]; + }; +} diff --git a/plugins/none-ls/servers.nix b/plugins/none-ls/servers.nix index d3702001..16a47023 100644 --- a/plugins/none-ls/servers.nix +++ b/plugins/none-ls/servers.nix @@ -1,82 +1,22 @@ -{ - pkgs, - config, - lib, - helpers, - ... -}: +{ config, lib, ... }: let noneLsBuiltins = import ../../generated/none-ls.nix; - - inherit (import ./packages.nix pkgs) packaged unpackaged; - - # Does this builitin require a package ? - builitinNeedsPackage = source: lib.hasAttr source packaged || lib.elem source unpackaged; + mkSourcePlugin = import ./_mk-source-plugin.nix; in { - imports = [ ./prettier.nix ]; - - options.plugins.none-ls.sources = lib.mapAttrs ( - sourceType: sources: - lib.listToAttrs ( - lib.map (source: { - name = source; - value = - { - enable = lib.mkEnableOption "the ${source} ${sourceType} source for none-ls"; - withArgs = helpers.mkNullOrOption helpers.nixvimTypes.strLua '' - Raw Lua code passed as an argument to the source's `with` method. - ''; - } - // lib.optionalAttrs (builitinNeedsPackage source) { - package = - let - pkg = packaged.${source} or null; - in - lib.mkOption ( - { - type = lib.types.nullOr lib.types.package; - description = - "Package to use for ${source} by none-ls. " - + (lib.optionalString (pkg == null) '' - Not handled in nixvim, either install externally and set to null or set the option with a derivation. - ''); - } - // lib.optionalAttrs (pkg != null) { default = pkg; } - ); - }; - }) sources - ) - ) noneLsBuiltins; + imports = + [ ./prettier.nix ] + ++ (lib.flatten ( + lib.mapAttrsToList (category: (lib.map (mkSourcePlugin category))) noneLsBuiltins + )); config = let cfg = config.plugins.none-ls; gitsignsEnabled = cfg.sources.code_actions.gitsigns.enable; - - flattenedSources = lib.flatten ( - lib.mapAttrsToList ( - sourceType: sources: - (lib.mapAttrsToList (sourceName: source: source // { inherit sourceType sourceName; }) sources) - ) cfg.sources - ); - - enabledSources = builtins.filter (source: source.enable) flattenedSources; in lib.mkIf cfg.enable { - plugins.none-ls.settings.sources = lib.mkIf (enabledSources != [ ]) ( - map ( - { - sourceType, - sourceName, - withArgs, - ... - }: - "require('null-ls').builtins.${sourceType}.${sourceName}" - + lib.optionalString (withArgs != null) ".with(${withArgs})" - ) enabledSources - ); + # Enable gitsigns if the gitsigns source is enabled plugins.gitsigns.enable = lib.mkIf gitsignsEnabled true; - extraPackages = map (source: source.package or null) enabledSources; }; } diff --git a/tests/fetch-tests.nix b/tests/fetch-tests.nix index 7cb5229e..0e86a19c 100644 --- a/tests/fetch-tests.nix +++ b/tests/fetch-tests.nix @@ -53,10 +53,6 @@ let inherit pkgs lib helpers; config = { }; }; - nonels-sources-options = import ../plugins/none-ls/servers.nix { - inherit pkgs lib helpers; - config = { }; - }; }; inherit namespace; } diff --git a/tests/test-sources/plugins/none-ls.nix b/tests/test-sources/plugins/none-ls.nix index 6a9a4319..9a13dcc8 100644 --- a/tests/test-sources/plugins/none-ls.nix +++ b/tests/test-sources/plugins/none-ls.nix @@ -1,4 +1,3 @@ -{ pkgs, nonels-sources-options, ... }: { # Empty configuration empty = { @@ -100,95 +99,70 @@ }; with-sources = { - plugins.none-ls = { - # sandbox-exec: pattern serialization length 159032 exceeds maximum (65535) - enable = !pkgs.stdenv.isDarwin; + module = + { + config, + options, + lib, + pkgs, + ... + }: + { + plugins.none-ls = { + # sandbox-exec: pattern serialization length 159032 exceeds maximum (65535) + enable = !pkgs.stdenv.isDarwin; - sources = - let - options = nonels-sources-options.options.plugins.none-ls.sources; - - unpackaged = - [ - "blade_formatter" - "bsfmt" - "bslint" - "cljstyle" - "cueimports" - # As of 2024-03-22, pkgs.d2 is broken - # TODO: re-enable this test when fixed - "d2_fmt" - "erb_lint" - "findent" - "forge_fmt" - "gccdiag" - "gersemi" - "markuplint" - "mlint" - "nginx_beautifier" - "npm_groovy_lint" - "ocdc" - "packer" - "perlimports" - "pint" - "pretty_php" - "purs_tidy" - "pyink" - "reek" - "regal" - "remark" - "rescript" - "saltlint" - "solhint" - "spectral" - "sqlfmt" - "sql_formatter" - "styler" - "stylint" - "swiftformat" - "swiftlint" - "textidote" - "textlint" - "twigcs" - "vacuum" - "yamlfix" - ] - ++ (pkgs.lib.optionals (pkgs.stdenv.isDarwin && pkgs.stdenv.isx86_64) [ - # As of 2024-03-27, pkgs.graalvm-ce (a dependency of pkgs.clj-kondo) is broken on x86_64-darwin - # TODO: re-enable this test when fixed - "clj_kondo" - ]) - ++ (pkgs.lib.optionals pkgs.stdenv.isDarwin [ - # As of 2024-05-22, python311Packages.k5test (one of ansible-lint's dependenvies) is broken on darwin - # TODO: re-enable this test when fixed - "ansible_lint" - "clazy" - "gdformat" - "gdlint" - "haml_lint" - # As of 2024-06-29, pkgs.rubyfmt is broken on darwin - # TODO: re-enable this test when fixed - "rubyfmt" - "verilator" - "verible_verilog_format" - ]) - ++ (pkgs.lib.optionals pkgs.stdenv.isAarch64 [ - "semgrep" - "smlfmt" - # As of 2024-03-11, swift-format is broken on aarch64 - # TODO: re-enable this test when fixed - "swift_format" - ]); - - sources = pkgs.lib.mapAttrs ( - _: sources: - pkgs.lib.mapAttrs ( - source: _: - { enable = true; } // pkgs.lib.optionalAttrs (builtins.elem source unpackaged) { package = null; } - ) sources - ) options; - in - sources; - }; + sources = + let + disabled = + [ + # As of 2024-03-22, pkgs.d2 is broken + # TODO: re-enable this test when fixed + "d2_fmt" + # TODO: can this be re-enabled? + "yamlfix" + ] + ++ (lib.optionals (pkgs.stdenv.isDarwin && pkgs.stdenv.isx86_64) [ + # As of 2024-03-27, pkgs.graalvm-ce (a dependency of pkgs.clj-kondo) is broken on x86_64-darwin + # TODO: re-enable this test when fixed + "clj_kondo" + ]) + ++ (lib.optionals pkgs.stdenv.isDarwin [ + # As of 2024-05-22, python311Packages.k5test (one of ansible-lint's dependenvies) is broken on darwin + # TODO: re-enable this test when fixed + "ansible_lint" + "clazy" + "gdformat" + "gdlint" + "haml_lint" + # As of 2024-06-29, pkgs.rubyfmt is broken on darwin + # TODO: re-enable this test when fixed + "rubyfmt" + "verilator" + "verible_verilog_format" + ]) + ++ (lib.optionals pkgs.stdenv.isAarch64 [ + "semgrep" + "smlfmt" + # As of 2024-03-11, swift-format is broken on aarch64 + # TODO: re-enable this test when fixed + "swift_format" + ]); + in + # Enable every none-ls source that has an option + lib.mapAttrs ( + _: + lib.mapAttrs ( + sourceName: opts: + { + # Enable unless disabled above + enable = !(lib.elem sourceName disabled); + } + # Some sources have a package option with no default + // lib.optionalAttrs (opts ? package && !(opts.package ? default)) { package = null; } + ) + ) options.plugins.none-ls.sources; + }; + }; }; }