1
1
Fork 0
mirror of https://github.com/NixOS/nix.git synced 2025-11-19 08:49:35 +01:00

Make getFields just return the name of the fields

Makes it much easier to deal with non-evaluating stuff
This commit is contained in:
regnat 2021-06-09 20:46:05 +02:00
parent 3a9753132e
commit 1f8541258c
3 changed files with 20 additions and 30 deletions

View file

@ -1297,7 +1297,7 @@ void EvalState::getAttrFieldThrow(Value & attrs, const std::vector<Symbol> & sel
throw Error("Missing attribute path '%s'", "ImTooLazyToImplementThisRightNow");
}
std::vector<Attr> EvalState::getFields(Value & attrs, const Pos & pos)
std::vector<Symbol> EvalState::getFields(Value & attrs, const Pos & pos)
{
auto eval_cache = attrs.getEvalCache();
if (eval_cache.isEmpty()) {
@ -1305,34 +1305,14 @@ std::vector<Attr> EvalState::getFields(Value & attrs, const Pos & pos)
eval_cache = attrs.getEvalCache();
}
if (auto attrNames = eval_cache.listChildren(symbols)) {
bool everythingCached = true;
std::vector<Attr> res;
for (auto & attrName : *attrNames) {
auto newValue = allocValue();
try {
if (lazyGetAttrField(attrs, {attrName}, pos, *newValue) != LazyValueType::Missing) {
res.push_back(Attr(attrName, newValue));
} else {
everythingCached = false;
break;
}
} catch (EvalError & e) {
// XXX: Ugly hack to hide the error
newValue->mkThunk(
&baseEnv,
new ExprApp(
parseExprFromString("throw", "/"),
new ExprString(symbols.create(e.what()))
)
);
}
}
if (everythingCached) return res;
return *attrNames;
}
forceValue(attrs);
auto attrsStart = attrs.attrs->attrs;
return std::vector<Attr>(attrsStart, attrsStart + attrs.attrs->size());
std::vector<Symbol> res;
for (auto & attr : *attrs.attrs)
res.push_back(attr.name);
return res;
}
void ExprSelect::eval(EvalState & state, Env & env, Value & v)

View file

@ -371,7 +371,7 @@ public:
// found
void getAttrFieldThrow(Value & attrs, const std::vector<Symbol> & selector, const Pos & pos, Value & dest);
std::vector<Attr> getFields(Value & attrs, const Pos & pos);
std::vector<Symbol> getFields(Value & attrs, const Pos & pos);
};

View file

@ -93,10 +93,20 @@ struct CmdSearch : InstallableCommand, MixJSON
fmt("evaluating '%s'", concatStringsSep(".", attrPath)));
auto recurse = [&]()
{
for (auto & attr : state->getFields(current, noPos)) {
for (auto & attrName : state->getFields(current, noPos)) {
try {
auto attrPath2(attrPath);
attrPath2.push_back(attr.name);
visit2(*attr.value, attrPath2, false);
attrPath2.push_back(attrName);
auto attrValue = state->allocValue();
auto value_ = allocRootValue(attrValue);
state->lazyGetAttrField(current, {attrName}, noPos,
*attrValue);
visit2(*attrValue, attrPath2, false);
} catch (EvalError &e) {
if (!(attrPath.size() > 0 &&
attrPath[0] == "legacyPackages"))
throw;
}
}
};