lib/modules: Don't pack submodules specially

This has the beneficial side effect of allowing paths to be used as modules in
types.{submodule,submoduleWith}
This commit is contained in:
Silvan Mosberger 2019-12-05 03:29:51 +01:00
parent 5002e6afbc
commit 5414b4018b
No known key found for this signature in database
GPG Key ID: E8F1E9EAD284E17D
2 changed files with 11 additions and 17 deletions

View File

@ -102,7 +102,7 @@ let
commitIdFromGitRepo cleanSourceWith pathHasContext commitIdFromGitRepo cleanSourceWith pathHasContext
canCleanSource; canCleanSource;
inherit (modules) evalModules closeModules unifyModuleSyntax inherit (modules) evalModules closeModules unifyModuleSyntax
applyIfFunction unpackSubmodule packSubmodule mergeModules applyIfFunction mergeModules
mergeModules' mergeOptionDecls evalOptionValue mergeDefinitions mergeModules' mergeOptionDecls evalOptionValue mergeDefinitions
pushDownProperties dischargeProperties filterOverrides pushDownProperties dischargeProperties filterOverrides
sortProperties fixupOptionType mkIf mkAssert mkMerge mkOverride sortProperties fixupOptionType mkIf mkAssert mkMerge mkOverride

View File

@ -103,7 +103,7 @@ rec {
toClosureList = file: parentKey: imap1 (n: x: toClosureList = file: parentKey: imap1 (n: x:
if isAttrs x || isFunction x then if isAttrs x || isFunction x then
let key = "${parentKey}:anon-${toString n}"; in let key = "${parentKey}:anon-${toString n}"; in
unifyModuleSyntax file key (unpackSubmodule (applyIfFunction key) x args) unifyModuleSyntax file key (applyIfFunction key x args)
else else
let file = toString x; key = toString x; in let file = toString x; key = toString x; in
unifyModuleSyntax file key (applyIfFunction key (import x) args)); unifyModuleSyntax file key (applyIfFunction key (import x) args));
@ -171,17 +171,6 @@ rec {
else else
f; f;
/* We have to pack and unpack submodules. We cannot wrap the expected
result of the function as we would no longer be able to list the arguments
of the submodule. (see applyIfFunction) */
unpackSubmodule = unpack: m: args:
if isType "submodule" m then
{ _file = m.file; } // (unpack m.submodule args)
else unpack m args;
packSubmodule = file: m:
{ _type = "submodule"; file = file; submodule = m; };
/* Merge a list of modules. This will recurse over the option /* Merge a list of modules. This will recurse over the option
declarations in all modules, combining them into a single set. declarations in all modules, combining them into a single set.
At the same time, for each option declaration, it will merge the At the same time, for each option declaration, it will merge the
@ -267,7 +256,14 @@ rec {
'opts' is a list of modules. Each module has an options attribute which 'opts' is a list of modules. Each module has an options attribute which
correspond to the definition of 'loc' in 'opt.file'. */ correspond to the definition of 'loc' in 'opt.file'. */
mergeOptionDecls = loc: opts: mergeOptionDecls =
let
packSubmodule = file: m:
{ _file = file; imports = [ m ]; };
coerceOption = file: opt:
if isFunction opt then packSubmodule file opt
else packSubmodule file { options = opt; };
in loc: opts:
foldl' (res: opt: foldl' (res: opt:
let t = res.type; let t = res.type;
t' = opt.options.type; t' = opt.options.type;
@ -293,9 +289,7 @@ rec {
current option declaration as the file use for the submodule. If the current option declaration as the file use for the submodule. If the
submodule defines any filename, then we ignore the enclosing option file. */ submodule defines any filename, then we ignore the enclosing option file. */
options' = toList opt.options.options; options' = toList opt.options.options;
coerceOption = file: opt:
if isFunction opt then packSubmodule file opt
else packSubmodule file { options = opt; };
getSubModules = opt.options.type.getSubModules or null; getSubModules = opt.options.type.getSubModules or null;
submodules = submodules =
if getSubModules != null then map (packSubmodule opt._file) getSubModules ++ res.options if getSubModules != null then map (packSubmodule opt._file) getSubModules ++ res.options