Merge branch 'allow-imports-in-submodules' into upstream-master
This allows submodules to use the full power of the module system. Signed-off-by: Shea Levy <shea@shealevy.com>
This commit is contained in:
commit
8179bad658
@ -75,12 +75,19 @@ rec {
|
||||
);
|
||||
|
||||
|
||||
unifyOptionModule = {key ? "<unknown location>"}: m: (args:
|
||||
let module = lib.applyIfFunction m args; in
|
||||
if lib.isModule module then
|
||||
{ inherit key; } // module
|
||||
unifyOptionModule = {key ? "<unknown location>"}: name: index: m: (args:
|
||||
let
|
||||
module = lib.applyIfFunction m args;
|
||||
key_ = rec {
|
||||
file = key;
|
||||
option = name;
|
||||
number = index;
|
||||
outPath = key;
|
||||
};
|
||||
in if lib.isModule module then
|
||||
{ key = key_; } // module
|
||||
else
|
||||
{ inherit key; options = module; }
|
||||
{ key = key_; options = module; }
|
||||
);
|
||||
|
||||
|
||||
@ -197,9 +204,9 @@ rec {
|
||||
recurseInto = name:
|
||||
moduleMerge (addName name) (modulesOf name);
|
||||
|
||||
recurseForOption = name: modules:
|
||||
recurseForOption = name: modules: args:
|
||||
moduleMerge name (
|
||||
map unifyModuleSyntax modules
|
||||
moduleClosure modules args
|
||||
);
|
||||
|
||||
errorSource = modules:
|
||||
@ -240,7 +247,7 @@ rec {
|
||||
decls = # add location to sub-module options.
|
||||
map (m:
|
||||
mapSubOptions
|
||||
(unifyOptionModule {inherit (m) key;})
|
||||
(unifyOptionModule {inherit (m) key;} name)
|
||||
m.options
|
||||
) declarations;
|
||||
|
||||
|
@ -31,7 +31,7 @@ rec {
|
||||
mapSubOptions = f: opt:
|
||||
if opt ? options then
|
||||
opt // {
|
||||
options = map f (toList opt.options);
|
||||
options = imap f (toList opt.options);
|
||||
}
|
||||
else
|
||||
opt;
|
||||
@ -82,16 +82,18 @@ rec {
|
||||
handleOptionSets = opt:
|
||||
if opt ? type && opt.type.hasOptions then
|
||||
let
|
||||
|
||||
optionConfig = vals: args:
|
||||
map (f: lib.applyIfFunction f args)
|
||||
(opt.options ++ toList vals);
|
||||
|
||||
# Evaluate sub-modules.
|
||||
subModuleMerge = path: vals:
|
||||
lib.fix (args:
|
||||
let
|
||||
result = recurseInto path (optionConfig vals args);
|
||||
result = recurseInto path (opt.options ++ imap (index: v: args: {
|
||||
key = rec {
|
||||
#!!! Would be nice if we had the file the val was from
|
||||
option = path;
|
||||
number = index;
|
||||
outPath = "option ${option} config number ${toString number}";
|
||||
};
|
||||
} // (lib.applyIfFunction v args)) (toList vals)) args;
|
||||
name = lib.removePrefix (opt.name + ".") path;
|
||||
extraArgs = opt.extraArgs or {};
|
||||
individualExtraArgs = opt.individualExtraArgs or {};
|
||||
|
Loading…
Reference in New Issue
Block a user