From 316e41c33b49e1bfbc986eb04882ac2708ed7be6 Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 7 Sep 2012 17:39:30 +0200 Subject: [PATCH] IDEA-90613 Invalid @Nullable processing --- .../dataFlow/StandardInstructionVisitor.java | 19 +++++++++++------ .../NotEqualsDoesntImplyNotNullity.java | 21 +++++++++++++++++++ .../DataFlowInspectionFixtureTest.java | 1 + 3 files changed, 35 insertions(+), 6 deletions(-) create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/NotEqualsDoesntImplyNotNullity.java diff --git a/java/java-impl/src/com/intellij/codeInspection/dataFlow/StandardInstructionVisitor.java b/java/java-impl/src/com/intellij/codeInspection/dataFlow/StandardInstructionVisitor.java index 9c11f3900998..9dd3b2b489c7 100644 --- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/StandardInstructionVisitor.java +++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/StandardInstructionVisitor.java @@ -274,12 +274,8 @@ public class StandardInstructionVisitor extends InstructionVisitor { final DfaMemoryState trueCopy = memState.createCopy(); if (trueCopy.applyCondition(dfaRelation)) { - if (dfaLeft instanceof DfaVariableValue && dfaRight instanceof DfaVariableValue) { - if (trueCopy.isNotNull((DfaVariableValue)dfaLeft)) { - trueCopy.applyCondition(relationFactory.create(dfaRight, factory.getConstFactory().getNull(), JavaTokenType.EQEQ, true)); - } else if (trueCopy.isNotNull((DfaVariableValue)dfaRight)) { - trueCopy.applyCondition(relationFactory.create(dfaLeft, factory.getConstFactory().getNull(), JavaTokenType.EQEQ, true)); - } + if (!dfaRelation.isNegated()) { + handleEqualVariables(dfaRight, dfaLeft, factory, trueCopy); } trueCopy.push(factory.getConstFactory().getTrue()); instruction.setTrueReachable(); @@ -335,6 +331,17 @@ public class StandardInstructionVisitor extends InstructionVisitor { return nextInstruction(instruction, runner, memState); } + private static void handleEqualVariables(DfaValue var1, DfaValue var2, DfaValueFactory factory, DfaMemoryState state) { + if (!(var2 instanceof DfaVariableValue) || !(var1 instanceof DfaVariableValue)) { + return; + } + + DfaValue nowNotNull = state.isNotNull((DfaVariableValue)var2) ? var1 : state.isNotNull((DfaVariableValue)var1) ? var2 : null; + if (nowNotNull != null) { + state.applyCondition(factory.getRelationFactory().create(nowNotNull, factory.getConstFactory().getNull(), JavaTokenType.EQEQ, true)); + } + } + public boolean isInstanceofRedundant(InstanceofInstruction instruction) { return !myUsefulInstanceofs.contains(instruction) && !instruction.isConditionConst() && myReachable.contains(instruction); } diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/NotEqualsDoesntImplyNotNullity.java b/java/java-tests/testData/inspection/dataFlow/fixture/NotEqualsDoesntImplyNotNullity.java new file mode 100644 index 000000000000..e74585c3a198 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/NotEqualsDoesntImplyNotNullity.java @@ -0,0 +1,21 @@ +import org.jetbrains.annotations.Nullable; +class TestIDEAWarn { + void test(java.util.Map values) { + boolean condition = false; + Object target = getTarget(); + for (Object o : values.values()) { + if (o != null && o != target) { + condition = true; + } + } + if (!condition || target == null) { + System.out.println(target); + } + } + + @Nullable + public Object getTarget() { + return null; + } + +} diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java index 4412631e42eb..67b9ed456daa 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java @@ -72,5 +72,6 @@ public class DataFlowInspectionFixtureTest extends JavaCodeInsightFixtureTestCas public void testEqualsNotNull() throws Throwable { doTest(); } public void testVisitFinallyOnce() throws Throwable { doTest(); } + public void testNotEqualsDoesntImplyNotNullity() throws Throwable { doTest(); } }