diff --git a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java index c06344a5f17..fffc992da55 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -186,26 +186,24 @@ public class JetControlFlowProcessor { } else if (left instanceof JetArrayAccessExpression) { JetArrayAccessExpression arrayAccessExpression = (JetArrayAccessExpression) left; - for (JetExpression index : arrayAccessExpression.getIndexExpressions()) { - value(index, false, false); - } - value(arrayAccessExpression.getArrayExpression(), false, false); - value(expression.getOperationReference(), false, false); - builder.write(expression, left); // TODO : ??? + visitAssignToArrayAccess(expression, arrayAccessExpression); } else { builder.unsupported(expression); // TODO } } else if (JetTypeInferrer.assignmentOperationNames.containsKey(operationType)) { - JetExpression left = expression.getLeft(); - value(left, false, false); + JetExpression left = JetPsiUtil.deparenthesize(expression.getLeft()); + if (left != null) { + value(left, false, false); + } if (right != null) { value(right, false, false); } - if (left instanceof JetSimpleNameExpression) { + if (left instanceof JetSimpleNameExpression || left instanceof JetArrayAccessExpression) { + value(expression.getOperationReference(), false, false); builder.write(expression, left); } - else { + else if (left != null) { builder.unsupported(expression); // TODO } } @@ -219,6 +217,15 @@ public class JetControlFlowProcessor { } } + private void visitAssignToArrayAccess(JetBinaryExpression expression, JetArrayAccessExpression arrayAccessExpression) { + for (JetExpression index : arrayAccessExpression.getIndexExpressions()) { + value(index, false, false); + } + value(arrayAccessExpression.getArrayExpression(), false, false); + value(expression.getOperationReference(), false, false); + builder.write(expression, arrayAccessExpression); // TODO : ??? + } + @Override public void visitUnaryExpression(JetUnaryExpression expression) { JetSimpleNameExpression operationSign = expression.getOperationSign(); diff --git a/idea/testData/cfg/ArrayAccess.instructions b/idea/testData/cfg/ArrayAccess.instructions index 1a2e454f773..02b6aaa8d4e 100644 --- a/idea/testData/cfg/ArrayAccess.instructions +++ b/idea/testData/cfg/ArrayAccess.instructions @@ -5,6 +5,8 @@ fun foo() { a[10] = 4 2 a[10] + 100 + a[10] += 1 } --------------------- l0: @@ -21,6 +23,13 @@ l0: r(10) r(a) r(a[10]) + r(100) + r(10) + r(a) + r(a[10]) + r(1) + r(+=) + w(a[10]) l1: error: diff --git a/idea/testData/cfg/ArrayAccess.jet b/idea/testData/cfg/ArrayAccess.jet index 5b65ec3f10c..07bacf3c9cd 100644 --- a/idea/testData/cfg/ArrayAccess.jet +++ b/idea/testData/cfg/ArrayAccess.jet @@ -4,4 +4,6 @@ fun foo() { a[10] = 4 2 a[10] + 100 + a[10] += 1 } diff --git a/idea/testData/cfg/Assignments.instructions b/idea/testData/cfg/Assignments.instructions index b487e0ca4d8..b3689759034 100644 --- a/idea/testData/cfg/Assignments.instructions +++ b/idea/testData/cfg/Assignments.instructions @@ -18,6 +18,7 @@ l0: w(x) r(x) r(2) + r(+=) w(x) r(true) jf(l2)