From 961086a6d1dc2882c38c4b752267db41aec91816 Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 4 Jul 2012 21:06:31 +0200 Subject: [PATCH] do not skip control flow for unreachable code (IDEA-87654) --- .../extractMethod/ControlFlowWrapper.java | 16 +++++++++++++--- .../extractMethod/ExtractMethodProcessor.java | 2 +- ...ConstantConditionsAffectingControlFlow1.java | 13 +++++++++++++ ...ntConditionsAffectingControlFlow1_after.java | 17 +++++++++++++++++ .../NullableCheckDontMissFinal_after.java | 3 ++- .../intellij/refactoring/ExtractMethodTest.java | 4 ++++ 6 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 java/java-tests/testData/refactoring/extractMethod/ConstantConditionsAffectingControlFlow1.java create mode 100644 java/java-tests/testData/refactoring/extractMethod/ConstantConditionsAffectingControlFlow1_after.java diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethod/ControlFlowWrapper.java b/java/java-impl/src/com/intellij/refactoring/extractMethod/ControlFlowWrapper.java index 4fc8f55a5c76..980b71aa50f0 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/ControlFlowWrapper.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/ControlFlowWrapper.java @@ -46,7 +46,7 @@ public class ControlFlowWrapper { public ControlFlowWrapper(Project project, PsiElement codeFragment, PsiElement[] elements) throws PrepareFailedException { try { myControlFlow = - ControlFlowFactory.getInstance(project).getControlFlow(codeFragment, new LocalsControlFlowPolicy(codeFragment), false, true); + ControlFlowFactory.getInstance(project).getControlFlow(codeFragment, new LocalsControlFlowPolicy(codeFragment), false, false); } catch (AnalysisCanceledException e) { throw new PrepareFailedException(RefactoringBundle.message("extract.method.control.flow.analysis.failed"), e.getErrorElement()); @@ -232,7 +232,7 @@ public class ControlFlowWrapper { return true; } - public List getInputVariables(final PsiElement codeFragment) { + public List getInputVariables(final PsiElement codeFragment, PsiElement[] elements) { final List inputVariables = ControlFlowUtil.getInputVariables(myControlFlow, myFlowStart, myFlowEnd); List myInputVariables; if (myGenerateConditionalExit) { @@ -241,7 +241,17 @@ public class ControlFlowWrapper { myInputVariables = inputVariableList; } else { - myInputVariables = inputVariables; + List inputVariableList = new ArrayList(inputVariables); + for (Iterator iterator = inputVariableList.iterator(); iterator.hasNext(); ) { + PsiVariable variable = iterator.next(); + for (PsiElement element : elements) { + if (PsiTreeUtil.isAncestor(element, variable, false)) { + iterator.remove(); + break; + } + } + } + myInputVariables = inputVariableList; } //varargs variables go last, otherwise order is induced by original ordering Collections.sort(myInputVariables, new Comparator() { diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java index f6895cc4fe35..4524b8b0e36f 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java @@ -1073,7 +1073,7 @@ public class ExtractMethodProcessor implements MatchProvider { } private boolean chooseTargetClass(PsiElement codeFragment, final Pass extractPass) throws PrepareFailedException { - final List inputVariables = myControlFlowWrapper.getInputVariables(codeFragment); + final List inputVariables = myControlFlowWrapper.getInputVariables(codeFragment, myElements); myNeedChangeContext = false; myTargetClass = myCodeFragmentMember instanceof PsiMember diff --git a/java/java-tests/testData/refactoring/extractMethod/ConstantConditionsAffectingControlFlow1.java b/java/java-tests/testData/refactoring/extractMethod/ConstantConditionsAffectingControlFlow1.java new file mode 100644 index 000000000000..f03fb56d7841 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/ConstantConditionsAffectingControlFlow1.java @@ -0,0 +1,13 @@ +class Test { + + public void test(boolean b) { + int a = 1; + if (true) { + System.out.println(a); + } else { + System.out.println(a); + } + } + + +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethod/ConstantConditionsAffectingControlFlow1_after.java b/java/java-tests/testData/refactoring/extractMethod/ConstantConditionsAffectingControlFlow1_after.java new file mode 100644 index 000000000000..5d57d125f39e --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/ConstantConditionsAffectingControlFlow1_after.java @@ -0,0 +1,17 @@ +class Test { + + public void test(boolean b) { + int a = 1; + if (true) { + newMethod(a); + } else { + newMethod(a); + } + } + + private void newMethod(int a) { + System.out.println(a); + } + + +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethod/NullableCheckDontMissFinal_after.java b/java/java-tests/testData/refactoring/extractMethod/NullableCheckDontMissFinal_after.java index 47b5fa6686e0..217f9f4f955a 100644 --- a/java/java-tests/testData/refactoring/extractMethod/NullableCheckDontMissFinal_after.java +++ b/java/java-tests/testData/refactoring/extractMethod/NullableCheckDontMissFinal_after.java @@ -1,6 +1,7 @@ class Test { void foo() { final String str = newMethod(); + if (str == null) return; new Runnable() { public void run() { System.out.println(str); @@ -11,7 +12,7 @@ class Test { private String newMethod() { final String str = ""; if (str == "") { - return; + return null; } return str; } diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java index 123b3e4bedad..f2b76f2cf33c 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java @@ -393,6 +393,10 @@ public class ExtractMethodTest extends LightCodeInsightTestCase { public void testConstantConditionsAffectingControlFlow() throws Exception { doTest(); } + + public void testConstantConditionsAffectingControlFlow1() throws Exception { + doTest(); + } public void testNotInitializedInsideFinally() throws Exception { doTest(); }