Index: pkg/compiler/lib/src/kernel/kernel_visitor.dart |
diff --git a/pkg/compiler/lib/src/kernel/kernel_visitor.dart b/pkg/compiler/lib/src/kernel/kernel_visitor.dart |
index d4d621637b0bb8f96f5c272fc51b2d54c4228b9b..a8c789a1e52ce338e0c5f64e6d0018a6d504b75a 100644 |
--- a/pkg/compiler/lib/src/kernel/kernel_visitor.dart |
+++ b/pkg/compiler/lib/src/kernel/kernel_visitor.dart |
@@ -1230,6 +1230,7 @@ class KernelVisitor extends Object |
@override |
ir.Expression visitCompoundIndexSet(SendSet node, Node receiver, Node index, |
AssignmentOperator operator, Node rhs, _) { |
+ // TODO(sra): Find binary operator. |
return buildIndexAccessor(receiver, index).buildCompoundAssignment( |
kernel.irName(operator.selectorName, currentElement), |
visitForValue(rhs), |
@@ -1289,7 +1290,8 @@ class KernelVisitor extends Object |
receiver == null ? new ir.ThisExpression() : visitForValue(receiver); |
ir.Expression compound = buildCompound( |
PropertyAccessor.make(receiverNode, nameToIrName(name), null, null), |
- rhs); |
+ rhs, |
+ node); |
if (compound is ir.VariableSet) { |
associateNode(compound.value, node); |
} else { |
@@ -1720,19 +1722,32 @@ class KernelVisitor extends Object |
return buildLocalGet(element); |
} |
- ir.Expression buildCompound(Accessor accessor, CompoundRhs rhs) { |
+ ir.Expression buildCompound( |
+ Accessor accessor, CompoundRhs rhs, SendSet node) { |
ir.Name name = kernel.irName(rhs.operator.selectorName, currentElement); |
+ ir.Expression result; |
switch (rhs.kind) { |
case CompoundKind.POSTFIX: |
- return accessor.buildPostfixIncrement(name, voidContext: isVoidContext); |
+ result = |
+ accessor.buildPostfixIncrement(name, voidContext: isVoidContext); |
+ break; |
case CompoundKind.PREFIX: |
- return accessor.buildPrefixIncrement(name, voidContext: isVoidContext); |
+ result = |
+ accessor.buildPrefixIncrement(name, voidContext: isVoidContext); |
+ break; |
case CompoundKind.ASSIGNMENT: |
- return accessor.buildCompoundAssignment(name, visitForValue(rhs.rhs), |
+ result = accessor.buildCompoundAssignment(name, visitForValue(rhs.rhs), |
voidContext: isVoidContext); |
+ break; |
+ } |
+ assert(accessor.builtBinary != null); |
+ kernel.nodeToAstOperator[accessor.builtBinary] = node; |
+ if (accessor.builtGetter != null) { |
+ kernel.nodeToAst[accessor.builtGetter] = node; |
} |
+ return result; |
} |
@override |
@@ -1740,7 +1755,7 @@ class KernelVisitor extends Object |
SendSet node, LocalElement local, CompoundRhs rhs, _, |
{bool isSetterValid}) { |
ir.Expression compound = |
- buildCompound(new VariableAccessor(getLocal(local)), rhs); |
+ buildCompound(new VariableAccessor(getLocal(local)), rhs, node); |
if (compound is ir.VariableSet) { |
associateNode(compound.value, node); |
} else { |
@@ -2236,6 +2251,7 @@ class KernelVisitor extends Object |
AssignmentOperator operator, |
Node rhs, |
_) { |
+ // TODO(sra): Find binary operator. |
return buildSuperIndexAccessor(index, getter, setter) |
.buildCompoundAssignment( |
kernel.irName(operator.selectorName, currentElement), |
@@ -2287,7 +2303,7 @@ class KernelVisitor extends Object |
if (setterKind == CompoundSetter.INVALID) { |
setter = null; |
} |
- return buildCompound(buildSuperPropertyAccessor(getter, setter), rhs); |
+ return buildCompound(buildSuperPropertyAccessor(getter, setter), rhs, node); |
} |
@override |
@@ -2302,13 +2318,14 @@ class KernelVisitor extends Object |
if (setterKind == CompoundSetter.INVALID) { |
setter = null; |
} |
- return buildCompound(buildStaticAccessor(getter, setter), rhs); |
+ return buildCompound(buildStaticAccessor(getter, setter), rhs, node); |
} |
@override |
ir.Expression handleTypeLiteralConstantCompounds( |
SendSet node, ConstantExpression constant, CompoundRhs rhs, _) { |
- return buildCompound(new ReadOnlyAccessor(buildTypeLiteral(constant)), rhs); |
+ return buildCompound( |
+ new ReadOnlyAccessor(buildTypeLiteral(constant)), rhs, node); |
} |
ir.TypeLiteral buildTypeVariable(TypeVariableElement element) { |
@@ -2318,7 +2335,8 @@ class KernelVisitor extends Object |
@override |
ir.Expression handleTypeVariableTypeLiteralCompounds( |
SendSet node, TypeVariableElement element, CompoundRhs rhs, _) { |
- return buildCompound(new ReadOnlyAccessor(buildTypeVariable(element)), rhs); |
+ return buildCompound( |
+ new ReadOnlyAccessor(buildTypeVariable(element)), rhs, node); |
} |
@override |