From 56370378023fc84eb0153b991f4138f6acd011e3 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Wed, 6 Jul 2011 10:58:17 +0000 Subject: * 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’. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- src/libexpr/nixexpr.cc | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'src/libexpr/nixexpr.cc') diff --git a/src/libexpr/nixexpr.cc b/src/libexpr/nixexpr.cc index 147f50853e9d..5957618702a2 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; -- cgit 1.4.1