about summary refs log tree commit diff
path: root/src/libexpr/nixexpr.hh
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2011-07-06T10·58+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2011-07-06T10·58+0000
commit56370378023fc84eb0153b991f4138f6acd011e3 (patch)
tree19034285effef61c373eef092e91f717c4cea020 /src/libexpr/nixexpr.hh
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.hh')
-rw-r--r--src/libexpr/nixexpr.hh10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/libexpr/nixexpr.hh b/src/libexpr/nixexpr.hh
index 8f976f1de8..205f579daf 100644
--- a/src/libexpr/nixexpr.hh
+++ b/src/libexpr/nixexpr.hh
@@ -40,6 +40,12 @@ struct EvalState;
 struct StaticEnv;
 
 
+/* An attribute path is a sequence of attribute names. */
+typedef vector<Symbol> AttrPath;
+
+string showAttrPath(const AttrPath & attrPath);
+
+
 /* Abstract syntax of Nix expressions. */
 
 struct Expr
@@ -124,8 +130,8 @@ struct ExprSelect : Expr
 struct ExprOpHasAttr : Expr
 {
     Expr * e;
-    Symbol name;
-    ExprOpHasAttr(Expr * e, const Symbol & name) : e(e), name(name) { };
+    AttrPath attrPath;
+    ExprOpHasAttr(Expr * e, const AttrPath & attrPath) : e(e), attrPath(attrPath) { };
     COMMON_METHODS
 };