diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2013-05-16T17·08+0200 |
---|---|---|
committer | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2013-05-16T17·08+0200 |
commit | 18a48d80a0686ba81959057e8becc6272acd6c46 (patch) | |
tree | e3f1fabe22a2c2da63c0ea7880cedee6bdb55a87 /src/libexpr/eval.cc | |
parent | 1b3a03f1610b714adca41637ccd85a8157e236ab (diff) |
Show function names in error messages
Functions in Nix are anonymous, but if they're assigned to a variable/attribute, we can use the variable/attribute name in error messages, e.g. while evaluating `concatMapStrings' at `/nix/var/nix/profiles/per-user/root/channels/nixos/nixpkgs/pkgs/lib/strings.nix:18:25': ...
Diffstat (limited to 'src/libexpr/eval.cc')
-rw-r--r-- | src/libexpr/eval.cc | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index 551ed4ba501b..c927db2c10c6 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -247,6 +247,11 @@ LocalNoInlineNoReturn(void throwTypeError(const char * s, const Pos & pos, const throw TypeError(format(s) % pos % s2); } +LocalNoInlineNoReturn(void throwTypeError(const char * s, const string & s1, const string & s2)) +{ + throw TypeError(format(s) % s1 % s2); +} + LocalNoInlineNoReturn(void throwTypeError(const char * s, const Pos & pos)) { throw TypeError(format(s) % pos); @@ -755,8 +760,8 @@ void EvalState::callFunction(Value & fun, Value & arg, Value & v) foreach (Formals::Formals_::iterator, i, fun.lambda.fun->formals->formals) { Bindings::iterator j = arg.attrs->find(i->name); if (j == arg.attrs->end()) { - if (!i->def) throwTypeError("function at %1% called without required argument `%2%'", - fun.lambda.fun->pos, i->name); + if (!i->def) throwTypeError("%1% called without required argument `%2%'", + fun.lambda.fun->showNamePos(), i->name); env2.values[displ++] = i->def->maybeThunk(*this, env2); } else { attrsUsed++; @@ -771,7 +776,7 @@ void EvalState::callFunction(Value & fun, Value & arg, Value & v) user. */ foreach (Bindings::iterator, i, *arg.attrs) if (fun.lambda.fun->formals->argNames.find(i->name) == fun.lambda.fun->formals->argNames.end()) - throwTypeError("function at %1% called with unexpected argument `%2%'", fun.lambda.fun->pos, i->name); + throwTypeError("%1% called with unexpected argument `%2%'", fun.lambda.fun->showNamePos(), i->name); abort(); // can't happen } } @@ -782,7 +787,7 @@ void EvalState::callFunction(Value & fun, Value & arg, Value & v) try { fun.lambda.fun->body->eval(*this, env2, v); } catch (Error & e) { - addErrorPrefix(e, "while evaluating the function at %1%:\n", fun.lambda.fun->pos); + addErrorPrefix(e, "while evaluating %1%:\n", fun.lambda.fun->showNamePos()); throw; } } |