+2008-02-21 Jürg Billeter <j@bitron.ch>
+
+ * vala/valamemorymanager.vala, vala/valaparenthesizedexpression.vala,
+ vala/valasemanticanalyzer.vala, vala/valasymbolresolver.vala,
+ gobject/valaccodegenerator.vala: support delegate parameters in
+ creation methods, fixes bug 513273
+
2008-02-19 Jürg Billeter <j@bitron.ch>
* vapi/packages/libsoup-2.4/: update to libsoup 2.3.2
}
public override void visit_parenthesized_expression (ParenthesizedExpression! expr) {
+ expr.accept_children (this);
+
expr.ccodenode = new CCodeParenthesizedExpression ((CCodeExpression) expr.inner.ccodenode);
visit_expression (expr);
if (delegate_expr is InvocationExpression) {
var invocation_expr = (InvocationExpression) delegate_expr;
return invocation_expr.delegate_target;
+ } else if (delegate_expr is LambdaExpression) {
+ if ((current_method != null && current_method.instance) || in_constructor) {
+ return new CCodeIdentifier ("self");
+ } else {
+ return new CCodeConstant ("NULL");
+ }
} else if (delegate_expr.symbol_reference != null) {
if (delegate_expr.symbol_reference is FormalParameter) {
var param = (FormalParameter) delegate_expr.symbol_reference;
Iterator<FormalParameter> params_it = params.iterator ();
foreach (Expression arg in expr.get_argument_list ()) {
CCodeExpression cexpr = (CCodeExpression) arg.ccodenode;
+ FormalParameter param = null;
if (params_it.next ()) {
- var param = params_it.get ();
+ param = params_it.get ();
ellipsis = param.ellipsis;
if (!param.ellipsis) {
cexpr = get_implicit_cast_expression (cexpr, arg.static_type, param.type_reference);
}
creation_call.add_argument (cexpr);
+
+ if (param != null && param.type_reference is DelegateType) {
+ var deleg_type = (DelegateType) param.type_reference;
+ var d = deleg_type.delegate_symbol;
+ if (d.instance) {
+ creation_call.add_argument (get_delegate_target_cexpression (arg));
+ }
+ }
+
i++;
}
while (params_it.next ()) {
}
}
+ public override void visit_parenthesized_expression (ParenthesizedExpression! expr) {
+ expr.accept_children (this);
+ }
+
public override void visit_member_access (MemberAccess! expr) {
if (expr.inner != null) {
visit_possibly_leaked_expression (expr.inner);
/* valaparenthesizedexpression.vala
*
- * Copyright (C) 2006-2007 Jürg Billeter
+ * Copyright (C) 2006-2008 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
}
public override void accept (CodeVisitor! visitor) {
- inner.accept (visitor);
-
visitor.visit_parenthesized_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 void visit_parenthesized_expression (ParenthesizedExpression! expr) {
+ expr.inner.expected_type = expr.expected_type;
+
+ expr.accept_children (this);
+
if (expr.inner.error) {
// ignore inner error
expr.error = true;
}
public override void visit_object_creation_expression (ObjectCreationExpression! expr) {
- expr.accept_children (this);
+ if (expr.member_name != null) {
+ expr.member_name.accept (this);
+ }
Typesymbol type = null;
if (expr.symbol_reference is Method) {
var m = (Method) expr.symbol_reference;
- check_arguments (expr, new MethodType (m), m.get_parameters (), expr.get_argument_list ());
+
+ var args = expr.get_argument_list ();
+ Iterator<Expression> arg_it = args.iterator ();
+ foreach (FormalParameter param in m.get_parameters ()) {
+ if (param.ellipsis) {
+ break;
+ }
+
+ if (arg_it.next ()) {
+ Expression arg = arg_it.get ();
+
+ /* store expected type for callback parameters */
+ arg.expected_type = param.type_reference;
+ }
+ }
+
+ foreach (Expression arg in args) {
+ arg.accept (this);
+ }
+
+ check_arguments (expr, new MethodType (m), m.get_parameters (), args);
expr.tree_can_fail = expr.can_fail = (m.get_error_domains ().size > 0);
} else if (type is Enum) {
}
foreach (MemberInitializer init in expr.get_object_initializer ()) {
+ init.accept (this);
+
init.symbol_reference = symbol_lookup_inherited (expr.type_reference.data_type, init.name);
if (!(init.symbol_reference is Field || init.symbol_reference is Property)) {
expr.error = true;
e.accept_children (this);
}
+ public override void visit_parenthesized_expression (ParenthesizedExpression! expr) {
+ expr.accept_children (this);
+ }
+
public override void visit_invocation_expression (InvocationExpression! expr) {
expr.accept_children (this);
}