diff options
author | Silvan Mosberger <contact@infinisil.com> | 2021-12-07 19:38:43 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-07 19:38:43 +0100 |
commit | ae0b7d6db0caf08bfb8679de909f4837b1d49cbf (patch) | |
tree | ad9342d864287a3c8f0626c55d38c50ecd98dfed /lib | |
parent | fd6a2f3279ca65fc6d8079bf2167796e87cbdf5c (diff) | |
parent | 844a9e746f92ac7278ece51c2b7819d0e6c5c05d (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.nix | 31 | ||||
-rw-r--r-- | lib/tests/modules/declare-attrsOf.nix | 9 | ||||
-rw-r--r-- | lib/tests/modules/freeform-nested.nix | 9 |
3 files changed, 34 insertions, 15 deletions
diff --git a/lib/modules.nix b/lib/modules.nix index ee1aa16dbb04e..e3bb27aa94621 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 b3999de7e5fba..d19964064b219 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 5da27f5a8b4f9..b81fa7f0d222b 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"; } |