From f889737be84fc9dd9d37b602ec8d86795fbbacac Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Thu, 17 May 2018 15:54:23 +0700 Subject: [PATCH] ControlFlowUtils#isReachable: switch expression handling fixed Fixes IDEA-192129 Logic is changed when an 'if' statement is simplified --- .../siyeh/ig/psiutils/ControlFlowUtils.java | 8 ++++++-- .../controlflow/trivialIf/InSwitch.after.java | 17 +++++++++++++++++ .../controlflow/trivialIf/InSwitch.java | 18 ++++++++++++++++++ .../ig/fixes/controlflow/TrivialIfFixTest.java | 1 + 4 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igfixes/controlflow/trivialIf/InSwitch.after.java create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igfixes/controlflow/trivialIf/InSwitch.java diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ControlFlowUtils.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ControlFlowUtils.java index 33078282ad5f..196af5aa0f18 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ControlFlowUtils.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ControlFlowUtils.java @@ -993,8 +993,12 @@ public class ControlFlowUtils { */ public static boolean isReachable(@NotNull PsiStatement statement) { ControlFlow flow; - PsiCodeBlock block = PsiTreeUtil.getParentOfType(statement, PsiCodeBlock.class); - if (block == null) return true; + PsiElement block = statement; + do { + block = PsiTreeUtil.getParentOfType(block, PsiCodeBlock.class); + if (block == null) return true; + } + while (block.getParent() instanceof PsiSwitchStatement); try { flow = ControlFlowFactory.getInstance(statement.getProject()) .getControlFlow(block, LocalsOrMyInstanceFieldsControlFlowPolicy.getInstance()); diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/controlflow/trivialIf/InSwitch.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/controlflow/trivialIf/InSwitch.after.java new file mode 100644 index 000000000000..3de88037207a --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/controlflow/trivialIf/InSwitch.after.java @@ -0,0 +1,17 @@ +// Copyright 2000-2017 JetBrains s.r.o. +// Use of this source code is governed by the Apache 2.0 license that can be +// found in the LICENSE file. +class InCodeBlock { + private static boolean original(boolean first, boolean second, int i) { + switch (i) { + case 0: + return false; + case 1: + if (first) + return second; + return false; + default: + return true; + } + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/controlflow/trivialIf/InSwitch.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/controlflow/trivialIf/InSwitch.java new file mode 100644 index 000000000000..3e28e7024894 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/controlflow/trivialIf/InSwitch.java @@ -0,0 +1,18 @@ +// Copyright 2000-2017 JetBrains s.r.o. +// Use of this source code is governed by the Apache 2.0 license that can be +// found in the LICENSE file. +class InCodeBlock { + private static boolean original(boolean first, boolean second, int i) { + switch (i) { + case 0: + return false; + case 1: + if (first) + if (second) + return true; + return false; + default: + return true; + } + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/controlflow/TrivialIfFixTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/controlflow/TrivialIfFixTest.java index 9239a570f146..60c03a9aa8a3 100644 --- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/controlflow/TrivialIfFixTest.java +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/controlflow/TrivialIfFixTest.java @@ -37,4 +37,5 @@ public class TrivialIfFixTest extends IGQuickFixesTestCase { public void testParentheses() { doTest(); } public void testNested() { doTest(); } public void testInCodeBlock() { doTest(); } + public void testInSwitch() { doTest(); } } \ No newline at end of file