From 5f6c927e1a68f9495ee147653493b835450aa134 Mon Sep 17 00:00:00 2001 From: peter Date: Sun, 28 Oct 2012 21:01:04 +0100 Subject: [PATCH] highlight not-null == null as always false (IDEA-88777) --- .../dataFlow/DfaMemoryStateImpl.java | 17 +++++++++++++---- .../dataFlow/fixture/EqualsNotNull.java | 5 ++++- 2 files changed, 17 insertions(+), 5 deletions(-) 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 d39fe8ee47a5..7ba70d51f555 100644 --- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java +++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java @@ -612,10 +612,8 @@ public class DfaMemoryStateImpl implements DfaMemoryState { return true; } - if (dfaRight == myFactory.getConstFactory().getNull() && dfaLeft instanceof DfaVariableValue) { - final DfaVariableState varState = getVariableState((DfaVariableValue)dfaLeft); - if (varState.isNotNull()) return isNegated; - varState.setNullable(!isNegated); + if (isNull(dfaRight) && compareVariableWithNull(dfaLeft) || isNull(dfaLeft) && compareVariableWithNull(dfaRight)) { + return isNegated; } if (dfaLeft instanceof DfaUnknownValue || dfaRight instanceof DfaUnknownValue) return true; @@ -623,6 +621,17 @@ public class DfaMemoryStateImpl implements DfaMemoryState { return applyEquivalenceRelation(dfaRelation, dfaLeft, dfaRight); } + private boolean compareVariableWithNull(DfaValue val) { + if (val instanceof DfaVariableValue) { + DfaVariableValue dfaVar = (DfaVariableValue)val; + if (isNotNull(dfaVar)) { + return true; + } + getVariableState(dfaVar).setNullable(true); + } + return false; + } + private boolean applyEquivalenceRelation(DfaRelationValue dfaRelation, DfaValue dfaLeft, DfaValue dfaRight) { boolean isNegated = dfaRelation.isNonEquality(); if (!isNegated && !dfaRelation.isEquality()) { diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/EqualsNotNull.java b/java/java-tests/testData/inspection/dataFlow/fixture/EqualsNotNull.java index 4b6277ad93aa..0459c905a130 100644 --- a/java/java-tests/testData/inspection/dataFlow/fixture/EqualsNotNull.java +++ b/java/java-tests/testData/inspection/dataFlow/fixture/EqualsNotNull.java @@ -62,7 +62,10 @@ public class Main { if (val != null) { return val; } - if (defVal == val) { + if (defVal == val) { + return val; + } + if (val == defVal) { return val; } if (defVal.equals(val)) {