summaryrefslogtreecommitdiffstats
path: root/src/libexpr/nixexpr.cc
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2011-07-06 10:58:17 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2011-07-06 10:58:17 +0000
commit56370378023fc84eb0153b991f4138f6acd011e3 (patch)
tree19034285effef61c373eef092e91f717c4cea020 /src/libexpr/nixexpr.cc
parent34f4b91820796381d04c6e00ea5e805cf53d25da (diff)
* In the ‘?’ operator, allow attribute paths. For instance, you can
write ‘attrs ? a.b’ to test whether ‘attrs’ has an attribute ‘a’ containing an attribute ‘b’. This is more convenient than ‘attrs ? a && attrs.a ? b’. Slight change in the semantics: it's no longer an error if the left-hand side of ‘?’ is not an attribute set. In that case it just returns false. So, ‘null ? foo’ no longer throws an error.
Diffstat (limited to 'src/libexpr/nixexpr.cc')
-rw-r--r--src/libexpr/nixexpr.cc13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/libexpr/nixexpr.cc b/src/libexpr/nixexpr.cc
index 147f50853..595761870 100644
--- a/src/libexpr/nixexpr.cc
+++ b/src/libexpr/nixexpr.cc
@@ -48,7 +48,7 @@ void ExprSelect::show(std::ostream & str)
void ExprOpHasAttr::show(std::ostream & str)
{
- str << "(" << *e << ") ? " << name;
+ str << "(" << *e << ") ? " << showAttrPath(attrPath);
}
void ExprAttrs::show(std::ostream & str)
@@ -140,6 +140,17 @@ std::ostream & operator << (std::ostream & str, const Pos & pos)
}
+string showAttrPath(const AttrPath & attrPath)
+{
+ string s;
+ foreach (AttrPath::const_iterator, i, attrPath) {
+ if (!s.empty()) s += '.';
+ s += *i;
+ }
+ return s;
+}
+
+
Pos noPos;