Merge pull request #8607 from hercules-ci/toJSON-trace

toJSON: Add attribute path to trace
This commit is contained in:
Eelco Dolstra 2023-07-31 15:02:07 +02:00 committed by GitHub
commit c0e735f474
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 88 additions and 3 deletions

View file

@ -6,3 +6,5 @@
[`builtins.flakeRefToString`](@docroot@/language/builtins.md#builtins-flakeRefToString), [`builtins.flakeRefToString`](@docroot@/language/builtins.md#builtins-flakeRefToString),
have been added. have been added.
These functions are useful for converting between flake references encoded as attribute sets and URLs. These functions are useful for converting between flake references encoded as attribute sets and URLs.
- [`builtins.toJSON`](@docroot@/language/builtins.md#builtins-parseFlakeRef) now prints [--show-trace](@docroot@/command-ref/conf-file.html#conf-show-trace) items for the path in which it finds an evaluation error.

View file

@ -43,6 +43,7 @@ json printValueAsJSON(EvalState & state, bool strict,
break; break;
case nNull: case nNull:
// already initialized as null
break; break;
case nAttrs: { case nAttrs: {
@ -59,7 +60,13 @@ json printValueAsJSON(EvalState & state, bool strict,
names.emplace(state.symbols[j.name]); names.emplace(state.symbols[j.name]);
for (auto & j : names) { for (auto & j : names) {
Attr & a(*v.attrs->find(state.symbols.create(j))); Attr & a(*v.attrs->find(state.symbols.create(j)));
out[j] = printValueAsJSON(state, strict, *a.value, a.pos, context, copyToStore); try {
out[j] = printValueAsJSON(state, strict, *a.value, a.pos, context, copyToStore);
} catch (Error & e) {
e.addTrace(state.positions[a.pos],
hintfmt("while evaluating attribute '%1%'", j));
throw;
}
} }
} else } else
return printValueAsJSON(state, strict, *i->value, i->pos, context, copyToStore); return printValueAsJSON(state, strict, *i->value, i->pos, context, copyToStore);
@ -68,8 +75,17 @@ json printValueAsJSON(EvalState & state, bool strict,
case nList: { case nList: {
out = json::array(); out = json::array();
for (auto elem : v.listItems()) int i = 0;
out.push_back(printValueAsJSON(state, strict, *elem, pos, context, copyToStore)); for (auto elem : v.listItems()) {
try {
out.push_back(printValueAsJSON(state, strict, *elem, pos, context, copyToStore));
} catch (Error & e) {
e.addTrace({},
hintfmt("while evaluating list element at index %1%", i));
throw;
}
i++;
}
break; break;
} }

View file

@ -0,0 +1,57 @@
error:
… while calling the 'toJSON' builtin
at /pwd/lang/eval-fail-toJSON.nix:1:1:
1| builtins.toJSON {
| ^
2| a.b = [
… while evaluating attribute 'a'
at /pwd/lang/eval-fail-toJSON.nix:2:3:
1| builtins.toJSON {
2| a.b = [
| ^
3| true
… while evaluating attribute 'b'
at /pwd/lang/eval-fail-toJSON.nix:2:3:
1| builtins.toJSON {
2| a.b = [
| ^
3| true
… while evaluating list element at index 3
… while evaluating attribute 'c'
at /pwd/lang/eval-fail-toJSON.nix:7:7:
6| {
7| c.d = throw "hah no";
| ^
8| }
… while evaluating attribute 'd'
at /pwd/lang/eval-fail-toJSON.nix:7:7:
6| {
7| c.d = throw "hah no";
| ^
8| }
… while calling the 'throw' builtin
at /pwd/lang/eval-fail-toJSON.nix:7:13:
6| {
7| c.d = throw "hah no";
| ^
8| }
error: hah no

View file

@ -0,0 +1,10 @@
builtins.toJSON {
a.b = [
true
false
"it's a bird"
{
c.d = throw "hah no";
}
];
}