From b32871b783a49c752f2ccc25d62d3cec33909c04 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 3 Dec 2014 17:04:01 +0100 Subject: [PATCH] extract method: do not suggest object when multiple returns are used without output variable --- .../extractMethod/ExtractMethodProcessor.java | 20 ++++++++++++++----- .../suggestedTypes/OutputUsedInReturn.java | 13 ++++++++++++ .../refactoring/SuggestedReturnTypesTest.java | 4 ++++ 3 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 java/java-tests/testData/refactoring/suggestedTypes/OutputUsedInReturn.java 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 84143ab09a06..8dae3d6ff389 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java @@ -68,10 +68,8 @@ import com.intellij.refactoring.introduceVariable.IntroduceVariableBase; import com.intellij.refactoring.util.*; import com.intellij.refactoring.util.classMembers.ElementNeedsThis; import com.intellij.refactoring.util.duplicates.*; -import com.intellij.util.ArrayUtil; -import com.intellij.util.IncorrectOperationException; -import com.intellij.util.Processor; -import com.intellij.util.VisibilityUtil; +import com.intellij.util.*; +import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -566,7 +564,19 @@ public class ExtractMethodProcessor implements MatchProvider { : PsiTreeUtil.findCommonParent(myElements); return CodeInsightUtil.findReferenceExpressions(scope, myOutputVariable); } - return PsiExpression.EMPTY_ARRAY; + final List filter = ContainerUtil.filter(myExitStatements, new Condition() { + @Override + public boolean value(PsiStatement statement) { + return statement instanceof PsiReturnStatement; + } + }); + final List map = ContainerUtil.map(filter, new Function() { + @Override + public PsiExpression fun(PsiStatement statement) { + return ((PsiReturnStatement) statement).getReturnValue(); + } + }); + return map.toArray(new PsiExpression[map.size()]); } private Nullness initNullness() { diff --git a/java/java-tests/testData/refactoring/suggestedTypes/OutputUsedInReturn.java b/java/java-tests/testData/refactoring/suggestedTypes/OutputUsedInReturn.java new file mode 100644 index 000000000000..c70305ba66ae --- /dev/null +++ b/java/java-tests/testData/refactoring/suggestedTypes/OutputUsedInReturn.java @@ -0,0 +1,13 @@ +class Test { + String foo(boolean b) { + + if (b) { + return "a"; + } + if (!b) { + return "b"; + } + + return "42"; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/SuggestedReturnTypesTest.java b/java/java-tests/testSrc/com/intellij/refactoring/SuggestedReturnTypesTest.java index 20a1ca5b9ac5..136f3c485a22 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/SuggestedReturnTypesTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/SuggestedReturnTypesTest.java @@ -61,6 +61,10 @@ public class SuggestedReturnTypesTest extends LightCodeInsightTestCase { doTest("Integer", "int"); } + public void testOutputUsedInReturn() throws Exception { + doTest("String"); + } + private void doTest(String... types) throws Exception { configureByFile(BASE_PATH + getTestName(false) + ".java");