lib.types.attrTag: Fix declarationPositions after merge

Changed files
+18 -4
lib
+17 -3
lib/tests/modules/types-attrTag.nix
···
-
{ lib, config, ... }:
let
inherit (lib) mkOption types;
forceDeep = x: builtins.deepSeq x x;
in
{
options = {
···
merged.positive.yay = 100;
merged.extensi-foo.extensible = "foo";
merged.extensi-bar.extensible = "bar";
-
okChecks =
assert config.intStrings.hello == { right = "hello world"; };
assert config.intStrings.numberOne == { left = 1; };
assert config.merged.negative == { nay = false; };
···
assert config.docs."submodules.<name>.qux".visible == true;
# Not available (yet?)
# assert config.docs."submodules.<name>.qux".declarationsWithPositions == [ ... ];
assert lib.length config.docs."merged.<name>.extensible".declarations == 2;
-
true;
};
}
···
+
{ lib, config, options, ... }:
let
inherit (lib) mkOption types;
forceDeep = x: builtins.deepSeq x x;
+
mergedSubOption = (options.merged.type.getSubOptions options.merged.loc).extensible."merged.<name>";
in
{
options = {
···
merged.positive.yay = 100;
merged.extensi-foo.extensible = "foo";
merged.extensi-bar.extensible = "bar";
+
okChecks = builtins.addErrorContext "while evaluating the assertions" (
assert config.intStrings.hello == { right = "hello world"; };
assert config.intStrings.numberOne == { left = 1; };
assert config.merged.negative == { nay = false; };
···
assert config.docs."submodules.<name>.qux".visible == true;
# Not available (yet?)
# assert config.docs."submodules.<name>.qux".declarationsWithPositions == [ ... ];
+
assert options.submodules.declarations == [ __curPos.file ];
+
assert lib.length options.submodules.declarationPositions == 1;
+
assert (lib.head options.submodules.declarationPositions).file == __curPos.file;
+
assert options.merged.declarations == [ __curPos.file __curPos.file ];
+
assert lib.length options.merged.declarationPositions == 2;
+
assert (lib.elemAt options.merged.declarationPositions 0).file == __curPos.file;
+
assert (lib.elemAt options.merged.declarationPositions 1).file == __curPos.file;
+
assert (lib.elemAt options.merged.declarationPositions 0).line != (lib.elemAt options.merged.declarationPositions 1).line;
+
assert mergedSubOption.declarations == [ __curPos.file __curPos.file ];
+
assert lib.length mergedSubOption.declarationPositions == 2;
+
assert (lib.elemAt mergedSubOption.declarationPositions 0).file == __curPos.file;
+
assert (lib.elemAt mergedSubOption.declarationPositions 1).file == __curPos.file;
+
assert (lib.elemAt mergedSubOption.declarationPositions 0).line != (lib.elemAt mergedSubOption.declarationPositions 1).line;
assert lib.length config.docs."merged.<name>.extensible".declarations == 2;
+
true);
};
}
+1 -1
lib/types.nix
···
// {
# mergeOptionDecls is not idempotent in these attrs:
declarations = a.tags.${tagName}.declarations ++ bOpt.declarations;
-
declarationPositions = a.tags.${tagName}.declarations ++ bOpt.declarations;
}
)
(builtins.intersectAttrs a.tags b.tags);
···
// {
# mergeOptionDecls is not idempotent in these attrs:
declarations = a.tags.${tagName}.declarations ++ bOpt.declarations;
+
declarationPositions = a.tags.${tagName}.declarationPositions ++ bOpt.declarationPositions;
}
)
(builtins.intersectAttrs a.tags b.tags);