diff options
author | Simon Werbeck <simon.werbeck@gmail.com> | 2012-07-17 18:30:51 +0200 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2022-11-14 15:37:21 +0100 |
commit | fa09ca11b9467614bdca514acbbbe3baddfd7dfa (patch) | |
tree | 48b5f82639253f1dd9f1f77c3702505e56c694a2 /vala | |
parent | 4a0d468bba05a431357b6522203db07e5565a968 (diff) | |
download | vala-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.vala | 30 |
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); |