* 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.
This commit is contained in:
Eelco Dolstra 2011-07-06 10:58:17 +00:00
parent 34f4b91820
commit 5637037802
4 changed files with 47 additions and 24 deletions

View file

@ -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;