From 40c39aa5d2e8ff64c88d293744a3b7ba643a2274 Mon Sep 17 00:00:00 2001 From: Alois Wohlschlager Date: Mon, 15 Jul 2024 18:38:37 +0200 Subject: [PATCH] libexpr/print: do not show elided nested items when there are none When the configured maximum depth has been reached, attribute sets and lists are printed with ellipsis to indicate the elision of nested items. Previously, this happened even in case the structure being printed is empty, so that such items do not in fact exist. This is confusing, so stop doing it. Change-Id: I0016970dad3e42625e085dc896e6f476b21226c9 --- src/libexpr/print.cc | 4 ++-- tests/unit/libexpr/value/print.cc | 17 +++++++++++++---- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/libexpr/print.cc b/src/libexpr/print.cc index 2ee11d9d3..b7ff50f48 100644 --- a/src/libexpr/print.cc +++ b/src/libexpr/print.cc @@ -281,7 +281,7 @@ private: printDerivation(v); } else if (seen && !v.attrs->empty() && !seen->insert(v.attrs).second) { printRepeated(); - } else if (depth < options.maxDepth) { + } else if (depth < options.maxDepth || v.attrs->empty()) { increaseIndent(); output << "{"; @@ -355,7 +355,7 @@ private: return; } - if (depth < options.maxDepth) { + if (depth < options.maxDepth || v.listSize() == 0) { increaseIndent(); output << "["; auto listItems = v.listItems(); diff --git a/tests/unit/libexpr/value/print.cc b/tests/unit/libexpr/value/print.cc index 1f99b562d..ddf8b8b99 100644 --- a/tests/unit/libexpr/value/print.cc +++ b/tests/unit/libexpr/value/print.cc @@ -193,6 +193,9 @@ TEST_F(ValuePrintingTests, vBlackhole) TEST_F(ValuePrintingTests, depthAttrs) { + Value vZero; + vZero.mkInt(0); + Value vOne; vOne.mkInt(1); @@ -203,10 +206,16 @@ TEST_F(ValuePrintingTests, depthAttrs) Value vAttrsEmpty; vAttrsEmpty.mkAttrs(builderEmpty.finish()); + BindingsBuilder builderNested(state, state.allocBindings(1)); + builderNested.insert(state.symbols.create("zero"), &vZero); + Value vAttrsNested; + vAttrsNested.mkAttrs(builderNested.finish()); + BindingsBuilder builder(state, state.allocBindings(10)); builder.insert(state.symbols.create("one"), &vOne); builder.insert(state.symbols.create("two"), &vTwo); - builder.insert(state.symbols.create("nested"), &vAttrsEmpty); + builder.insert(state.symbols.create("empty"), &vAttrsEmpty); + builder.insert(state.symbols.create("nested"), &vAttrsNested); Value vAttrs; vAttrs.mkAttrs(builder.finish()); @@ -220,9 +229,9 @@ TEST_F(ValuePrintingTests, depthAttrs) vNested.mkAttrs(builder2.finish()); test(vNested, "{ nested = { ... }; one = 1; two = 2; }", PrintOptions { .maxDepth = 1 }); - test(vNested, "{ nested = { nested = { ... }; one = 1; two = 2; }; one = 1; two = 2; }", PrintOptions { .maxDepth = 2 }); - test(vNested, "{ nested = { nested = { }; one = 1; two = 2; }; one = 1; two = 2; }", PrintOptions { .maxDepth = 3 }); - test(vNested, "{ nested = { nested = { }; one = 1; two = 2; }; one = 1; two = 2; }", PrintOptions { .maxDepth = 4 }); + test(vNested, "{ nested = { empty = { }; nested = { ... }; one = 1; two = 2; }; one = 1; two = 2; }", PrintOptions { .maxDepth = 2 }); + test(vNested, "{ nested = { empty = { }; nested = { zero = 0; }; one = 1; two = 2; }; one = 1; two = 2; }", PrintOptions { .maxDepth = 3 }); + test(vNested, "{ nested = { empty = { }; nested = { zero = 0; }; one = 1; two = 2; }; one = 1; two = 2; }", PrintOptions { .maxDepth = 4 }); } TEST_F(ValuePrintingTests, depthList)