forked from lix-project/lix
in debugger mode, print the current error when another repl returns.
This commit is contained in:
parent
50b52d5110
commit
d2ec9b4e15
|
@ -203,6 +203,30 @@ namespace {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::ostream& showDebugTrace(std::ostream &out, const DebugTrace &dt)
|
||||||
|
{
|
||||||
|
if (dt.is_error)
|
||||||
|
out << ANSI_RED "error: " << ANSI_NORMAL;
|
||||||
|
out << dt.hint.str() << "\n";
|
||||||
|
|
||||||
|
// prefer direct pos, but if noPos then try the expr.
|
||||||
|
auto pos = (*dt.pos ? *dt.pos :
|
||||||
|
(dt.expr.getPos() ? *dt.expr.getPos() : noPos));
|
||||||
|
|
||||||
|
if (pos) {
|
||||||
|
printAtPos(pos, out);
|
||||||
|
|
||||||
|
auto loc = getCodeLines(pos);
|
||||||
|
if (loc.has_value()) {
|
||||||
|
out << "\n";
|
||||||
|
printCodeLines(out, "", pos, *loc);
|
||||||
|
out << "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
void NixRepl::mainLoop(const std::vector<std::string> & files)
|
void NixRepl::mainLoop(const std::vector<std::string> & files)
|
||||||
{
|
{
|
||||||
string error = ANSI_RED "error:" ANSI_NORMAL " ";
|
string error = ANSI_RED "error:" ANSI_NORMAL " ";
|
||||||
|
@ -251,6 +275,14 @@ void NixRepl::mainLoop(const std::vector<std::string> & files)
|
||||||
} else {
|
} else {
|
||||||
printMsg(lvlError, e.msg());
|
printMsg(lvlError, e.msg());
|
||||||
}
|
}
|
||||||
|
} catch (EvalError & e) {
|
||||||
|
// in debugger mode, an EvalError should trigger another repl session.
|
||||||
|
// when that session returns the exception will land here. No need to show it again;
|
||||||
|
// show the error for this repl session instead.
|
||||||
|
if (debuggerHook && !this->state->debugTraces.empty())
|
||||||
|
showDebugTrace(std::cout, this->state->debugTraces.front());
|
||||||
|
else
|
||||||
|
printMsg(lvlError, e.msg());
|
||||||
} catch (Error & e) {
|
} catch (Error & e) {
|
||||||
printMsg(lvlError, e.msg());
|
printMsg(lvlError, e.msg());
|
||||||
} catch (Interrupted & e) {
|
} catch (Interrupted & e) {
|
||||||
|
@ -406,30 +438,6 @@ StorePath NixRepl::getDerivationPath(Value & v) {
|
||||||
return drvPath;
|
return drvPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::ostream& showDebugTrace(std::ostream &out, const DebugTrace &dt)
|
|
||||||
{
|
|
||||||
if (dt.is_error)
|
|
||||||
out << ANSI_RED "error: " << ANSI_NORMAL;
|
|
||||||
out << dt.hint.str() << "\n";
|
|
||||||
|
|
||||||
// prefer direct pos, but if noPos then try the expr.
|
|
||||||
auto pos = (*dt.pos ? *dt.pos :
|
|
||||||
(dt.expr.getPos() ? *dt.expr.getPos() : noPos));
|
|
||||||
|
|
||||||
if (pos) {
|
|
||||||
printAtPos(pos, out);
|
|
||||||
|
|
||||||
auto loc = getCodeLines(pos);
|
|
||||||
if (loc.has_value()) {
|
|
||||||
out << "\n";
|
|
||||||
printCodeLines(out, "", pos, *loc);
|
|
||||||
out << "\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
void NixRepl::loadDebugTraceEnv(DebugTrace &dt)
|
void NixRepl::loadDebugTraceEnv(DebugTrace &dt)
|
||||||
{
|
{
|
||||||
if (dt.expr.staticenv)
|
if (dt.expr.staticenv)
|
||||||
|
|
Loading…
Reference in a new issue