[vala] dova: Support tuples



commit 82c80df2fc0d523a040af052345354843dce9d2e
Author: Jürg Billeter <j bitron ch>
Date:   Sat Jun 5 09:50:54 2010 +0200

    dova: Support tuples

 vala/valaassignment.vala |   30 ++++++++++++++++++++++++++++++
 vala/valaobjecttype.vala |    5 +++++
 2 files changed, 35 insertions(+), 0 deletions(-)
---
diff --git a/vala/valaassignment.vala b/vala/valaassignment.vala
index 212685c..7772566 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 bffc280..53ecb61 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");



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]