From c1b03f016335f035fd0bc8a62d3b2ab91b61753a Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 5 Mar 2014 17:06:24 +0100 Subject: [PATCH] dfa: variables shouldn't be marked unknown if they don't have known constant values --- .../dataFlow/DfaMemoryStateImpl.java | 28 ++++++++++++++----- .../DataFlowInspectionTest.java | 2 ++ 2 files changed, 23 insertions(+), 7 deletions(-) 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 c3f81ec0da3a..3442c4e7c75e 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 @@ -815,22 +815,36 @@ public class DfaMemoryStateImpl implements DfaMemoryState { @Override public void flushFields() { + Set vars = ContainerUtil.newLinkedHashSet(getChangedVariables()); for (EqClass aClass : myEqClasses) { if (aClass != null) { - for (DfaVariableValue value : aClass.getVariables()) { - if (value.isFlushableByCalls()) { - doFlush(value, true); - } - } + vars.addAll(aClass.getVariables()); } } - for (DfaVariableValue value : new ArrayList(getChangedVariables())) { + for (DfaVariableValue value : vars) { if (value.isFlushableByCalls()) { - doFlush(value, true); + doFlush(value, shouldMarkUnknown(value)); } } } + private boolean shouldMarkUnknown(DfaVariableValue value) { + int eqClassIndex = getEqClassIndex(value); + if (eqClassIndex < 0) return false; + + EqClass eqClass = myEqClasses.get(eqClassIndex); + if (eqClass == null) return false; + if (eqClass.findConstant(true) != null) return true; + + for (UnorderedPair pair : getDistinctClassPairs()) { + if (pair.first == eqClass && pair.second.findConstant(true) != null || + pair.second == eqClass && pair.first.findConstant(true) != null) { + return true; + } + } + return false; + } + Set getChangedVariables() { return myVariableStates.keySet(); } diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java index e4cf4c7480a5..fd3342de4a09 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java @@ -305,6 +305,8 @@ public class DataFlowInspectionTest extends LightCodeInsightFixtureTestCase { public void testNotEqualsTypo() { doTest(); } public void testAndEquals() { doTest(); } + public void testUnusedCallDoesNotMakeUnknown() { doTest(); } + public void testParametersAreNonnullByDefault() { myFixture.addClass("package javax.annotation; public @interface ParametersAreNonnullByDefault {}"); myFixture.addClass("package javax.annotation; public @interface ParametersAreNullableByDefault {}");