From ed08eabfbe13f173f01ad499d978c56855025e28 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 24 Sep 2013 10:40:00 +0200 Subject: [PATCH] immutable EqClass --- .../dataFlow/DfaMemoryStateImpl.java | 11 ++++------- .../dataFlow/fixture/WhileNotComplex.java | 14 ++++++++++++++ .../codeInspection/DataFlowInspectionTest.java | 1 + 3 files changed, 19 insertions(+), 7 deletions(-) create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/WhileNotComplex.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java index 9e6f4cd9ec20..e8c3fb6dab4e 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java @@ -72,12 +72,7 @@ public class DfaMemoryStateImpl implements DfaMemoryState { myUnknownVariables = new THashSet(toCopy.myUnknownVariables); myOffsetStack = new TIntStack(toCopy.myOffsetStack); - myEqClasses = ContainerUtil.newArrayListWithCapacity(toCopy.myEqClasses.size()); - for (int i = 0; i < toCopy.myEqClasses.size(); i++) { - EqClass aClass = toCopy.myEqClasses.get(i); - myEqClasses.add(aClass != null ? new EqClass(aClass) : null); - } - + myEqClasses = ContainerUtil.newArrayList(toCopy.myEqClasses); myVariableStates = new THashMap(toCopy.myVariableStates); myCachedDistinctClassPairs = toCopy.myCachedDistinctClassPairs; @@ -401,6 +396,7 @@ public class DfaMemoryStateImpl implements DfaMemoryState { } } + myEqClasses.set(c1Index, c1 = new EqClass(c1)); for (int i = 0; i < c2.size(); i++) { int c = c2.get(i); c1.add(c); @@ -832,7 +828,7 @@ public class DfaMemoryStateImpl implements DfaMemoryState { int size = myEqClasses.size(); int interruptCount = 0; for (int varClassIndex = 0; varClassIndex < size; varClassIndex++) { - final EqClass varClass = myEqClasses.get(varClassIndex); + EqClass varClass = myEqClasses.get(varClassIndex); if (varClass == null) continue; for (int i = 0; i < varClass.size(); i++) { @@ -842,6 +838,7 @@ public class DfaMemoryStateImpl implements DfaMemoryState { int cl = varClass.get(i); DfaValue value = myFactory.getValue(cl); if (mine(idPlain, value) || idNegated >= 0 && mine(idNegated, value)) { + myEqClasses.set(varClassIndex, varClass = new EqClass(varClass)); varClass.remove(i); break; } diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/WhileNotComplex.java b/java/java-tests/testData/inspection/dataFlow/fixture/WhileNotComplex.java new file mode 100644 index 000000000000..65d32c385ccf --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/WhileNotComplex.java @@ -0,0 +1,14 @@ +import java.io.File; + +class Some { + private File findRepository(File file) { + while (file != null) { + file = file.getParentFile(); + } + + return new File("foo"); + } + +} + + diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java index c353b5a71a4a..cc9dee3d26aa 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java @@ -301,6 +301,7 @@ public class DataFlowInspectionTest extends LightCodeInsightFixtureTestCase { public void testManySequentialIfsNotComplex() { doTest(); } public void testLongDisjunctionsNotComplex() { doTest(); } + public void testWhileNotComplex() { doTest(); } public void _testNullCheckBeforeInstanceof() { doTest(); } }