don't use full Pos for findPackageFilename/editorFor

only file and line of the returned position were ever used, it wasn't actually
used a position. as such we may as well use a path+int pair for only those two
values and remove a use of Pos that would not work well with a position table.
This commit is contained in:
pennae 2022-03-04 20:54:50 +01:00
parent 38de79fcf7
commit 39df15fb8e
6 changed files with 29 additions and 31 deletions

View file

@ -197,17 +197,17 @@ void StorePathCommand::run(ref<Store> store, std::vector<StorePath> && storePath
run(store, *storePaths.begin()); run(store, *storePaths.begin());
} }
Strings editorFor(const Pos & pos) Strings editorFor(const Path & file, uint32_t line)
{ {
auto editor = getEnv("EDITOR").value_or("cat"); auto editor = getEnv("EDITOR").value_or("cat");
auto args = tokenizeString<Strings>(editor); auto args = tokenizeString<Strings>(editor);
if (pos.line > 0 && ( if (line > 0 && (
editor.find("emacs") != std::string::npos || editor.find("emacs") != std::string::npos ||
editor.find("nano") != std::string::npos || editor.find("nano") != std::string::npos ||
editor.find("vim") != std::string::npos || editor.find("vim") != std::string::npos ||
editor.find("kak") != std::string::npos)) editor.find("kak") != std::string::npos))
args.push_back(fmt("+%d", pos.line)); args.push_back(fmt("+%d", line));
args.push_back(pos.file); args.push_back(file);
return args; return args;
} }

View file

@ -219,7 +219,7 @@ static RegisterCommand registerCommand2(std::vector<std::string> && name)
/* Helper function to generate args that invoke $EDITOR on /* Helper function to generate args that invoke $EDITOR on
filename:lineno. */ filename:lineno. */
Strings editorFor(const Pos & pos); Strings editorFor(const Path & file, uint32_t line);
struct MixProfile : virtual StoreCommand struct MixProfile : virtual StoreCommand
{ {

View file

@ -106,7 +106,7 @@ std::pair<Value *, Pos> findAlongAttrPath(EvalState & state, const std::string &
} }
Pos findPackageFilename(EvalState & state, Value & v, std::string what) std::pair<std::string, uint32_t> findPackageFilename(EvalState & state, Value & v, std::string what)
{ {
Value * v2; Value * v2;
try { try {
@ -132,9 +132,7 @@ Pos findPackageFilename(EvalState & state, Value & v, std::string what)
throw ParseError("cannot parse line number '%s'", pos); throw ParseError("cannot parse line number '%s'", pos);
} }
Symbol file = state.symbols.create(filename); return { std::move(filename), lineno };
return { foFile, file, lineno, 0 };
} }

View file

@ -17,7 +17,7 @@ std::pair<Value *, Pos> findAlongAttrPath(
Value & vIn); Value & vIn);
/* Heuristic to find the filename and lineno or a nix value. */ /* Heuristic to find the filename and lineno or a nix value. */
Pos findPackageFilename(EvalState & state, Value & v, std::string what); std::pair<std::string, uint32_t> findPackageFilename(EvalState & state, Value & v, std::string what);
std::vector<Symbol> parseAttrPath(EvalState & state, std::string_view s); std::vector<Symbol> parseAttrPath(EvalState & state, std::string_view s);

View file

@ -30,17 +30,17 @@ struct CmdEdit : InstallableCommand
auto [v, pos] = installable->toValue(*state); auto [v, pos] = installable->toValue(*state);
try { const auto [file, line] = [&] {
pos = findPackageFilename(*state, *v, installable->what()); try {
} catch (NoPositionInfo &) { return findPackageFilename(*state, *v, installable->what());
} } catch (NoPositionInfo &) {
throw Error("cannot find position information for '%s", installable->what());
if (pos == noPos) }
throw Error("cannot find position information for '%s", installable->what()); }();
stopProgressBar(); stopProgressBar();
auto args = editorFor(pos); auto args = editorFor(file, line);
restoreProcessContext(); restoreProcessContext();

View file

@ -461,21 +461,21 @@ bool NixRepl::processLine(std::string line)
Value v; Value v;
evalString(arg, v); evalString(arg, v);
Pos pos; const auto [file, line] = [&] () -> std::pair<std::string, uint32_t> {
if (v.type() == nPath || v.type() == nString) {
if (v.type() == nPath || v.type() == nString) { PathSet context;
PathSet context; auto filename = state->coerceToString(noPos, v, context);
auto filename = state->coerceToString(noPos, v, context); return {state->symbols.create(*filename), 0};
pos.file = state->symbols.create(*filename); } else if (v.isLambda()) {
} else if (v.isLambda()) { return {v.lambda.fun->pos.file, v.lambda.fun->pos.line};
pos = v.lambda.fun->pos; } else {
} else { // assume it's a derivation
// assume it's a derivation return findPackageFilename(*state, v, arg);
pos = findPackageFilename(*state, v, arg); }
} }();
// Open in EDITOR // Open in EDITOR
auto args = editorFor(pos); auto args = editorFor(file, line);
auto editor = args.front(); auto editor = args.front();
args.pop_front(); args.pop_front();