aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2020-02-07 14:22:01 +0100
committerEelco Dolstra <edolstra@gmail.com>2020-03-24 14:06:47 +0100
commit231a8aa2c2196a3ba6d6bd3dc9d6c50e23e20a8d (patch)
tree9fb2341478d781e3f3f3b8a88c22cf619622466a
parentc1ca4f0accdb96295b27dadacd20b3db745e1d2d (diff)
nix edit: Support non-derivation attributes
E.g. $ nix edit .#nixosConfigurations.bla now works. (cherry picked from commit d2032edb2f86e955a8a7724a27c0c3225f386500)
-rw-r--r--src/libexpr/attr-path.cc2
-rw-r--r--src/libexpr/attr-path.hh1
-rw-r--r--src/nix/command.hh9
-rw-r--r--src/nix/edit.cc10
-rw-r--r--src/nix/eval.cc2
-rw-r--r--src/nix/installables.cc10
6 files changed, 18 insertions, 16 deletions
diff --git a/src/libexpr/attr-path.cc b/src/libexpr/attr-path.cc
index 1e22f5708..4545bfd72 100644
--- a/src/libexpr/attr-path.cc
+++ b/src/libexpr/attr-path.cc
@@ -103,7 +103,7 @@ Pos findDerivationFilename(EvalState & state, Value & v, std::string what)
auto dummyArgs = state.allocBindings(0);
v2 = findAlongAttrPath(state, "meta.position", *dummyArgs, v).first;
} catch (Error &) {
- throw Error("package '%s' has no source location information", what);
+ throw NoPositionInfo("package '%s' has no source location information", what);
}
// FIXME: is it possible to extract the Pos object instead of doing this
diff --git a/src/libexpr/attr-path.hh b/src/libexpr/attr-path.hh
index 3e78e2899..fce160da7 100644
--- a/src/libexpr/attr-path.hh
+++ b/src/libexpr/attr-path.hh
@@ -8,6 +8,7 @@
namespace nix {
MakeError(AttrPathNotFound, Error);
+MakeError(NoPositionInfo, Error);
std::pair<Value *, Pos> findAlongAttrPath(EvalState & state, const string & attrPath,
Bindings & autoArgs, Value & vIn);
diff --git a/src/nix/command.hh b/src/nix/command.hh
index 00eb46903..a954a7d04 100644
--- a/src/nix/command.hh
+++ b/src/nix/command.hh
@@ -3,17 +3,12 @@
#include "args.hh"
#include "common-eval-args.hh"
#include "path.hh"
+#include "eval.hh"
namespace nix {
extern std::string programPath;
-struct Value;
-class Bindings;
-class EvalState;
-struct Pos;
-class Store;
-
/* A command that requires a Nix store. */
struct StoreCommand : virtual Command
{
@@ -48,7 +43,7 @@ struct Installable
Buildable toBuildable();
- virtual Value * toValue(EvalState & state)
+ virtual std::pair<Value *, Pos> toValue(EvalState & state)
{
throw Error("argument '%s' cannot be evaluated", what());
}
diff --git a/src/nix/edit.cc b/src/nix/edit.cc
index ca410cd1f..1683eada0 100644
--- a/src/nix/edit.cc
+++ b/src/nix/edit.cc
@@ -29,9 +29,15 @@ struct CmdEdit : InstallableCommand
{
auto state = getEvalState();
- auto v = installable->toValue(*state);
+ auto [v, pos] = installable->toValue(*state);
- Pos pos = findDerivationFilename(*state, *v, installable->what());
+ try {
+ pos = findDerivationFilename(*state, *v, installable->what());
+ } catch (NoPositionInfo &) {
+ }
+
+ if (pos == noPos)
+ throw Error("cannot find position information for '%s", installable->what());
stopProgressBar();
diff --git a/src/nix/eval.cc b/src/nix/eval.cc
index 276fdf003..6398fc58e 100644
--- a/src/nix/eval.cc
+++ b/src/nix/eval.cc
@@ -52,7 +52,7 @@ struct CmdEval : MixJSON, InstallableCommand
auto state = getEvalState();
- auto v = installable->toValue(*state);
+ auto v = installable->toValue(*state).first;
PathSet context;
stopProgressBar();
diff --git a/src/nix/installables.cc b/src/nix/installables.cc
index eb6fca62b..013218cd9 100644
--- a/src/nix/installables.cc
+++ b/src/nix/installables.cc
@@ -121,7 +121,7 @@ struct InstallableValue : Installable
{
auto state = cmd.getEvalState();
- auto v = toValue(*state);
+ auto v = toValue(*state).first;
Bindings & autoArgs = *cmd.getAutoArgs(*state);
@@ -169,11 +169,11 @@ struct InstallableExpr : InstallableValue
std::string what() override { return text; }
- Value * toValue(EvalState & state) override
+ std::pair<Value *, Pos> toValue(EvalState & state) override
{
auto v = state.allocValue();
state.eval(state.parseExprFromString(text, absPath(".")), *v);
- return v;
+ return {v, noPos};
}
};
@@ -187,7 +187,7 @@ struct InstallableAttrPath : InstallableValue
std::string what() override { return attrPath; }
- Value * toValue(EvalState & state) override
+ std::pair<Value *, Pos> toValue(EvalState & state) override
{
auto source = cmd.getSourceExpr(state);
@@ -196,7 +196,7 @@ struct InstallableAttrPath : InstallableValue
auto v = findAlongAttrPath(state, attrPath, autoArgs, *source).first;
state.forceValue(*v);
- return v;
+ return {v, noPos};
}
};