forked from lix-project/lix
add DebugTrace for error
This commit is contained in:
parent
88a54108eb
commit
1bec3fb337
|
@ -123,28 +123,44 @@ ref<EvalState> EvalCommand::getEvalState()
|
||||||
// clear the screen.
|
// clear the screen.
|
||||||
// std::cout << "\033[2J\033[1;1H";
|
// std::cout << "\033[2J\033[1;1H";
|
||||||
|
|
||||||
|
auto dts =
|
||||||
|
error && expr.getPos() ?
|
||||||
|
std::unique_ptr<DebugTraceStacker>(
|
||||||
|
new DebugTraceStacker(
|
||||||
|
*evalState,
|
||||||
|
DebugTrace
|
||||||
|
{.pos = *expr.getPos(),
|
||||||
|
.expr = expr,
|
||||||
|
.env = env,
|
||||||
|
.hint = error->info().msg,
|
||||||
|
.is_error = true
|
||||||
|
}))
|
||||||
|
: nullptr;
|
||||||
|
|
||||||
|
|
||||||
if (error)
|
if (error)
|
||||||
printError("%s\n\n" ANSI_BOLD "Starting REPL to allow you to inspect the current state of the evaluator.\n" ANSI_NORMAL, error->what());
|
printError("%s\n\n" ANSI_BOLD "Starting REPL to allow you to inspect the current state of the evaluator.\n" ANSI_NORMAL, error->what());
|
||||||
else
|
|
||||||
{
|
|
||||||
auto iter = evalState->debugTraces.begin();
|
|
||||||
if (iter != evalState->debugTraces.end()) {
|
|
||||||
std::cout << "\n" << "… " << iter->hint.str() << "\n";
|
|
||||||
|
|
||||||
if (iter->pos.has_value() && (*iter->pos)) {
|
// else
|
||||||
auto pos = iter->pos.value();
|
// {
|
||||||
std::cout << "\n";
|
// auto iter = evalState->debugTraces.begin();
|
||||||
printAtPos(pos, std::cout);
|
// if (iter != evalState->debugTraces.end()) {
|
||||||
|
// std::cout << "\n" << "… " << iter->hint.str() << "\n";
|
||||||
|
|
||||||
auto loc = getCodeLines(pos);
|
// if (iter->pos.has_value() && (*iter->pos)) {
|
||||||
if (loc.has_value()) {
|
// auto pos = iter->pos.value();
|
||||||
std::cout << "\n";
|
// std::cout << "\n";
|
||||||
printCodeLines(std::cout, "", pos, *loc);
|
// printAtPos(pos, std::cout);
|
||||||
std::cout << "\n";
|
|
||||||
}
|
// auto loc = getCodeLines(pos);
|
||||||
}
|
// if (loc.has_value()) {
|
||||||
}
|
// std::cout << "\n";
|
||||||
}
|
// printCodeLines(std::cout, "", pos, *loc);
|
||||||
|
// std::cout << "\n";
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
if (expr.staticenv)
|
if (expr.staticenv)
|
||||||
{
|
{
|
||||||
|
|
|
@ -983,7 +983,8 @@ LocalNoInline(std::unique_ptr<DebugTraceStacker>
|
||||||
{.pos = pos,
|
{.pos = pos,
|
||||||
.expr = expr,
|
.expr = expr,
|
||||||
.env = env,
|
.env = env,
|
||||||
.hint = hintfmt(s, s2)
|
.hint = hintfmt(s, s2),
|
||||||
|
.is_error = false
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -77,6 +77,7 @@ struct DebugTrace {
|
||||||
const Expr &expr;
|
const Expr &expr;
|
||||||
const Env &env;
|
const Env &env;
|
||||||
hintformat hint;
|
hintformat hint;
|
||||||
|
bool is_error;
|
||||||
};
|
};
|
||||||
|
|
||||||
class EvalState
|
class EvalState
|
||||||
|
|
|
@ -84,7 +84,7 @@ struct Expr
|
||||||
virtual void setName(Symbol & name);
|
virtual void setName(Symbol & name);
|
||||||
|
|
||||||
std::shared_ptr<const StaticEnv> staticenv;
|
std::shared_ptr<const StaticEnv> staticenv;
|
||||||
virtual Pos* getPos() = 0;
|
virtual const Pos* getPos() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
std::ostream & operator << (std::ostream & str, const Expr & e);
|
std::ostream & operator << (std::ostream & str, const Expr & e);
|
||||||
|
@ -100,7 +100,7 @@ struct ExprInt : Expr
|
||||||
Value v;
|
Value v;
|
||||||
ExprInt(NixInt n) : n(n) { v.mkInt(n); };
|
ExprInt(NixInt n) : n(n) { v.mkInt(n); };
|
||||||
Value * maybeThunk(EvalState & state, Env & env);
|
Value * maybeThunk(EvalState & state, Env & env);
|
||||||
Pos* getPos() { return 0; }
|
const Pos* getPos() const { return 0; }
|
||||||
COMMON_METHODS
|
COMMON_METHODS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -110,7 +110,7 @@ struct ExprFloat : Expr
|
||||||
Value v;
|
Value v;
|
||||||
ExprFloat(NixFloat nf) : nf(nf) { v.mkFloat(nf); };
|
ExprFloat(NixFloat nf) : nf(nf) { v.mkFloat(nf); };
|
||||||
Value * maybeThunk(EvalState & state, Env & env);
|
Value * maybeThunk(EvalState & state, Env & env);
|
||||||
Pos* getPos() { return 0; }
|
const Pos* getPos() const { return 0; }
|
||||||
COMMON_METHODS
|
COMMON_METHODS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -120,7 +120,7 @@ struct ExprString : Expr
|
||||||
Value v;
|
Value v;
|
||||||
ExprString(std::string s) : s(std::move(s)) { v.mkString(this->s.data()); };
|
ExprString(std::string s) : s(std::move(s)) { v.mkString(this->s.data()); };
|
||||||
Value * maybeThunk(EvalState & state, Env & env);
|
Value * maybeThunk(EvalState & state, Env & env);
|
||||||
Pos* getPos() { return 0; }
|
const Pos* getPos() const { return 0; }
|
||||||
COMMON_METHODS
|
COMMON_METHODS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -130,7 +130,7 @@ struct ExprPath : Expr
|
||||||
Value v;
|
Value v;
|
||||||
ExprPath(const string & s) : s(s) { v.mkPath(this->s.c_str()); };
|
ExprPath(const string & s) : s(s) { v.mkPath(this->s.c_str()); };
|
||||||
Value * maybeThunk(EvalState & state, Env & env);
|
Value * maybeThunk(EvalState & state, Env & env);
|
||||||
Pos* getPos() { return 0; }
|
const Pos* getPos() const { return 0; }
|
||||||
COMMON_METHODS
|
COMMON_METHODS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -158,7 +158,7 @@ struct ExprVar : Expr
|
||||||
ExprVar(const Symbol & name) : name(name) { };
|
ExprVar(const Symbol & name) : name(name) { };
|
||||||
ExprVar(const Pos & pos, const Symbol & name) : pos(pos), name(name) { };
|
ExprVar(const Pos & pos, const Symbol & name) : pos(pos), name(name) { };
|
||||||
Value * maybeThunk(EvalState & state, Env & env);
|
Value * maybeThunk(EvalState & state, Env & env);
|
||||||
Pos* getPos() { return &pos; }
|
const Pos* getPos() const { return &pos; }
|
||||||
COMMON_METHODS
|
COMMON_METHODS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -169,7 +169,7 @@ struct ExprSelect : Expr
|
||||||
AttrPath attrPath;
|
AttrPath attrPath;
|
||||||
ExprSelect(const Pos & pos, Expr * e, const AttrPath & attrPath, Expr * def) : pos(pos), e(e), def(def), attrPath(attrPath) { };
|
ExprSelect(const Pos & pos, Expr * e, const AttrPath & attrPath, Expr * def) : pos(pos), e(e), def(def), attrPath(attrPath) { };
|
||||||
ExprSelect(const Pos & pos, Expr * e, const Symbol & name) : pos(pos), e(e), def(0) { attrPath.push_back(AttrName(name)); };
|
ExprSelect(const Pos & pos, Expr * e, const Symbol & name) : pos(pos), e(e), def(0) { attrPath.push_back(AttrName(name)); };
|
||||||
Pos* getPos() { return &pos; }
|
const Pos* getPos() const { return &pos; }
|
||||||
COMMON_METHODS
|
COMMON_METHODS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -178,7 +178,7 @@ struct ExprOpHasAttr : Expr
|
||||||
Expr * e;
|
Expr * e;
|
||||||
AttrPath attrPath;
|
AttrPath attrPath;
|
||||||
ExprOpHasAttr(Expr * e, const AttrPath & attrPath) : e(e), attrPath(attrPath) { };
|
ExprOpHasAttr(Expr * e, const AttrPath & attrPath) : e(e), attrPath(attrPath) { };
|
||||||
Pos* getPos() { return e->getPos(); }
|
const Pos* getPos() const { return e->getPos(); }
|
||||||
COMMON_METHODS
|
COMMON_METHODS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -207,7 +207,7 @@ struct ExprAttrs : Expr
|
||||||
DynamicAttrDefs dynamicAttrs;
|
DynamicAttrDefs dynamicAttrs;
|
||||||
ExprAttrs(const Pos &pos) : recursive(false), pos(pos) { };
|
ExprAttrs(const Pos &pos) : recursive(false), pos(pos) { };
|
||||||
ExprAttrs() : recursive(false), pos(noPos) { };
|
ExprAttrs() : recursive(false), pos(noPos) { };
|
||||||
Pos* getPos() { return &pos; }
|
const Pos* getPos() const { return &pos; }
|
||||||
COMMON_METHODS
|
COMMON_METHODS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -215,7 +215,7 @@ struct ExprList : Expr
|
||||||
{
|
{
|
||||||
std::vector<Expr *> elems;
|
std::vector<Expr *> elems;
|
||||||
ExprList() { };
|
ExprList() { };
|
||||||
Pos* getPos() { return 0; }
|
const Pos* getPos() const { return 0; }
|
||||||
COMMON_METHODS
|
COMMON_METHODS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -264,7 +264,7 @@ struct ExprLambda : Expr
|
||||||
void setName(Symbol & name);
|
void setName(Symbol & name);
|
||||||
string showNamePos() const;
|
string showNamePos() const;
|
||||||
inline bool hasFormals() const { return formals != nullptr; }
|
inline bool hasFormals() const { return formals != nullptr; }
|
||||||
Pos* getPos() { return &pos; }
|
const Pos* getPos() const { return &pos; }
|
||||||
COMMON_METHODS
|
COMMON_METHODS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -276,7 +276,7 @@ struct ExprCall : Expr
|
||||||
ExprCall(const Pos & pos, Expr * fun, std::vector<Expr *> && args)
|
ExprCall(const Pos & pos, Expr * fun, std::vector<Expr *> && args)
|
||||||
: fun(fun), args(args), pos(pos)
|
: fun(fun), args(args), pos(pos)
|
||||||
{ }
|
{ }
|
||||||
Pos* getPos() { return &pos; }
|
const Pos* getPos() const { return &pos; }
|
||||||
COMMON_METHODS
|
COMMON_METHODS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -285,7 +285,7 @@ struct ExprLet : Expr
|
||||||
ExprAttrs * attrs;
|
ExprAttrs * attrs;
|
||||||
Expr * body;
|
Expr * body;
|
||||||
ExprLet(ExprAttrs * attrs, Expr * body) : attrs(attrs), body(body) { };
|
ExprLet(ExprAttrs * attrs, Expr * body) : attrs(attrs), body(body) { };
|
||||||
Pos* getPos() { return 0; }
|
const Pos* getPos() const { return 0; }
|
||||||
COMMON_METHODS
|
COMMON_METHODS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -295,7 +295,7 @@ struct ExprWith : Expr
|
||||||
Expr * attrs, * body;
|
Expr * attrs, * body;
|
||||||
size_t prevWith;
|
size_t prevWith;
|
||||||
ExprWith(const Pos & pos, Expr * attrs, Expr * body) : pos(pos), attrs(attrs), body(body) { };
|
ExprWith(const Pos & pos, Expr * attrs, Expr * body) : pos(pos), attrs(attrs), body(body) { };
|
||||||
Pos* getPos() { return &pos; }
|
const Pos* getPos() const { return &pos; }
|
||||||
COMMON_METHODS
|
COMMON_METHODS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -304,7 +304,7 @@ struct ExprIf : Expr
|
||||||
Pos pos;
|
Pos pos;
|
||||||
Expr * cond, * then, * else_;
|
Expr * cond, * then, * else_;
|
||||||
ExprIf(const Pos & pos, Expr * cond, Expr * then, Expr * else_) : pos(pos), cond(cond), then(then), else_(else_) { };
|
ExprIf(const Pos & pos, Expr * cond, Expr * then, Expr * else_) : pos(pos), cond(cond), then(then), else_(else_) { };
|
||||||
Pos* getPos() { return &pos; }
|
const Pos* getPos() const { return &pos; }
|
||||||
COMMON_METHODS
|
COMMON_METHODS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -313,7 +313,7 @@ struct ExprAssert : Expr
|
||||||
Pos pos;
|
Pos pos;
|
||||||
Expr * cond, * body;
|
Expr * cond, * body;
|
||||||
ExprAssert(const Pos & pos, Expr * cond, Expr * body) : pos(pos), cond(cond), body(body) { };
|
ExprAssert(const Pos & pos, Expr * cond, Expr * body) : pos(pos), cond(cond), body(body) { };
|
||||||
Pos* getPos() { return &pos; }
|
const Pos* getPos() const { return &pos; }
|
||||||
COMMON_METHODS
|
COMMON_METHODS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -321,7 +321,7 @@ struct ExprOpNot : Expr
|
||||||
{
|
{
|
||||||
Expr * e;
|
Expr * e;
|
||||||
ExprOpNot(Expr * e) : e(e) { };
|
ExprOpNot(Expr * e) : e(e) { };
|
||||||
Pos* getPos() { return 0; }
|
const Pos* getPos() const { return 0; }
|
||||||
COMMON_METHODS
|
COMMON_METHODS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -341,7 +341,7 @@ struct ExprOpNot : Expr
|
||||||
e1->bindVars(env); e2->bindVars(env); \
|
e1->bindVars(env); e2->bindVars(env); \
|
||||||
} \
|
} \
|
||||||
void eval(EvalState & state, Env & env, Value & v); \
|
void eval(EvalState & state, Env & env, Value & v); \
|
||||||
Pos* getPos() { return &pos; } \
|
const Pos* getPos() const { return &pos; } \
|
||||||
};
|
};
|
||||||
|
|
||||||
MakeBinOp(ExprOpEq, "==")
|
MakeBinOp(ExprOpEq, "==")
|
||||||
|
@ -359,7 +359,7 @@ struct ExprConcatStrings : Expr
|
||||||
vector<std::pair<Pos, Expr *> > * es;
|
vector<std::pair<Pos, Expr *> > * es;
|
||||||
ExprConcatStrings(const Pos & pos, bool forceString, vector<std::pair<Pos, Expr *> > * es)
|
ExprConcatStrings(const Pos & pos, bool forceString, vector<std::pair<Pos, Expr *> > * es)
|
||||||
: pos(pos), forceString(forceString), es(es) { };
|
: pos(pos), forceString(forceString), es(es) { };
|
||||||
Pos* getPos() { return &pos; }
|
const Pos* getPos() const { return &pos; }
|
||||||
COMMON_METHODS
|
COMMON_METHODS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -367,7 +367,7 @@ struct ExprPos : Expr
|
||||||
{
|
{
|
||||||
Pos pos;
|
Pos pos;
|
||||||
ExprPos(const Pos & pos) : pos(pos) { };
|
ExprPos(const Pos & pos) : pos(pos) { };
|
||||||
Pos* getPos() { return &pos; }
|
const Pos* getPos() const { return &pos; }
|
||||||
COMMON_METHODS
|
COMMON_METHODS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue