From: Juerg Billeter Date: Thu, 21 Feb 2008 21:45:32 +0000 (+0000) Subject: support delegate parameters in creation methods, fixes bug 513273 X-Git-Tag: VALA_0_1_7~63 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=49e3f10ae5a9486a0430f41137308ba5b3bfa791;p=platform%2Fupstream%2Fvala.git support delegate parameters in creation methods, fixes bug 513273 2008-02-21 Juerg Billeter * vala/valamemorymanager.vala, vala/valaparenthesizedexpression.vala, vala/valasemanticanalyzer.vala, vala/valasymbolresolver.vala, gobject/valaccodegenerator.vala: support delegate parameters in creation methods, fixes bug 513273 svn path=/trunk/; revision=1028 --- diff --git a/ChangeLog b/ChangeLog index 34190f2..0993497 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-02-21 Jürg Billeter + + * 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 * vapi/packages/libsoup-2.4/: update to libsoup 2.3.2 diff --git a/gobject/valaccodegenerator.vala b/gobject/valaccodegenerator.vala index 3eb4339..0302823 100644 --- a/gobject/valaccodegenerator.vala +++ b/gobject/valaccodegenerator.vala @@ -2220,6 +2220,8 @@ public class Vala.CCodeGenerator : CodeGenerator { } public override void visit_parenthesized_expression (ParenthesizedExpression! expr) { + expr.accept_children (this); + expr.ccodenode = new CCodeParenthesizedExpression ((CCodeExpression) expr.inner.ccodenode); visit_expression (expr); @@ -2373,6 +2375,12 @@ public class Vala.CCodeGenerator : CodeGenerator { 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; @@ -2710,8 +2718,9 @@ public class Vala.CCodeGenerator : CodeGenerator { Iterator 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); @@ -2727,6 +2736,15 @@ public class Vala.CCodeGenerator : CodeGenerator { } 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 ()) { diff --git a/vala/valamemorymanager.vala b/vala/valamemorymanager.vala index c6045c4..4dd84dd 100644 --- a/vala/valamemorymanager.vala +++ b/vala/valamemorymanager.vala @@ -221,6 +221,10 @@ public class Vala.MemoryManager : CodeVisitor { } } + 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); diff --git a/vala/valaparenthesizedexpression.vala b/vala/valaparenthesizedexpression.vala index dd0e392..bcc380c 100644 --- a/vala/valaparenthesizedexpression.vala +++ b/vala/valaparenthesizedexpression.vala @@ -1,6 +1,6 @@ /* 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 @@ -54,11 +54,13 @@ public class Vala.ParenthesizedExpression : Expression { } 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; diff --git a/vala/valasemanticanalyzer.vala b/vala/valasemanticanalyzer.vala index e1561e6..9a397da 100644 --- a/vala/valasemanticanalyzer.vala +++ b/vala/valasemanticanalyzer.vala @@ -1358,6 +1358,10 @@ public class Vala.SemanticAnalyzer : CodeVisitor { } 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; @@ -2044,7 +2048,9 @@ public class Vala.SemanticAnalyzer : CodeVisitor { } 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; @@ -2153,7 +2159,27 @@ public class Vala.SemanticAnalyzer : CodeVisitor { 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 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) { @@ -2173,6 +2199,8 @@ public class Vala.SemanticAnalyzer : CodeVisitor { } 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; diff --git a/vala/valasymbolresolver.vala b/vala/valasymbolresolver.vala index 5825b63..d778d50 100644 --- a/vala/valasymbolresolver.vala +++ b/vala/valasymbolresolver.vala @@ -378,6 +378,10 @@ public class Vala.SymbolResolver : CodeVisitor { 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); }