summaryrefslogtreecommitdiff
path: root/vala
diff options
context:
space:
mode:
authorSimon Werbeck <simon.werbeck@gmail.com>2012-07-17 18:30:51 +0200
committerRico Tzschichholz <ricotz@ubuntu.com>2022-11-14 15:37:21 +0100
commitfa09ca11b9467614bdca514acbbbe3baddfd7dfa (patch)
tree48b5f82639253f1dd9f1f77c3702505e56c694a2 /vala
parent4a0d468bba05a431357b6522203db07e5565a968 (diff)
downloadvala-fa09ca11b9467614bdca514acbbbe3baddfd7dfa.tar.gz
vala: Fix assignment operators for element access
This transforms an assignment to element access other than `=' to a binary expression i.e. `a[b] += 1' will become `a.set(a.get(b) + 1)' Fixes https://gitlab.gnome.org/GNOME/vala/issues/135
Diffstat (limited to 'vala')
-rw-r--r--vala/valaassignment.vala30
1 files changed, 30 insertions, 0 deletions
diff --git a/vala/valaassignment.vala b/vala/valaassignment.vala
index 150c34723..929fa7b66 100644
--- a/vala/valaassignment.vala
+++ b/vala/valaassignment.vala
@@ -204,6 +204,36 @@ public class Vala.Assignment : Expression {
foreach (Expression e in ea.get_indices ()) {
set_call.add_argument (e);
}
+
+ if (operator != AssignmentOperator.SIMPLE && ea.container.value_type.get_member ("get") is Method) {
+ // transform into binary expression inside set call
+ var get_call = new MethodCall (new MemberAccess (ea.container, "get", source_reference), source_reference);
+ foreach (Expression e in ea.get_indices ()) {
+ get_call.add_argument (e);
+ }
+
+ BinaryOperator bop;
+
+ switch (operator) {
+ case AssignmentOperator.BITWISE_OR: bop = BinaryOperator.BITWISE_OR; break;
+ case AssignmentOperator.BITWISE_AND: bop = BinaryOperator.BITWISE_AND; break;
+ case AssignmentOperator.BITWISE_XOR: bop = BinaryOperator.BITWISE_XOR; break;
+ case AssignmentOperator.ADD: bop = BinaryOperator.PLUS; break;
+ case AssignmentOperator.SUB: bop = BinaryOperator.MINUS; break;
+ case AssignmentOperator.MUL: bop = BinaryOperator.MUL; break;
+ case AssignmentOperator.DIV: bop = BinaryOperator.DIV; break;
+ case AssignmentOperator.PERCENT: bop = BinaryOperator.MOD; break;
+ case AssignmentOperator.SHIFT_LEFT: bop = BinaryOperator.SHIFT_LEFT; break;
+ case AssignmentOperator.SHIFT_RIGHT: bop = BinaryOperator.SHIFT_RIGHT; break;
+ default:
+ error = true;
+ Report.error (source_reference, "internal error: unsupported assignment operator");
+ return false;
+ }
+
+ right = new BinaryExpression (bop, get_call, right, source_reference);
+ }
+
set_call.add_argument (right);
parent_node.replace_expression (this, set_call);
return set_call.check (context);