From 0c09eb343dfa186c0fbf2bb6cbc36e7a8f369ea5 Mon Sep 17 00:00:00 2001 From: Robert Hensing Date: Thu, 24 Feb 2022 14:23:02 +0100 Subject: lib.modules: Refactor option scanning slightly This scans the options with fewer function calls, improving performance. It also removes a let Env from the happy flow of the new logic. --- lib/modules.nix | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) (limited to 'lib/modules.nix') diff --git a/lib/modules.nix b/lib/modules.nix index 540eba1dd3d..e6812625f98 100644 --- a/lib/modules.nix +++ b/lib/modules.nix @@ -9,7 +9,6 @@ let catAttrs concatLists concatMap - count elem filter findFirst @@ -492,20 +491,16 @@ rec { loc = prefix ++ [name]; defns = defnsByName.${name} or []; defns' = defnsByName'.${name} or []; - nrOptions = count (m: isOption m.options) decls; + optionDecls = filter (m: isOption m.options) decls; in - if nrOptions == length decls then + if length optionDecls == length decls then let opt = fixupOptionType loc (mergeOptionDecls loc decls); in { matchedOptions = evalOptionValue loc opt defns'; unmatchedDefns = []; } - else if nrOptions != 0 then - let - firstOption = findFirst (m: isOption m.options) "" decls; - firstNonOption = findFirst (m: !isOption m.options) "" decls; - in - if firstOption.options.type.name == "submodule" + else if optionDecls != [] then + if (lib.head optionDecls).options.type.name == "submodule" then let opt = fixupOptionType loc (mergeOptionDecls loc (map optionTreeToOption decls)); in { @@ -513,7 +508,10 @@ rec { unmatchedDefns = []; } else - throw "The option `${showOption loc}' in `${firstOption._file}' is a prefix of options in `${firstNonOption._file}'." + let + firstNonOption = findFirst (m: !isOption m.options) "" decls; + in + throw "The option `${showOption loc}' in `${(lib.head optionDecls)._file}' is a prefix of options in `${firstNonOption._file}'." else mergeModules' loc decls defns) declsByName; -- cgit 1.4.1