diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java index 422b672b2330..1f97d064e6bb 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java @@ -310,6 +310,7 @@ public class ControlFlowAnalyzer extends JavaElementVisitor { } private void initializeVariable(PsiVariable variable, PsiExpression initializer) { + if (DfaUtil.ignoreInitializer(variable)) return; DfaVariableValue dfaVariable = myFactory.getVarFactory().createVariableValue(variable, false); addInstruction(new PushInstruction(dfaVariable, initializer, true)); initializer.accept(this); diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowRunner.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowRunner.java index 3d6bf0e6e61c..1dc31f2abd00 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowRunner.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowRunner.java @@ -303,7 +303,7 @@ public class DataFlowRunner { private static DfaValue makeInitialValue(DfaVariableValue var, PsiElement block) { if(var.getQualifier() != null) return null; PsiField field = ObjectUtils.tryCast(var.getPsiVariable(), PsiField.class); - if (field == null || DfaUtil.hasInitializationHacks(field)) return null; + if (field == null || DfaUtil.ignoreInitializer(field) || DfaUtil.hasInitializationHacks(field)) return null; return DfaUtil.getPossiblyNonInitializedValue(var.getFactory(), field, block); } diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaUtil.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaUtil.java index a722dee05e7a..51b0217acd53 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaUtil.java @@ -273,6 +273,17 @@ public class DfaUtil { return containingClass != null && System.class.getName().equals(containingClass.getQualifiedName()); } + public static boolean ignoreInitializer(PsiVariable variable) { + // Skip boolean constant fields as they usually used as control knobs to modify program logic + // it's better to analyze both true and false values even if it's predefined + PsiExpression initializer = PsiUtil.skipParenthesizedExprDown(variable.getInitializer()); + return initializer != null && + variable instanceof PsiField && + variable.hasModifierProperty(PsiModifier.FINAL) && + variable.getType().equals(PsiType.BOOLEAN) && + (ExpressionUtils.isLiteral(initializer, Boolean.TRUE) || ExpressionUtils.isLiteral(initializer, Boolean.FALSE)); + } + static boolean isInsideConstructorOrInitializer(PsiElement element) { while (element != null) { if (element instanceof PsiClass) return true; diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaConstValue.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaConstValue.java index f04c0fa745cf..3ec81f9f4d27 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaConstValue.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaConstValue.java @@ -16,6 +16,7 @@ package com.intellij.codeInspection.dataFlow.value; +import com.intellij.codeInspection.dataFlow.DfaUtil; import com.intellij.psi.*; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; @@ -56,6 +57,7 @@ public class DfaConstValue extends DfaValue { @Nullable public DfaValue create(PsiVariable variable) { + if (DfaUtil.ignoreInitializer(variable)) return null; Object value = variable.computeConstantValue(); PsiType type = variable.getType(); if (value == null) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unwrapIfStatement/afterUnreachableElse.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unwrapIfStatement/afterUnreachableElse.java index 19013534d407..ce2c038f1dd0 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unwrapIfStatement/afterUnreachableElse.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unwrapIfStatement/afterUnreachableElse.java @@ -1,8 +1,7 @@ // "Unwrap 'if' statement" "true" class X { - private final boolean field = true; - String m() { + boolean field = true; return "one"; } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unwrapIfStatement/beforeUnreachableElse.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unwrapIfStatement/beforeUnreachableElse.java index 24f2a8b27728..21f04db09c28 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unwrapIfStatement/beforeUnreachableElse.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unwrapIfStatement/beforeUnreachableElse.java @@ -1,8 +1,7 @@ // "Unwrap 'if' statement" "true" class X { - private final boolean field = true; - String m() { + boolean field = true; if (field) return "one"; return "two"; }