mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
DFA: ignore boolean fields initializer if it's true or false literal
Often it's used as a knob to switch program behavior, so it's reasonable to analyze both alternatives
This commit is contained in:
+1
@@ -310,6 +310,7 @@ public class ControlFlowAnalyzer extends JavaElementVisitor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void initializeVariable(PsiVariable variable, PsiExpression initializer) {
|
private void initializeVariable(PsiVariable variable, PsiExpression initializer) {
|
||||||
|
if (DfaUtil.ignoreInitializer(variable)) return;
|
||||||
DfaVariableValue dfaVariable = myFactory.getVarFactory().createVariableValue(variable, false);
|
DfaVariableValue dfaVariable = myFactory.getVarFactory().createVariableValue(variable, false);
|
||||||
addInstruction(new PushInstruction(dfaVariable, initializer, true));
|
addInstruction(new PushInstruction(dfaVariable, initializer, true));
|
||||||
initializer.accept(this);
|
initializer.accept(this);
|
||||||
|
|||||||
+1
-1
@@ -303,7 +303,7 @@ public class DataFlowRunner {
|
|||||||
private static DfaValue makeInitialValue(DfaVariableValue var, PsiElement block) {
|
private static DfaValue makeInitialValue(DfaVariableValue var, PsiElement block) {
|
||||||
if(var.getQualifier() != null) return null;
|
if(var.getQualifier() != null) return null;
|
||||||
PsiField field = ObjectUtils.tryCast(var.getPsiVariable(), PsiField.class);
|
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);
|
return DfaUtil.getPossiblyNonInitializedValue(var.getFactory(), field, block);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -273,6 +273,17 @@ public class DfaUtil {
|
|||||||
return containingClass != null && System.class.getName().equals(containingClass.getQualifiedName());
|
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) {
|
static boolean isInsideConstructorOrInitializer(PsiElement element) {
|
||||||
while (element != null) {
|
while (element != null) {
|
||||||
if (element instanceof PsiClass) return true;
|
if (element instanceof PsiClass) return true;
|
||||||
|
|||||||
+2
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package com.intellij.codeInspection.dataFlow.value;
|
package com.intellij.codeInspection.dataFlow.value;
|
||||||
|
|
||||||
|
import com.intellij.codeInspection.dataFlow.DfaUtil;
|
||||||
import com.intellij.psi.*;
|
import com.intellij.psi.*;
|
||||||
import com.intellij.psi.util.PsiUtil;
|
import com.intellij.psi.util.PsiUtil;
|
||||||
import com.intellij.psi.util.TypeConversionUtil;
|
import com.intellij.psi.util.TypeConversionUtil;
|
||||||
@@ -56,6 +57,7 @@ public class DfaConstValue extends DfaValue {
|
|||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public DfaValue create(PsiVariable variable) {
|
public DfaValue create(PsiVariable variable) {
|
||||||
|
if (DfaUtil.ignoreInitializer(variable)) return null;
|
||||||
Object value = variable.computeConstantValue();
|
Object value = variable.computeConstantValue();
|
||||||
PsiType type = variable.getType();
|
PsiType type = variable.getType();
|
||||||
if (value == null) {
|
if (value == null) {
|
||||||
|
|||||||
+1
-2
@@ -1,8 +1,7 @@
|
|||||||
// "Unwrap 'if' statement" "true"
|
// "Unwrap 'if' statement" "true"
|
||||||
class X {
|
class X {
|
||||||
private final boolean field = true;
|
|
||||||
|
|
||||||
String m() {
|
String m() {
|
||||||
|
boolean field = true;
|
||||||
return "one";
|
return "one";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+1
-2
@@ -1,8 +1,7 @@
|
|||||||
// "Unwrap 'if' statement" "true"
|
// "Unwrap 'if' statement" "true"
|
||||||
class X {
|
class X {
|
||||||
private final boolean field = true;
|
|
||||||
|
|
||||||
String m() {
|
String m() {
|
||||||
|
boolean field = true;
|
||||||
if (fiel<caret>d) return "one";
|
if (fiel<caret>d) return "one";
|
||||||
return "two";
|
return "two";
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user