Merge pull request #168374 from Ma27/special-attrs-in-with-recursion
lib/generators: withRecursion: don't break attr-sets with special attrs
This commit is contained in:
commit
4b2827e6a1
2 changed files with 26 additions and 1 deletions
|
@ -251,6 +251,16 @@ rec {
|
|||
}:
|
||||
assert builtins.isInt depthLimit;
|
||||
let
|
||||
specialAttrs = [
|
||||
"__functor"
|
||||
"__functionArgs"
|
||||
"__toString"
|
||||
"__pretty"
|
||||
];
|
||||
stepIntoAttr = evalNext: name:
|
||||
if builtins.elem name specialAttrs
|
||||
then id
|
||||
else evalNext;
|
||||
transform = depth:
|
||||
if depthLimit != null && depth > depthLimit then
|
||||
if throwOnDepthLimit
|
||||
|
@ -261,7 +271,7 @@ rec {
|
|||
let
|
||||
evalNext = x: mapAny (depth + 1) (transform (depth + 1) x);
|
||||
in
|
||||
if isAttrs v then mapAttrs (const evalNext) v
|
||||
if isAttrs v then mapAttrs (stepIntoAttr evalNext) v
|
||||
else if isList v then map evalNext v
|
||||
else transform (depth + 1) v;
|
||||
in
|
||||
|
|
|
@ -674,6 +674,21 @@ runTests {
|
|||
expected = false;
|
||||
};
|
||||
|
||||
testWithRecursionDealsWithFunctors =
|
||||
let
|
||||
functor = {
|
||||
__functor = self: { a, b, }: null;
|
||||
};
|
||||
a = {
|
||||
value = "1234";
|
||||
b = functor;
|
||||
c.d = functor;
|
||||
};
|
||||
in {
|
||||
expr = generators.toPretty { } (generators.withRecursion { depthLimit = 1; throwOnDepthLimit = false; } a);
|
||||
expected = "{\n b = <function, args: {a, b}>;\n c = {\n d = \"<unevaluated>\";\n };\n value = \"<unevaluated>\";\n}";
|
||||
};
|
||||
|
||||
testToPrettyMultiline = {
|
||||
expr = mapAttrs (const (generators.toPretty { })) rec {
|
||||
list = [ 3 4 [ false ] ];
|
||||
|
|
Loading…
Reference in a new issue