aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Burdette <bburdette@gmail.com>2020-05-12 10:52:26 -0600
committerBen Burdette <bburdette@gmail.com>2020-05-12 10:52:26 -0600
commitec870b9c853ad86fb1ccb482ca87802f1b155a2c (patch)
tree888fbcecf32750a48195a585b2a28ee1ac21380a
parent7c3138844ca9ab92e2f231a7d17d7aee420ae76e (diff)
new pos format for more errors
-rw-r--r--src/libexpr/eval.cc11
-rw-r--r--src/libexpr/nixexpr.hh6
-rw-r--r--src/libexpr/primops/fetchTree.cc23
-rw-r--r--src/libexpr/primops/fromTOML.cc6
-rw-r--r--src/libstore/local-store.cc1
5 files changed, 35 insertions, 12 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index 65071206f..7af665118 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -529,7 +529,12 @@ LocalNoInlineNoReturn(void throwEvalError(const char * s, const string & s2, con
LocalNoInlineNoReturn(void throwEvalError(const char * s, const Symbol & sym, const Pos & p1, const Pos & p2))
{
- throw EvalError(s, sym, p1, p2);
+ // p1 is where the error occurred; p2 is a position mentioned in the message.
+ throw EvalError(
+ ErrorInfo {
+ .hint = hintfmt(s, sym, p2),
+ .nixCode = NixCode { .errPos = p1 }
+ });
}
LocalNoInlineNoReturn(void throwTypeError(const char * s, const Pos & pos))
@@ -638,7 +643,7 @@ inline Value * EvalState::lookupVar(Env * env, const ExprVar & var, bool noEval)
return j->value;
}
if (!env->prevWith)
- throwUndefinedVarError("undefined variable '%1%' at %2%", var.name, var.pos);
+ throwUndefinedVarError("undefined variable '%1%'", var.name, var.pos);
for (size_t l = env->prevWith; l; --l, env = env->up) ;
}
}
@@ -950,7 +955,7 @@ void ExprAttrs::eval(EvalState & state, Env & env, Value & v)
Symbol nameSym = state.symbols.create(nameVal.string.s);
Bindings::iterator j = v.attrs->find(nameSym);
if (j != v.attrs->end())
- throwEvalError("dynamic attribute '%1%' at %2% already defined at %3%", nameSym, i.pos, *j->pos);
+ throwEvalError("dynamic attribute '%1%' already defined at %2%", nameSym, i.pos, *j->pos);
i.valueExpr->setName(nameSym);
/* Keep sorted order so find can catch duplicates */
diff --git a/src/libexpr/nixexpr.hh b/src/libexpr/nixexpr.hh
index a185d5785..47d0e85ec 100644
--- a/src/libexpr/nixexpr.hh
+++ b/src/libexpr/nixexpr.hh
@@ -236,7 +236,11 @@ struct ExprLambda : Expr
: pos(pos), arg(arg), matchAttrs(matchAttrs), formals(formals), body(body)
{
if (!arg.empty() && formals && formals->argNames.find(arg) != formals->argNames.end())
- throw ParseError("duplicate formal function argument '%1%' at %2%", arg, pos);
+ throw ParseError(
+ ErrorInfo {
+ .hint = hintfmt("duplicate formal function argument '%1%'", arg),
+ .nixCode = NixCode { .errPos = pos }
+ });
};
void setName(Symbol & name);
string showNamePos() const;
diff --git a/src/libexpr/primops/fetchTree.cc b/src/libexpr/primops/fetchTree.cc
index c5a0d9886..af3b61d6a 100644
--- a/src/libexpr/primops/fetchTree.cc
+++ b/src/libexpr/primops/fetchTree.cc
@@ -66,7 +66,11 @@ static void prim_fetchTree(EvalState & state, const Pos & pos, Value * * args, V
}
if (!attrs.count("type"))
- throw Error("attribute 'type' is missing in call to 'fetchTree', at %s", pos);
+ throw Error(
+ ErrorInfo {
+ .hint = hintfmt("attribute 'type' is missing in call to 'fetchTree'"),
+ .nixCode = NixCode { .errPos = pos }
+ });
input = fetchers::inputFromAttrs(attrs);
} else
@@ -107,13 +111,20 @@ static void fetch(EvalState & state, const Pos & pos, Value * * args, Value & v,
else if (n == "name")
name = state.forceStringNoCtx(*attr.value, *attr.pos);
else
- throw EvalError("unsupported argument '%s' to '%s', at %s",
- attr.name, who, *attr.pos);
- }
+ throw EvalError(
+ ErrorInfo {
+ .hint = hintfmt("unsupported argument '%s' to '%s'",
+ attr.name, who),
+ .nixCode = NixCode { .errPos = *attr.pos }
+ });
+ }
if (!url)
- throw EvalError("'url' argument required, at %s", pos);
-
+ throw EvalError(
+ ErrorInfo {
+ .hint = hintfmt("'url' argument required"),
+ .nixCode = NixCode { .errPos = pos }
+ });
} else
url = state.forceStringNoCtx(*args[0], pos);
diff --git a/src/libexpr/primops/fromTOML.cc b/src/libexpr/primops/fromTOML.cc
index c43324dbb..948069401 100644
--- a/src/libexpr/primops/fromTOML.cc
+++ b/src/libexpr/primops/fromTOML.cc
@@ -81,7 +81,11 @@ static void prim_fromTOML(EvalState & state, const Pos & pos, Value * * args, Va
try {
visit(v, parser(tomlStream).parse());
} catch (std::runtime_error & e) {
- throw EvalError("while parsing a TOML string at %s: %s", pos, e.what());
+ throw EvalError(
+ ErrorInfo {
+ .hint = hintfmt("while parsing a TOML string: %s", e.what()),
+ .nixCode = NixCode { .errPos = pos }
+ });
}
}
diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc
index eb7548543..1f16a22b1 100644
--- a/src/libstore/local-store.cc
+++ b/src/libstore/local-store.cc
@@ -6,7 +6,6 @@
#include "derivations.hh"
#include "nar-info.hh"
#include "references.hh"
-#include "error.hh"
#include <iostream>
#include <algorithm>