From 14f7907d29f4e820c92b8ce8a5d3cff6322632ce Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Fri, 10 Jul 2020 19:46:02 +0700 Subject: [PATCH] Better fix for IDEA-245423 Incorrect "Condition X covered by subsequent condition Y" warning Review ID: IDEA-CR-64866 GitOrigin-RevId: 7d2e5c40ce9d010975583f6fecc14ac6aff2a2e1 --- .../codeInspection/dataFlow/value/DfaCondition.java | 13 +++++++------ .../dataFlow/value/DfaValueFactory.java | 5 +---- .../ConditionCoveredByFurtherCondition.java | 11 +++++++++++ 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaCondition.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaCondition.java index c8e8b82d318d..1f4bc8c73766 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaCondition.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaCondition.java @@ -2,10 +2,7 @@ package com.intellij.codeInspection.dataFlow.value; import com.intellij.codeInspection.dataFlow.DfaUtil; -import com.intellij.codeInspection.dataFlow.types.DfConstantType; -import com.intellij.codeInspection.dataFlow.types.DfIntegralType; -import com.intellij.codeInspection.dataFlow.types.DfType; -import com.intellij.codeInspection.dataFlow.types.DfTypes; +import com.intellij.codeInspection.dataFlow.types.*; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -106,12 +103,12 @@ public abstract class DfaCondition { !DfaUtil.isNaN(((DfConstantType)leftType).getValue()) ^ relationType == RelationType.EQ); } - if (!rightType.isSuperType(leftType)) { + if (!couldBeEqualToConstant(rightType, leftType)) { return fromBoolean(relationType == RelationType.NE); } } else if (rightType instanceof DfConstantType) { - if (!leftType.isSuperType(rightType)) { + if (!couldBeEqualToConstant(leftType, rightType)) { return fromBoolean(relationType == RelationType.NE); } } @@ -141,5 +138,9 @@ public abstract class DfaCondition { return null; } + + private static boolean couldBeEqualToConstant(DfType type, DfType constantType) { + return (type instanceof DfReferenceType ? ((DfReferenceType)type).dropTypeConstraint() : type).isSuperType(constantType); + } } } diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaValueFactory.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaValueFactory.java index 083d18897036..bd7146813455 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaValueFactory.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaValueFactory.java @@ -179,10 +179,7 @@ public class DfaValueFactory { return getNull(); } if (variable instanceof PsiField && variable.hasModifierProperty(PsiModifier.STATIC) && ExpressionUtils.isNewObject(initializer)) { - PsiType initializerType = initializer.getType(); - if (initializerType != null) { - return getConstant(variable, initializerType); - } + return getConstant(variable, type); } return null; } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/condition_covered_by_further_condition/ConditionCoveredByFurtherCondition.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/condition_covered_by_further_condition/ConditionCoveredByFurtherCondition.java index fee8a6070a84..e6c32d62ca4d 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/condition_covered_by_further_condition/ConditionCoveredByFurtherCondition.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/condition_covered_by_further_condition/ConditionCoveredByFurtherCondition.java @@ -9,6 +9,17 @@ public class ConditionCoveredByFurtherCondition { public void m() { if (this == C1 || this == C2) { /* ...*/ } } + + public static final Object C3 = getC(); + public static final Object C4 = getC(); + + public void m2() { + if (this == C3 || this == C4) {} + } + + private static Object getC() { + return new C(); + } } public void testInstanceOf(Object arg) {