mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
IDEA-175296 Uncaught 'condition is always false' with interface constant
This commit is contained in:
+11
-1
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user