IDEA-175296 Uncaught 'condition is always false' with interface constant

This commit is contained in:
peter
2017-07-13 17:58:13 +02:00
parent 9e79d40766
commit dae7dcdcd5
3 changed files with 23 additions and 1 deletions
@@ -135,7 +135,7 @@ public class DfaExpressionFactory {
if (constValue != null) return constValue;
}
if (DfaValueFactory.isEffectivelyUnqualified(refExpr)) {
if (DfaValueFactory.isEffectivelyUnqualified(refExpr) || isStaticFinalConstantWithoutInitializationHacks(var)) {
if (isFieldDereferenceBeforeInitialization(refExpr)) {
return myFactory.getConstFactory().getNull();
}
@@ -153,6 +153,16 @@ public class DfaExpressionFactory {
return myFactory.createTypeValue(type, DfaPsiUtil.getElementNullability(type, var));
}
private static boolean isStaticFinalConstantWithoutInitializationHacks(PsiModifierListOwner var) {
if (var instanceof PsiField && var.hasModifierProperty(PsiModifier.FINAL) && var.hasModifierProperty(PsiModifier.STATIC)) {
PsiClass containingClass = ((PsiField)var).getContainingClass();
if (containingClass != null && !System.class.getName().equals(containingClass.getQualifiedName())) {
return true;
}
}
return false;
}
private static boolean isFieldDereferenceBeforeInitialization(PsiReferenceExpression ref) {
PsiField placeField = PsiTreeUtil.getParentOfType(ref, PsiField.class, true, PsiClass.class, PsiLambdaExpression.class);
if (placeField == null) return false;
@@ -0,0 +1,10 @@
interface I {
Object CONST = new Object();
}
class C {
void foo(Object o) {
if (o == I.CONST) return;
if (<warning descr="Condition 'o != I.CONST' is always 'true'">o != I.CONST</warning>) return;
}
}
@@ -483,6 +483,8 @@ public class DataFlowInspectionTest extends DataFlowInspectionTestCase {
checkIntentionResult("Remove 'for' statement");
}
public void testUsingInterfaceConstant() { doTest();}
//https://youtrack.jetbrains.com/issue/IDEA-162184
public void testNullLiteralAndInferredMethodContract() {
doTest();