From 7b4b6828366d65dbd141f1cf7734c23e697d110c Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Fri, 16 Mar 2012 21:02:49 +0400 Subject: [PATCH] NotNullValues mustn't end up in equivalence classes table. --- .../dataFlow/DfaMemoryStateImpl.java | 14 +++++++++++++ .../dataFlow/fixture/AnnReport.java | 21 +++++++++++++++++++ .../DataFlowInspectionFixtureTest.java | 1 + 3 files changed, 36 insertions(+) create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/AnnReport.java diff --git a/java/java-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java b/java/java-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java index 7763c26eaf1c..b85c5fc4a1b0 100644 --- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java +++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java @@ -568,6 +568,20 @@ public class DfaMemoryStateImpl implements DfaMemoryState { return true; } + if (dfaRight instanceof DfaNotNullValue) { + if (dfaLeft instanceof DfaVariableValue) { + DfaVariableState varState = getVariableState((DfaVariableValue)dfaLeft); + DfaVariableValue dfaVar = (DfaVariableValue)dfaLeft; + DfaTypeValue type = myFactory.getTypeFactory().create(((DfaNotNullValue)dfaRight).getType()); + if (isNegated) { + return varState.addNotInstanceofValue(type) || applyCondition(compareToNull(dfaVar, false)); + } + return applyCondition(compareToNull(dfaVar, false)) && varState.setInstanceofValue(type); + + } + return true; + } + if (dfaRight == myFactory.getConstFactory().getNull() && dfaLeft instanceof DfaVariableValue) { final DfaVariableState varState = getVariableState((DfaVariableValue)dfaLeft); if (varState.isNotNull()) return isNegated; diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/AnnReport.java b/java/java-tests/testData/inspection/dataFlow/fixture/AnnReport.java new file mode 100644 index 000000000000..811b41cfdab1 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/AnnReport.java @@ -0,0 +1,21 @@ +import org.jetbrains.annotations.NotNull; + +public class ASD { + static void foo(Object any) { + boolean a = false; + boolean b = false; + while (true) { + boolean trg = bar() == any; + + a = a || trg; + b = b || !trg; + + if (b && a) break; + } + } + + @NotNull + static Object bar() { + return new Object(); + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java index da21b7b2739e..160e94d71460 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java @@ -50,6 +50,7 @@ public class DataFlowInspectionFixtureTest extends JavaCodeInsightFixtureTestCas public void testFieldInAnonymous() throws Throwable { doTest(); } public void testNullableField() throws Throwable { doTest(); } public void testCanBeNullDoesntImplyIsNull() throws Throwable { doTest(); } + public void testAnnReport() throws Throwable { doTest(); } public void testBigMethodNotComplex() throws Throwable { doTest(); } }