From: Jürg Billeter Date: Sat, 5 Jun 2010 07:50:54 +0000 (+0200) Subject: dova: Support tuples X-Git-Tag: 0.9.1~18 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=82c80df2fc0d523a040af052345354843dce9d2e;p=thirdparty%2Fvala.git dova: Support tuples --- diff --git a/vala/valaassignment.vala b/vala/valaassignment.vala index 212685c98..77725663a 100644 --- a/vala/valaassignment.vala +++ b/vala/valaassignment.vala @@ -104,6 +104,36 @@ public class Vala.Assignment : Expression { checked = true; + if (left is Tuple && operator == AssignmentOperator.SIMPLE && parent_node is ExpressionStatement) { + var tuple = (Tuple) left; + + var local = new LocalVariable (null, get_temp_name (), right, right.source_reference); + var decl = new DeclarationStatement (local, source_reference); + decl.check (analyzer); + insert_statement (analyzer.insert_block, decl); + + int i = 0; + ExpressionStatement stmt = null; + foreach (var expr in tuple.get_expressions ()) { + if (stmt != null) { + stmt.check (analyzer); + insert_statement (analyzer.insert_block, stmt); + } + + var temp_access = new MemberAccess.simple (local.name, right.source_reference); + var ea = new ElementAccess (temp_access, expr.source_reference); + ea.append_index (new IntegerLiteral (i.to_string (), expr.source_reference)); + var assign = new Assignment (expr, ea, operator, expr.source_reference); + stmt = new ExpressionStatement (assign, expr.source_reference); + + i++; + } + + analyzer.replaced_nodes.add (this); + parent_node.replace_expression (this, stmt.expression); + return stmt.expression.check (analyzer); + } + left.lvalue = true; if (!left.check (analyzer)) { diff --git a/vala/valaobjecttype.vala b/vala/valaobjecttype.vala index bffc28023..53ecb61d8 100644 --- a/vala/valaobjecttype.vala +++ b/vala/valaobjecttype.vala @@ -104,6 +104,11 @@ public class Vala.ObjectType : ReferenceType { return false; } + if (analyzer.context.profile == Profile.DOVA && type_symbol.get_full_name () == "Dova.Tuple") { + // tuples have variadic generics + return true; + } + int n_type_args = get_type_arguments ().size; if (n_type_args > 0 && n_type_args < type_symbol.get_type_parameters ().size) { Report.error (source_reference, "too few type arguments");