From da6bf872abda351e1575a83fd2f031f9aed8d6be Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 10 Jul 2015 19:57:05 +0200 Subject: [PATCH] IDEA-66134 Inspection "Constant conditions & exceptions": ignore boolean named constants --- .../dataFlow/DataFlowInspectionBase.java | 39 +++++++++++-------- .../dataFlow/fixture/CompileTimeConstant.java | 10 +++++ 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java index 4e7d44f40af0..bed3e5b67ac8 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java @@ -444,7 +444,7 @@ public class DataFlowInspectionBase extends BaseJavaBatchLocalInspectionTool { InspectionsBundle.message("dataflow.message.unreachable.switch.label")); } } - else if (psiAnchor != null && !reportedAnchors.contains(psiAnchor) && !isCompileConstantInIfCondition(psiAnchor)) { + else if (psiAnchor != null && !reportedAnchors.contains(psiAnchor) && !isFlagCheck(psiAnchor)) { boolean evaluatesToTrue = trueSet.contains(instruction); final PsiElement parent = psiAnchor.getParent(); if (parent instanceof PsiAssignmentExpression && ((PsiAssignmentExpression)parent).getLExpression() == psiAnchor) { @@ -597,25 +597,30 @@ public class DataFlowInspectionBase extends BaseJavaBatchLocalInspectionTool { return false; } - private static boolean isCompileConstantInIfCondition(PsiElement element) { - if (element instanceof PsiPrefixExpression && ((PsiPrefixExpression)element).getOperationTokenType() == JavaTokenType.EXCL) { - return isCompileConstantInIfCondition(((PsiPrefixExpression)element).getOperand()); - } + private static boolean isFlagCheck(PsiElement element) { + PsiStatement statement = PsiTreeUtil.getParentOfType(element, PsiStatement.class); + if (!(statement instanceof PsiIfStatement)) return false; - if (!(element instanceof PsiReferenceExpression)) return false; - PsiElement resolved = ((PsiReferenceExpression)element).resolve(); + PsiExpression condition = ((PsiIfStatement)statement).getCondition(); + if (!PsiTreeUtil.isAncestor(condition, element, false)) return false; + + if (isCompileTimeFlagReference(condition)) return true; + + Collection refs = PsiTreeUtil.findChildrenOfType(condition, PsiReferenceExpression.class); + return ContainerUtil.or(refs, new Condition() { + @Override + public boolean value(PsiReferenceExpression ref) { + return isCompileTimeFlagReference(ref); + } + }); + } + + private static boolean isCompileTimeFlagReference(PsiElement element) { + PsiElement resolved = element instanceof PsiReferenceExpression ? ((PsiReferenceExpression)element).resolve() : null; if (!(resolved instanceof PsiField)) return false; PsiField field = (PsiField)resolved; - - if (!field.hasModifierProperty(PsiModifier.FINAL)) return false; - if (!field.hasModifierProperty(PsiModifier.STATIC)) return false; - - PsiElement parent = element.getParent(); - if (parent instanceof PsiPrefixExpression && ((PsiPrefixExpression)parent).getOperationTokenType() == JavaTokenType.EXCL) { - element = parent; - parent = parent.getParent(); - } - return parent instanceof PsiIfStatement && ((PsiIfStatement)parent).getCondition() == element; + return field.hasModifierProperty(PsiModifier.FINAL) && field.hasModifierProperty(PsiModifier.STATIC) && + PsiType.BOOLEAN.equals(field.getType()); } private static boolean isNullLiteralExpression(PsiElement expr) { diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/CompileTimeConstant.java b/java/java-tests/testData/inspection/dataFlow/fixture/CompileTimeConstant.java index 401df4ccf61c..1835a8130d76 100644 --- a/java/java-tests/testData/inspection/dataFlow/fixture/CompileTimeConstant.java +++ b/java/java-tests/testData/inspection/dataFlow/fixture/CompileTimeConstant.java @@ -11,4 +11,14 @@ class Fun { System.out.println(); } } + + private static final boolean FRONT_DRAW_GRID_LINES = true; + private static final boolean BACK_DRAW_GRID_LINES = true; + + void smthComplex(boolean isFrontPage) { + if (isFrontPage && FRONT_DRAW_GRID_LINES || !isFrontPage && BACK_DRAW_GRID_LINES) { + System.out.println(); + } + } + } \ No newline at end of file