From 0a175d30bc8dcf618685cf3494d4c0b20c1003b7 Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 2 Jan 2015 16:40:20 +0100 Subject: [PATCH] IDEA-134677 ConstantCondition inspection could be smarter for enums --- .../dataFlow/ControlFlowAnalyzer.java | 22 ++++++++------- .../dataFlow/fixture/SwitchEnumConstant.java | 28 +++++++++++++++++++ .../DataFlowInspectionTest.java | 1 + 3 files changed, 41 insertions(+), 10 deletions(-) create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/SwitchEnumConstant.java 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 e90611f372b2..ba923f1ba9e0 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 @@ -647,11 +647,19 @@ public class ControlFlowAnalyzer extends JavaElementVisitor { try { ControlFlow.ControlFlowOffset offset = getStartOffset(statement); PsiExpression caseValue = psiLabelStatement.getCaseValue(); - - if (caseValue != null && + + if (enumValues != null && caseValue instanceof PsiReferenceExpression) { + //noinspection SuspiciousMethodCalls + enumValues.remove(((PsiReferenceExpression)caseValue).resolve()); + } + + boolean alwaysTrue = enumValues != null && enumValues.isEmpty(); + if (alwaysTrue) { + addInstruction(new PushInstruction(myFactory.getConstFactory().getTrue(), null)); + } + else if (caseValue != null && caseExpression instanceof PsiReferenceExpression && - ((PsiReferenceExpression)caseExpression).getQualifierExpression() == null && - JavaPsiFacade.getInstance(body.getProject()).getConstantEvaluationHelper().computeConstantExpression(caseValue) != null) { + ((PsiReferenceExpression)caseExpression).getQualifierExpression() == null) { addInstruction(new PushInstruction(myFactory.createValue(caseExpression), caseExpression)); caseValue.accept(this); @@ -663,12 +671,6 @@ public class ControlFlowAnalyzer extends JavaElementVisitor { addInstruction(new ConditionalGotoInstruction(offset, false, statement)); - if (enumValues != null) { - if (caseValue instanceof PsiReferenceExpression) { - //noinspection SuspiciousMethodCalls - enumValues.remove(((PsiReferenceExpression)caseValue).resolve()); - } - } } catch (IncorrectOperationException e) { LOG.error(e); diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/SwitchEnumConstant.java b/java/java-tests/testData/inspection/dataFlow/fixture/SwitchEnumConstant.java new file mode 100644 index 000000000000..546282552095 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/SwitchEnumConstant.java @@ -0,0 +1,28 @@ +import org.jetbrains.annotations.*; + +class InspectionTest { + + enum Type { + PUBLIC, PRIVATE + } + + @Nullable + public static String foo(Type type) { + Object obj = null; + if (type == Type.PUBLIC) { + obj = new Object(); + } + + switch (type) { + case PUBLIC: + return test(obj); + case PRIVATE: + default: + return null; + } + } + + public static String test(@NotNull Object a) { + return a.toString(); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java index 999ad6ecb90f..1854cd23bf60 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java @@ -92,6 +92,7 @@ public class DataFlowInspectionTest extends LightCodeInsightFixtureTestCase { public void testVisitFinallyOnce() throws Throwable { doTest(); } public void testNotEqualsDoesntImplyNotNullity() throws Throwable { doTest(); } public void testEqualsEnumConstant() throws Throwable { doTest(); } + public void testSwitchEnumConstant() { doTest(); } public void testEnumConstantNotNull() throws Throwable { doTest(); } public void testEqualsConstant() throws Throwable { doTest(); } public void testFinalLoopVariableInstanceof() throws Throwable { doTest(); }