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 8b5007c88d06..024f889e9858 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/ControlFlowWrapper.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/ControlFlowWrapper.java @@ -147,8 +147,8 @@ public class ControlFlowWrapper { return myExitStatements; } - public List filterUsedVariables(PsiVariable[] outputVariables) { - return ControlFlowUtil.filterUsedVariables(myControlFlow, myFlowEnd, outputVariables); + public boolean isVariableUsedAfterEnd(PsiVariable variable) { + return ControlFlowUtil.needVariableValueAt(variable, myControlFlow, myFlowEnd); } public static class ExitStatementsNotSameException extends Exception {} diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractMethodObjectProcessor.java b/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractMethodObjectProcessor.java index cfa9cd86009a..105ed65a340e 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractMethodObjectProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractMethodObjectProcessor.java @@ -874,7 +874,10 @@ public class ExtractMethodObjectProcessor extends BaseRefactoringProcessor { setMethodCall((PsiMethodCallExpression)((PsiLocalVariable)replace.getDeclaredElements()[0]).getInitializer()); } - final List usedVariables = myControlFlowWrapper.filterUsedVariables(myOutputVariables); + PsiVariable[] usedVariables = myOutputVariables; + if (generatesConditionalExit() && myOutputVariable != null && !myControlFlowWrapper.isVariableUsedAfterEnd(myOutputVariable)) { + usedVariables = ArrayUtil.remove(usedVariables, myOutputVariable); + } Collection reassigned = myControlFlowWrapper.getInitializedTwice(); for (PsiVariable variable : usedVariables) { String name = variable.getName(); diff --git a/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowUtil.java b/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowUtil.java index f801e66ba5e6..db2cbddb77c4 100644 --- a/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowUtil.java +++ b/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowUtil.java @@ -148,7 +148,7 @@ public class ControlFlowUtil { return result; } - private static boolean needVariableValueAt(final PsiVariable variable, final ControlFlow flow, final int offset) { + public static boolean needVariableValueAt(final PsiVariable variable, final ControlFlow flow, final int offset) { InstructionClientVisitor visitor = new InstructionClientVisitor() { final boolean[] neededBelow = new boolean[flow.getSize() + 1]; @@ -361,19 +361,6 @@ public class ControlFlowUtil { return outputVariables; } - public static List filterUsedVariables(ControlFlow flow, int offset, PsiVariable[] variables) { - if (offset >= flow.getSize()) { - return Collections.emptyList(); - } - List result = new ArrayList<>(); - for (PsiVariable variable : variables) { - if (needVariableValueAt(variable, flow, offset)) { - result.add(variable); - } - } - return result; - } - public static Collection findExitPointsAndStatements(final ControlFlow flow, final int start, final int end, final IntArrayList exitPoints, final Class... classesFilter) { if (end == start) {