debugger on autoCallFunction error

This commit is contained in:
Ben Burdette 2021-05-03 14:37:33 -06:00
parent f32c687f03
commit 2dd61411af
2 changed files with 30 additions and 10 deletions

View file

@ -79,24 +79,28 @@ ref<EvalState> EvalCommand::getEvalState()
return ref<EvalState>(evalState); return ref<EvalState>(evalState);
} }
*/ */
EvalCommand::EvalCommand()
{
addFlag({
.longName = "debugger",
.description = "start an interactive environment if evaluation fails",
.handler = {&startReplOnEvalErrors, true},
});
}
// ref<EvalState> EvalCommand::getEvalState() // ref<EvalState> EvalCommand::getEvalState()
// { // {
// if (!evalState) // if (!evalState)
// evalState = std::make_shared<EvalState>(searchPath, getStore()); // evalState = std::make_shared<EvalState>(searchPath, getStore());
// return ref<EvalState>(evalState); // return ref<EvalState>(evalState);
// } // }
EvalCommand::EvalCommand()
{
// std::cout << "EvalCommand::EvalCommand()" << std::endl;
addFlag({
.longName = "debugger",
.description = "start an interactive environment if evaluation fails",
.handler = {&startReplOnEvalErrors, true},
});
}
extern std::function<void(const Error & error, const std::map<std::string, Value *> & env)> debuggerHook; extern std::function<void(const Error & error, const std::map<std::string, Value *> & env)> debuggerHook;
ref<EvalState> EvalCommand::getEvalState() ref<EvalState> EvalCommand::getEvalState()
{ {
std::cout << " EvalCommand::getEvalState()" << startReplOnEvalErrors << std::endl;
if (!evalState) { if (!evalState) {
evalState = std::make_shared<EvalState>(searchPath, getStore()); evalState = std::make_shared<EvalState>(searchPath, getStore());
if (startReplOnEvalErrors) if (startReplOnEvalErrors)

View file

@ -1398,12 +1398,28 @@ void EvalState::autoCallFunction(Bindings & args, Value & fun, Value & res)
if (j != args.end()) { if (j != args.end()) {
actualArgs->attrs->push_back(*j); actualArgs->attrs->push_back(*j);
} else if (!i.def) { } else if (!i.def) {
throwMissingArgumentError(i.pos, R"(cannot evaluate a function that has an argument without a value ('%1%') auto error = MissingArgumentError({
.msg = hintfmt(R"(cannot evaluate a function that has an argument without a value ('%1%')
Nix attempted to evaluate a function as a top level expression; in Nix attempted to evaluate a function as a top level expression; in
this case it must have its arguments supplied either by default this case it must have its arguments supplied either by default
values, or passed explicitly with '--arg' or '--argstr'. See values, or passed explicitly with '--arg' or '--argstr'. See
https://nixos.org/manual/nix/stable/#ss-functions.)", i.name); https://nixos.org/manual/nix/stable/#ss-functions.)", i.name),
.errPos = i.pos
});
// throwMissingArgumentError(i.pos
// , R"(cannot evaluate a function that has an argument without a value ('%1%')
// Nix attempted to evaluate a function as a top level expression; in
// this case it must have its arguments supplied either by default
// values, or passed explicitly with '--arg' or '--argstr'. See
// https://nixos.org/manual/nix/stable/#ss-functions.)", i.name);
if (debuggerHook)
debuggerHook(error, {{"fun", &fun}});
throw error;
} }
} }