]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
dova: Support tuples
authorJürg Billeter <j@bitron.ch>
Sat, 5 Jun 2010 07:50:54 +0000 (09:50 +0200)
committerJürg Billeter <j@bitron.ch>
Sat, 5 Jun 2010 08:12:10 +0000 (10:12 +0200)
vala/valaassignment.vala
vala/valaobjecttype.vala

index 212685c988eed9f68dff3177ac42ee82e326960f..77725663a0651104e56e87c65063d547687c5963 100644 (file)
@@ -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)) {
index bffc280238555355e7344e29797c4e0ef79a196d..53ecb61d838de1296d49745c9d5738b0717ed9cd 100644 (file)
@@ -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");