summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorSilvan Mosberger <contact@infinisil.com>2021-12-07 19:38:43 +0100
committerGitHub <noreply@github.com>2021-12-07 19:38:43 +0100
commitae0b7d6db0caf08bfb8679de909f4837b1d49cbf (patch)
treead9342d864287a3c8f0626c55d38c50ecd98dfed /lib
parentfd6a2f3279ca65fc6d8079bf2167796e87cbdf5c (diff)
parent844a9e746f92ac7278ece51c2b7819d0e6c5c05d (diff)
Merge pull request #144022 from hercules-ci/lib-modules-optimize-unmatchedDefns
lib/modules: Short-circuit unmatchedDefns when configs is empty
Diffstat (limited to 'lib')
-rw-r--r--lib/modules.nix31
-rw-r--r--lib/tests/modules/declare-attrsOf.nix9
-rw-r--r--lib/tests/modules/freeform-nested.nix9
3 files changed, 34 insertions, 15 deletions
diff --git a/lib/modules.nix b/lib/modules.nix
index ee1aa16dbb04..e3bb27aa9462 100644
--- a/lib/modules.nix
+++ b/lib/modules.nix
@@ -13,8 +13,6 @@ let
elem
filter
findFirst
- flip
- foldl
foldl'
getAttrFromPath
head
@@ -474,7 +472,7 @@ rec {
[{ inherit (module) file; inherit value; }]
) configs;
- resultsByName = flip mapAttrs declsByName (name: decls:
+ resultsByName = mapAttrs (name: decls:
# We're descending into attribute ‘name’.
let
loc = prefix ++ [name];
@@ -495,7 +493,7 @@ rec {
in
throw "The option `${showOption loc}' in `${firstOption._file}' is a prefix of options in `${firstNonOption._file}'."
else
- mergeModules' loc decls defns);
+ mergeModules' loc decls defns) declsByName;
matchedOptions = mapAttrs (n: v: v.matchedOptions) resultsByName;
@@ -509,12 +507,19 @@ rec {
inherit matchedOptions;
# Transforms unmatchedDefnsByName into a list of definitions
- unmatchedDefns = concatLists (mapAttrsToList (name: defs:
- map (def: def // {
- # Set this so we know when the definition first left unmatched territory
- prefix = [name] ++ (def.prefix or []);
- }) defs
- ) unmatchedDefnsByName);
+ unmatchedDefns =
+ if configs == []
+ then
+ # When no config values exist, there can be no unmatched config, so
+ # we short circuit and avoid evaluating more _options_ than necessary.
+ []
+ else
+ concatLists (mapAttrsToList (name: defs:
+ map (def: def // {
+ # Set this so we know when the definition first left unmatched territory
+ prefix = [name] ++ (def.prefix or []);
+ }) defs
+ ) unmatchedDefnsByName);
};
/* Merge multiple option declarations into a single declaration. In
@@ -928,7 +933,7 @@ rec {
mkMergedOptionModule = from: to: mergeFn:
{ config, options, ... }:
{
- options = foldl recursiveUpdate {} (map (path: setAttrByPath path (mkOption {
+ options = foldl' recursiveUpdate {} (map (path: setAttrByPath path (mkOption {
visible = false;
# To use the value in mergeFn without triggering errors
default = "_mkMergedOptionModule";
@@ -1032,7 +1037,7 @@ rec {
/* Use this function to import a JSON file as NixOS configuration.
- importJSON -> path -> attrs
+ modules.importJSON :: path -> attrs
*/
importJSON = file: {
_file = file;
@@ -1041,7 +1046,7 @@ rec {
/* Use this function to import a TOML file as NixOS configuration.
- importTOML -> path -> attrs
+ modules.importTOML :: path -> attrs
*/
importTOML = file: {
_file = file;
diff --git a/lib/tests/modules/declare-attrsOf.nix b/lib/tests/modules/declare-attrsOf.nix
index b3999de7e5fb..d19964064b21 100644
--- a/lib/tests/modules/declare-attrsOf.nix
+++ b/lib/tests/modules/declare-attrsOf.nix
@@ -1,6 +1,13 @@
-{ lib, ... }: {
+{ lib, ... }:
+let
+ deathtrapArgs = lib.mapAttrs
+ (k: _: throw "The module system is too strict, accessing an unused option's ${k} mkOption-attribute.")
+ (lib.functionArgs lib.mkOption);
+in
+{
options.value = lib.mkOption {
type = lib.types.attrsOf lib.types.str;
default = {};
};
+ options.testing-laziness-so-don't-read-me = lib.mkOption deathtrapArgs;
}
diff --git a/lib/tests/modules/freeform-nested.nix b/lib/tests/modules/freeform-nested.nix
index 5da27f5a8b4f..b81fa7f0d222 100644
--- a/lib/tests/modules/freeform-nested.nix
+++ b/lib/tests/modules/freeform-nested.nix
@@ -1,7 +1,14 @@
-{ lib, ... }: {
+{ lib, ... }:
+let
+ deathtrapArgs = lib.mapAttrs
+ (k: _: throw "The module system is too strict, accessing an unused option's ${k} mkOption-attribute.")
+ (lib.functionArgs lib.mkOption);
+in
+{
options.nest.foo = lib.mkOption {
type = lib.types.bool;
default = false;
};
+ options.nest.unused = lib.mkOption deathtrapArgs;
config.nest.bar = "bar";
}