From: Jürg Billeter Date: Fri, 10 Oct 2008 09:40:22 +0000 (+0000) Subject: Lift restriction on statements in creation methods of GObjects in X-Git-Tag: VALA_0_4_0~36 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f2cdb601d5ceff4692939e07470cf512fef8860c;p=thirdparty%2Fvala.git Lift restriction on statements in creation methods of GObjects in 2008-10-10 Jürg Billeter * gobject/valaccodecreationmethodbinding.vala: * gobject/valaccodemethodbinding.vala: Lift restriction on statements in creation methods of GObjects in preparation to support more flexible construction scheme svn path=/trunk/; revision=1825 --- diff --git a/ChangeLog b/ChangeLog index 1cb407af6..681e4e1c4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2008-10-10 Jürg Billeter + + * gobject/valaccodecreationmethodbinding.vala: + * gobject/valaccodemethodbinding.vala: + + Lift restriction on statements in creation methods of GObjects + in preparation to support more flexible construction scheme + 2008-10-09 Jürg Billeter * vala/valainterfacewriter.vala: diff --git a/gobject/valaccodecreationmethodbinding.vala b/gobject/valaccodecreationmethodbinding.vala index 411dea580..9c85145b9 100644 --- a/gobject/valaccodecreationmethodbinding.vala +++ b/gobject/valaccodecreationmethodbinding.vala @@ -41,20 +41,12 @@ public class Vala.CCodeCreationMethodBinding : CCodeMethodBinding { if (m.body != null && codegen.current_type_symbol is Class && codegen.current_class.is_subtype_of (codegen.gobject_type)) { int n_params = 0; foreach (Statement stmt in m.body.get_statements ()) { - if (!(stmt is ExpressionStatement) || ((ExpressionStatement) stmt).assigned_property () == null) { - m.error = true; - Report.error (stmt.source_reference, "class creation methods only allow property assignment statements"); - return; - } - - Property prop = ((ExpressionStatement) stmt).assigned_property (); - if (prop.access == SymbolAccessibility.PRIVATE) { - m.error = true; - Report.error (stmt.source_reference, "class creation methods only allow assignments to public and protected properties"); - return; - } - if (prop.set_accessor.construction) { - n_params++; + var expr_stmt = stmt as ExpressionStatement; + if (expr_stmt != null) { + Property prop = expr_stmt.assigned_property (); + if (prop != null && prop.set_accessor.construction) { + n_params++; + } } } m.n_construction_params = n_params; diff --git a/gobject/valaccodemethodbinding.vala b/gobject/valaccodemethodbinding.vala index 31b8382e7..a355293c1 100644 --- a/gobject/valaccodemethodbinding.vala +++ b/gobject/valaccodemethodbinding.vala @@ -99,31 +99,42 @@ public class Vala.CCodeMethodBinding : CCodeBinding { if (m is CreationMethod) { if (in_gobject_creation_method && m.body != null) { var cblock = new CCodeBlock (); - + + // set construct properties foreach (CodeNode stmt in m.body.get_statements ()) { - if (((ExpressionStatement) stmt).assigned_property ().set_accessor.construction) { - if (stmt.ccodenode is CCodeFragment) { - foreach (CCodeNode cstmt in ((CCodeFragment) stmt.ccodenode).get_children ()) { - cblock.add_statement (cstmt); + var expr_stmt = stmt as ExpressionStatement; + if (expr_stmt != null) { + var prop = expr_stmt.assigned_property (); + if (prop != null && prop.set_accessor.construction) { + if (stmt.ccodenode is CCodeFragment) { + foreach (CCodeNode cstmt in ((CCodeFragment) stmt.ccodenode).get_children ()) { + cblock.add_statement (cstmt); + } + } else { + cblock.add_statement (stmt.ccodenode); } - } else { - cblock.add_statement (stmt.ccodenode); } } } add_object_creation (cblock, ((CreationMethod) m).n_construction_params > 0 || codegen.current_class.get_type_parameters ().size > 0); - + + // other initialization code foreach (CodeNode stmt in m.body.get_statements ()) { - if (!((ExpressionStatement) stmt).assigned_property ().set_accessor.construction) { - if (stmt.ccodenode is CCodeFragment) { - foreach (CCodeNode cstmt in ((CCodeFragment) stmt.ccodenode).get_children ()) { - cblock.add_statement (cstmt); - } - } else { - cblock.add_statement (stmt.ccodenode); + var expr_stmt = stmt as ExpressionStatement; + if (expr_stmt != null) { + var prop = expr_stmt.assigned_property (); + if (prop != null && prop.set_accessor.construction) { + continue; } } + if (stmt.ccodenode is CCodeFragment) { + foreach (CCodeNode cstmt in ((CCodeFragment) stmt.ccodenode).get_children ()) { + cblock.add_statement (cstmt); + } + } else { + cblock.add_statement (stmt.ccodenode); + } } m.body.ccodenode = cblock;