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
@ -251,6 +251,16 @@ rec {
|
|||||||
}:
|
}:
|
||||||
assert builtins.isInt depthLimit;
|
assert builtins.isInt depthLimit;
|
||||||
let
|
let
|
||||||
|
specialAttrs = [
|
||||||
|
"__functor"
|
||||||
|
"__functionArgs"
|
||||||
|
"__toString"
|
||||||
|
"__pretty"
|
||||||
|
];
|
||||||
|
stepIntoAttr = evalNext: name:
|
||||||
|
if builtins.elem name specialAttrs
|
||||||
|
then id
|
||||||
|
else evalNext;
|
||||||
transform = depth:
|
transform = depth:
|
||||||
if depthLimit != null && depth > depthLimit then
|
if depthLimit != null && depth > depthLimit then
|
||||||
if throwOnDepthLimit
|
if throwOnDepthLimit
|
||||||
@ -261,7 +271,7 @@ rec {
|
|||||||
let
|
let
|
||||||
evalNext = x: mapAny (depth + 1) (transform (depth + 1) x);
|
evalNext = x: mapAny (depth + 1) (transform (depth + 1) x);
|
||||||
in
|
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 if isList v then map evalNext v
|
||||||
else transform (depth + 1) v;
|
else transform (depth + 1) v;
|
||||||
in
|
in
|
||||||
|
@ -674,6 +674,21 @@ runTests {
|
|||||||
expected = false;
|
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 = {
|
testToPrettyMultiline = {
|
||||||
expr = mapAttrs (const (generators.toPretty { })) rec {
|
expr = mapAttrs (const (generators.toPretty { })) rec {
|
||||||
list = [ 3 4 [ false ] ];
|
list = [ 3 4 [ false ] ];
|
||||||
|
Loading…
Reference in New Issue
Block a user