diff options
author | Jürg Billeter <j@bitron.ch> | 2006-07-27 09:00:03 +0000 |
---|---|---|
committer | Jürg Billeter <juergbi@src.gnome.org> | 2006-07-27 09:00:03 +0000 |
commit | 37de41c0646db0cb020c0df3e5526b02a30b143e (patch) | |
tree | 98ce4c96318be1645089674bac234f42faaeda3f | |
parent | 8a0f8cc2c7f0d99613aff9f2b8fe3347613383cd (diff) | |
download | vala-37de41c0646db0cb020c0df3e5526b02a30b143e.tar.gz |
support for loops with local variable declaration in initializer
2006-07-27 Jürg Billeter <j@bitron.ch>
* vala/parser.y: support for loops with local variable declaration in
initializer
svn path=/trunk/; revision=85
-rw-r--r-- | vala/ChangeLog | 5 | ||||
-rw-r--r-- | vala/vala/parser.y | 61 |
2 files changed, 61 insertions, 5 deletions
diff --git a/vala/ChangeLog b/vala/ChangeLog index 35865463e..891373180 100644 --- a/vala/ChangeLog +++ b/vala/ChangeLog @@ -1,5 +1,10 @@ 2006-07-27 Jürg Billeter <j@bitron.ch> + * vala/parser.y: support for loops with local variable declaration in + initializer + +2006-07-27 Jürg Billeter <j@bitron.ch> + * vala/parser.y: don't require developer to explicitly write static in namespace field declarations, support type parameters in interfaces and callbacks diff --git a/vala/vala/parser.y b/vala/vala/parser.y index 4962e7e35..e0118472c 100644 --- a/vala/vala/parser.y +++ b/vala/vala/parser.y @@ -1088,7 +1088,7 @@ empty_statement ; declaration_statement - : comment local_variable_declaration + : comment local_variable_declaration SEMICOLON { ValaSourceReference *src = src_com(@2, $1); $$ = VALA_STATEMENT (vala_declaration_statement_new ($2, src)); @@ -1098,7 +1098,7 @@ declaration_statement ; local_variable_declaration - : local_variable_type variable_declarators SEMICOLON + : local_variable_type variable_declarators { GList *l; ValaSourceReference *src = src(@2); @@ -1113,7 +1113,7 @@ local_variable_declaration } g_list_free ($2); } - | VAR variable_declarators SEMICOLON + | VAR variable_declarators { GList *l; ValaSourceReference *src = src(@2); @@ -1247,8 +1247,8 @@ for_statement if ($5 != NULL) { g_object_unref ($5); } - g_object_unref (src); g_object_unref ($9); + g_object_unref (src); GList *l; if ($3 != NULL) { @@ -1266,6 +1266,56 @@ for_statement g_list_free ($7); } } + | FOR OPEN_PARENS local_variable_declaration SEMICOLON opt_expression SEMICOLON opt_statement_expression_list CLOSE_PARENS embedded_statement + { + ValaSourceReference *src = src(@1); + + ValaBlock *block = vala_block_new (src); + + ValaForStatement *for_statement = vala_for_statement_new ($5, $9, src); + if ($5 != NULL) { + g_object_unref ($5); + } + g_object_unref ($9); + + GList *l; + + GList* decls = vala_local_variable_declaration_get_variable_declarators ($3); + for (l = decls; l != NULL; l = l->next) { + ValaVariableDeclarator *decl = l->data; + ValaExpression *init = vala_variable_declarator_get_initializer (decl); + + if (init != NULL) { + ValaSourceReference *decl_src = vala_code_node_get_source_reference (VALA_CODE_NODE (decl)); + ValaMemberAccess *lhs = vala_member_access_new (NULL, vala_variable_declarator_get_name (decl), decl_src); + ValaAssignment *assign = vala_assignment_new (lhs, VALA_ASSIGNMENT_OPERATOR_SIMPLE, init, decl_src); + g_object_unref (lhs); + vala_for_statement_add_initializer (for_statement, VALA_EXPRESSION (assign)); + g_object_unref (assign); + + vala_variable_declarator_set_initializer (decl, NULL); + } + } + g_list_free (decls); + + ValaDeclarationStatement *decl_statement = vala_declaration_statement_new ($3, src); + g_object_unref ($3); + g_object_unref (src); + vala_block_add_statement (block, VALA_STATEMENT (decl_statement)); + g_object_unref (decl_statement); + + if ($7 != NULL) { + for (l = $7; l != NULL; l = l->next) { + vala_for_statement_add_iterator (for_statement, l->data); + g_object_unref (l->data); + } + g_list_free ($7); + } + + vala_block_add_statement (block, VALA_STATEMENT (for_statement)); + + $$ = VALA_STATEMENT (block); + } ; opt_statement_expression_list @@ -1292,10 +1342,11 @@ foreach_statement { ValaSourceReference *src = src(@3); $$ = VALA_STATEMENT (vala_foreach_statement_new ($3, $4, $6, $8, src)); - g_object_unref (src); g_object_unref ($3); + g_free ($4); g_object_unref ($6); g_object_unref ($8); + g_object_unref (src); } ; |