aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoreldritch horrors <pennae@lix.systems>2024-03-08 05:06:09 +0100
committereldritch horrors <pennae@lix.systems>2024-03-09 00:05:41 -0700
commit609a8e0d94926cae460ed6f12f1f8a3d9f91246b (patch)
tree81a786aa9ca89c3953097778766ad9a3df9054b4 /src
parent2f7c3fa2516a386af6c556dedc2811edb8302ffc (diff)
Merge pull request #9754 from 9999years/print-value-when-coercion-fails
Print the value in `error: cannot coerce` messages (cherry picked from commit 5b7bfd2d6b89d7dd5f54c1ca6c8072358d31a84e) === test taken from 6e8d5983143ae576e3f4b1d2954a5267f2943a49; it was added previously (and not backported because its pr was a mostly-revert), but it's useful to have around. Change-Id: Icbd14b55e3610ce7b774667bf14b82e6dc717982
Diffstat (limited to 'src')
-rw-r--r--src/libexpr/eval.cc10
-rw-r--r--src/libexpr/print-options.hh8
-rw-r--r--src/libexpr/print.cc11
3 files changed, 21 insertions, 8 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index 6d314463b..d3d1eb7f1 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -2279,7 +2279,9 @@ BackedStringView EvalState::coerceToString(
return std::move(*maybeString);
auto i = v.attrs->find(sOutPath);
if (i == v.attrs->end()) {
- error("cannot coerce %1% to a string", showType(v))
+ error("cannot coerce %1% to a string: %2%",
+ showType(v),
+ ValuePrinter(*this, v, errorPrintOptions))
.withTrace(pos, errorCtx)
.debugThrow<TypeError>();
}
@@ -2325,7 +2327,9 @@ BackedStringView EvalState::coerceToString(
}
}
- error("cannot coerce %1% to a string", showType(v))
+ error("cannot coerce %1% to a string: %2%",
+ showType(v),
+ ValuePrinter(*this, v, errorPrintOptions))
.withTrace(pos, errorCtx)
.debugThrow<TypeError>();
}
@@ -2657,7 +2661,7 @@ void EvalState::printStatistics()
std::string ExternalValueBase::coerceToString(const Pos & pos, NixStringContext & context, bool copyMore, bool copyToStore) const
{
throw TypeError({
- .msg = hintfmt("cannot coerce %1% to a string", showType())
+ .msg = hintfmt("cannot coerce %1% to a string: %2%", showType(), *this)
});
}
diff --git a/src/libexpr/print-options.hh b/src/libexpr/print-options.hh
index aba2eaeae..e03746ece 100644
--- a/src/libexpr/print-options.hh
+++ b/src/libexpr/print-options.hh
@@ -36,11 +36,17 @@ struct PrintOptions
*/
size_t maxDepth = std::numeric_limits<size_t>::max();
/**
- * Maximum number of attributes in an attribute set to print.
+ * Maximum number of attributes in attribute sets to print.
+ *
+ * Note that this is a limit for the entire print invocation, not for each
+ * attribute set encountered.
*/
size_t maxAttrs = std::numeric_limits<size_t>::max();
/**
* Maximum number of list items to print.
+ *
+ * Note that this is a limit for the entire print invocation, not for each
+ * list encountered.
*/
size_t maxListItems = std::numeric_limits<size_t>::max();
/**
diff --git a/src/libexpr/print.cc b/src/libexpr/print.cc
index 28ca8874c..139568b5e 100644
--- a/src/libexpr/print.cc
+++ b/src/libexpr/print.cc
@@ -18,7 +18,7 @@ void printElided(
{
if (ansiColors)
output << ANSI_FAINT;
- output << " «";
+ output << "«";
pluralize(output, value, single, plural);
output << " elided»";
if (ansiColors)
@@ -35,7 +35,7 @@ printLiteralString(std::ostream & str, const std::string_view string, size_t max
str << "\"";
for (auto i = string.begin(); i != string.end(); ++i) {
if (charsPrinted >= maxLength) {
- str << "\"";
+ str << "\" ";
printElided(str, string.length() - charsPrinted, "byte", "bytes", ansiColors);
return str;
}
@@ -159,6 +159,8 @@ private:
EvalState & state;
PrintOptions options;
std::optional<ValuesSeen> seen;
+ size_t attrsPrinted = 0;
+ size_t listItemsPrinted = 0;
void printRepeated()
{
@@ -277,7 +279,6 @@ private:
else
std::sort(sorted.begin(), sorted.end(), ImportantFirstAttrNameCmp());
- size_t attrsPrinted = 0;
for (auto & i : sorted) {
if (attrsPrinted >= options.maxAttrs) {
printElided(sorted.size() - attrsPrinted, "attribute", "attributes");
@@ -305,7 +306,6 @@ private:
output << "[ ";
if (depth < options.maxDepth) {
- size_t listItemsPrinted = 0;
for (auto elem : v.listItems()) {
if (listItemsPrinted >= options.maxListItems) {
printElided(v.listSize() - listItemsPrinted, "item", "items");
@@ -484,6 +484,9 @@ public:
void print(Value & v)
{
+ attrsPrinted = 0;
+ listItemsPrinted = 0;
+
if (options.trackRepeated) {
seen.emplace();
} else {