libexpr: add findDerivationFilename

extract the derivation to filename:lineno heuristic
This commit is contained in:
Jonas Chevalier 2019-10-23 17:21:10 +02:00
parent 207a537343
commit 59c7249769
No known key found for this signature in database
GPG key ID: 71BAF6D40C1D63D7
4 changed files with 36 additions and 43 deletions

View file

@ -93,4 +93,32 @@ Value * findAlongAttrPath(EvalState & state, const string & attrPath,
} }
std::tuple<std::string, int> findDerivationFilename(EvalState & state, Value & v, std::string what)
{
Value * v2;
try {
auto dummyArgs = state.allocBindings(0);
v2 = findAlongAttrPath(state, "meta.position", *dummyArgs, v);
} catch (Error &) {
throw Error("package '%s' has no source location information", what);
}
auto pos = state.forceString(*v2);
auto colon = pos.rfind(':');
if (colon == std::string::npos)
throw Error("cannot parse meta.position attribute '%s'", pos);
std::string filename(pos, 0, colon);
int lineno;
try {
lineno = std::stoi(std::string(pos, colon + 1));
} catch (std::invalid_argument & e) {
throw Error("cannot parse line number '%s'", pos);
}
return std::make_tuple(filename, lineno);
}
} }

View file

@ -4,10 +4,15 @@
#include <string> #include <string>
#include <map> #include <map>
#include <tuple>
namespace nix { namespace nix {
Value * findAlongAttrPath(EvalState & state, const string & attrPath, Value * findAlongAttrPath(EvalState & state, const string & attrPath,
Bindings & autoArgs, Value & vIn); Bindings & autoArgs, Value & vIn);
/* Heuristic to find the filename and lineno or a derivation. */
std::tuple<std::string, int> findDerivationFilename(EvalState & state,
Value & v, std::string what);
} }

View file

@ -36,28 +36,9 @@ struct CmdEdit : InstallableCommand
auto v = installable->toValue(*state); auto v = installable->toValue(*state);
Value * v2; std::string filename;
try {
auto dummyArgs = state->allocBindings(0);
v2 = findAlongAttrPath(*state, "meta.position", *dummyArgs, *v);
} catch (Error &) {
throw Error("package '%s' has no source location information", installable->what());
}
auto pos = state->forceString(*v2);
debug("position is %s", pos);
auto colon = pos.rfind(':');
if (colon == std::string::npos)
throw Error("cannot parse meta.position attribute '%s'", pos);
std::string filename(pos, 0, colon);
int lineno; int lineno;
try { std::tie(filename, lineno) = findDerivationFilename(*state, *v, installable->what());
lineno = std::stoi(std::string(pos, colon + 1));
} catch (std::invalid_argument & e) {
throw Error("cannot parse line number '%s'", pos);
}
stopProgressBar(); stopProgressBar();

View file

@ -481,28 +481,7 @@ bool NixRepl::processLine(string line)
lineno = 0; lineno = 0;
} else { } else {
// assume it's a derivation // assume it's a derivation
Value * v2; std::tie(filename, lineno) = findDerivationFilename(state, v, arg);
try {
auto dummyArgs = state.allocBindings(0);
v2 = findAlongAttrPath(state, "meta.position", *dummyArgs, v);
} catch (Error &) {
throw Error("package '%s' has no source location information", arg);
}
auto pos = state.forceString(*v2);
debug("position is %s", pos);
auto colon = pos.rfind(':');
if (colon == std::string::npos)
throw Error("cannot parse meta.position attribute '%s'", pos);
filename = std::string(pos, 0, colon);
try {
lineno = std::stoi(std::string(pos, colon + 1));
} catch (std::invalid_argument & e) {
throw Error("cannot parse line number '%s'", pos);
}
} }
// Open in EDITOR // Open in EDITOR