--- /dev/null
+/* valanamedargument.vala
+ *
+ * Copyright (C) 2009 Jürg Billeter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Author:
+ * Jürg Billeter <j@bitron.ch>
+ */
+
+public class Vala.NamedArgument : Expression {
+ public string name { get; set; }
+
+ public Expression inner {
+ get {
+ return _inner;
+ }
+ set {
+ _inner = value;
+ _inner.parent_node = this;
+ }
+ }
+
+ private Expression _inner;
+
+ public NamedArgument (string name, Expression inner, SourceReference? source_reference = null) {
+ this.name = name;
+ this.inner = inner;
+ this.source_reference = source_reference;
+ }
+
+ public override void accept (CodeVisitor visitor) {
+ visitor.visit_named_argument (this);
+
+ visitor.visit_expression (this);
+ }
+
+ public override void accept_children (CodeVisitor visitor) {
+ inner.accept (visitor);
+ }
+
+ public override void replace_expression (Expression old_node, Expression new_node) {
+ if (inner == old_node) {
+ inner = new_node;
+ }
+ }
+
+ public override bool is_pure () {
+ return inner.is_pure ();
+ }
+
+ public override bool check (SemanticAnalyzer analyzer) {
+ if (checked) {
+ return !error;
+ }
+
+ checked = true;
+
+ inner.target_type = target_type;
+
+ if (!inner.check (analyzer)) {
+ error = true;
+ return false;
+ }
+
+ value_type = inner.value_type;
+
+ return !error;
+ }
+
+ public override void get_defined_variables (Collection<LocalVariable> collection) {
+ inner.get_defined_variables (collection);
+ }
+
+ public override void get_used_variables (Collection<LocalVariable> collection) {
+ inner.get_used_variables (collection);
+ }
+}
var inner = parse_expression ();
return new UnaryExpression (UnaryOperator.OUT, inner, get_src (begin));
} else {
- return parse_expression ();
+ var expr = parse_expression ();
+ var ma = expr as MemberAccess;
+ if (ma != null && ma.inner == null && accept (TokenType.COLON)) {
+ // named argument
+ expr = parse_expression ();
+ return new NamedArgument (ma.member_name, expr, get_src (begin));
+ } else {
+ return expr;
+ }
}
}