From 5c0764f1ce2ca3db8832a733a21614e16c5d4a57 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 5 Apr 2011 11:54:28 +0400 Subject: [PATCH] CF/DF for '+=' --- .../jet/lang/cfg/JetControlFlowProcessor.java | 14 ++++++++++++++ .../lang/cfg/pseudocode/WriteValueInstruction.java | 4 ++-- .../jetbrains/jet/lang/types/JetTypeInferrer.java | 2 +- idea/testData/cfg/Assignments.instructions | 14 +++++++++----- idea/testData/cfg/Assignments.jet | 1 + 5 files changed, 27 insertions(+), 8 deletions(-) diff --git a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java index af9f99f1266..666f2bebf22 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -6,6 +6,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.JetSemanticServices; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.types.BindingTrace; +import org.jetbrains.jet.lang.types.JetTypeInferrer; import org.jetbrains.jet.lexer.JetTokens; import java.util.*; @@ -179,6 +180,19 @@ public class JetControlFlowProcessor { builder.unsupported(expression); } } + else if (JetTypeInferrer.assignmentOperationNames.containsKey(operationType)) { + JetExpression left = expression.getLeft(); + value(left, false); + if (right != null) { + value(right, false); + } + if (left instanceof JetSimpleNameExpression) { + builder.writeNode(expression, left); + } + else { + builder.unsupported(expression); + } + } else { value(expression.getLeft(), false); if (right != null) { diff --git a/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/WriteValueInstruction.java b/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/WriteValueInstruction.java index 83b50c32a30..4ad4e5ef7b6 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/WriteValueInstruction.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/WriteValueInstruction.java @@ -25,8 +25,8 @@ public class WriteValueInstruction extends InstructionWithNext { public String toString() { if (lValue instanceof JetNamedDeclaration) { JetNamedDeclaration value = (JetNamedDeclaration) lValue; - return value.getName() + " <- "; + return "w(" + value.getName() + ")"; } - return lValue.getText() + " <-"; + return "w(" + lValue.getText() + ")"; } } diff --git a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java index f5a068f5d5c..5ae05d07bd9 100644 --- a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java +++ b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java @@ -42,7 +42,7 @@ public class JetTypeInferrer { private static final Set equalsOperations = new HashSet(Arrays.asList(JetTokens.EQEQ, JetTokens.EXCLEQ)); private static final Set inOperations = new HashSet(Arrays.asList(JetTokens.IN_KEYWORD, JetTokens.NOT_IN)); - private static final Map assignmentOperationNames = new HashMap(); + public static final Map assignmentOperationNames = new HashMap(); static { assignmentOperationNames.put(JetTokens.MULTEQ, "timesAssign"); assignmentOperationNames.put(JetTokens.DIVEQ, "divAssign"); diff --git a/idea/testData/cfg/Assignments.instructions b/idea/testData/cfg/Assignments.instructions index ba834d23a00..b4421226be1 100644 --- a/idea/testData/cfg/Assignments.instructions +++ b/idea/testData/cfg/Assignments.instructions @@ -2,6 +2,7 @@ fun assignments() : Unit { var x = 1 x = 2 + x += 2 x = if (true) 1 else 2 @@ -12,9 +13,12 @@ fun assignments() : Unit { l0: r(1) - x <- + w(x) r(2) - x <- + w(x) + r(x) + r(2) + w(x) r(true) jf(l2) r(1) @@ -22,17 +26,17 @@ l0: l2: r(2) l3: - x <- + w(x) r(true) jf(l4) r(false) l4: - y <- + w(y) r(false) jf(l5) r(true) l5: - z <- + w(z) l1: ===================== diff --git a/idea/testData/cfg/Assignments.jet b/idea/testData/cfg/Assignments.jet index 0dfeed5df10..2bf1bd1286e 100644 --- a/idea/testData/cfg/Assignments.jet +++ b/idea/testData/cfg/Assignments.jet @@ -1,6 +1,7 @@ fun assignments() : Unit { var x = 1 x = 2 + x += 2 x = if (true) 1 else 2