diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StateMerger.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StateMerger.java index 3fbb6084c851..a9286654bbc1 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StateMerger.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StateMerger.java @@ -205,8 +205,10 @@ class StateMerger { @Override public boolean value(DfaMemoryStateImpl another) { return seemCompatible(state, another, var) && + another.getVariableState(var).myInstanceofValues.contains(notInstanceof) && varStateWithoutType.equals(getVarStateWithoutType(another, var, notInstanceof)) && - areEquivalentModuloVar(another, state, var); + areEquivalentModuloVar(another, state, var) && + !(state.isNull(var) && another.isNotNull(var)); } }); if (complementaryStates.isEmpty()) { diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/DontForgetEqInfoWhenMergingByType.java b/java/java-tests/testData/inspection/dataFlow/fixture/DontForgetEqInfoWhenMergingByType.java new file mode 100644 index 000000000000..572b2fc2c4fa --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/DontForgetEqInfoWhenMergingByType.java @@ -0,0 +1,21 @@ +class Some { + + private boolean canBePatternVariable(PsiElement element) { + if (element instanceof LeafElement) { + return true; + } + + while (!(element instanceof LeafElement) && element != null) { + element = getNextObject(element); + } + return element != null; + } + + PsiElement getNextObject(PsiElement element) { return element; } + + class LeafElement {} + interface PsiElement {} + +} + + diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java index e99c0eb5704e..c5158a430b7b 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java @@ -309,6 +309,7 @@ public class DataFlowInspectionTest extends LightCodeInsightFixtureTestCase { public void testVariablesDiverge() { doTest(); } public void testMergeByNullability() { doTest(); } public void testDontForgetInstanceofInfoWhenMerging() { doTest(); } + public void testDontForgetEqInfoWhenMergingByType() { doTest(); } public void testDontMakeNullableAfterInstanceof() { doTest(); } public void _testNullCheckBeforeInstanceof() { doTest(); } // http://youtrack.jetbrains.com/issue/IDEA-113220