summaryrefslogtreecommitdiff
path: root/vala/valaelementaccess.vala
diff options
context:
space:
mode:
authorJürg Billeter <j@bitron.ch>2010-03-13 20:43:56 +0100
committerJürg Billeter <j@bitron.ch>2010-03-13 20:45:47 +0100
commit84b6b23be9a93fc1d17b2b8a9f5134e0f3054ccc (patch)
tree47820d03ca3a2525155e789e3287d9153f0064e3 /vala/valaelementaccess.vala
parent6579eb2ee25f2d8857107bccd43595e7636aca1f (diff)
downloadvala-84b6b23be9a93fc1d17b2b8a9f5134e0f3054ccc.tar.gz
dova: Accept list, set, and map literals and tuples
Diffstat (limited to 'vala/valaelementaccess.vala')
-rw-r--r--vala/valaelementaccess.vala34
1 files changed, 34 insertions, 0 deletions
diff --git a/vala/valaelementaccess.vala b/vala/valaelementaccess.vala
index 9cfe3c8d9..c96ee7a03 100644
--- a/vala/valaelementaccess.vala
+++ b/vala/valaelementaccess.vala
@@ -152,6 +152,40 @@ public class Vala.ElementAccess : Expression {
}
value_type = analyzer.unichar_type;
+ } else if (analyzer.context.profile == Profile.DOVA && container_type == analyzer.tuple_type.data_type) {
+ if (get_indices ().size != 1) {
+ error = true;
+ Report.error (source_reference, "Element access with more than one dimension is not supported for tuples");
+ return false;
+ }
+ var index = get_indices ().get (0) as IntegerLiteral;
+ if (index == null) {
+ error = true;
+ Report.error (source_reference, "Element access with non-literal index is not supported for tuples");
+ return false;
+ }
+ int i = index.value.to_int ();
+ if (container.value_type.get_type_arguments ().size == 0) {
+ error = true;
+ Report.error (source_reference, "Element access is not supported for untyped tuples");
+ return false;
+ }
+ if (i < 0 || i >= container.value_type.get_type_arguments ().size) {
+ error = true;
+ Report.error (source_reference, "Index out of range");
+ return false;
+ }
+
+ value_type = container.value_type.get_type_arguments ().get (i);
+
+ // replace element access by call to generic get method
+ var ma = new MemberAccess (container, "get");
+ ma.add_type_argument (value_type);
+ var get_call = new MethodCall (ma);
+ get_call.add_argument (index);
+ get_call.target_type = this.target_type;
+ parent_node.replace_expression (this, get_call);
+ return get_call.check (analyzer);
} else if (container is MemberAccess && container.symbol_reference is Signal) {
index_int_type_check = false;