[vala] dova: Support tuples
- From: Jürg Billeter <juergbi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala] dova: Support tuples
- Date: Sat, 5 Jun 2010 08:44:20 +0000 (UTC)
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]