From 1793a5ad906a96ad778c8fa69c182f0e90d972ee Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 11 Oct 2011 14:06:36 +0200 Subject: [PATCH] extract method object from anonymous class: update method call site when context should be changed; do not change call site though --- .../ExtractMethodObjectProcessor.java | 10 ++++-- .../ExtractFromAnonymous.java | 11 ++++++ .../ExtractFromAnonymous.java.after | 31 ++++++++++++++++ ...ExtractFromIfStatementInsideAnonymous.java | 13 +++++++ ...tFromIfStatementInsideAnonymous.java.after | 35 +++++++++++++++++++ ...ethodObjectWithMultipleExitPointsTest.java | 8 +++++ 6 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/ExtractFromAnonymous.java create mode 100644 java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/ExtractFromAnonymous.java.after create mode 100644 java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/ExtractFromIfStatementInsideAnonymous.java create mode 100644 java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/ExtractFromIfStatementInsideAnonymous.java.after 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 a6a2d833da20..95a3b65a36dc 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractMethodObjectProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractMethodObjectProcessor.java @@ -707,6 +707,11 @@ public class ExtractMethodObjectProcessor extends BaseRefactoringProcessor { return myOutputVariables; } + @Override + protected boolean isNeedToChangeCallContext() { + return false; + } + @Override protected void declareNecessaryVariablesAfterCall(final PsiVariable outputVariable) throws IncorrectOperationException { if (myMultipleExitPoints) { @@ -718,11 +723,12 @@ public class ExtractMethodObjectProcessor extends BaseRefactoringProcessor { if (methodCallStatement instanceof PsiIfStatement) { methodCallStatement.getParent().addBefore(declarationStatement, methodCallStatement); final PsiExpression conditionExpression = ((PsiIfStatement)methodCallStatement).getCondition(); - conditionExpression.replace(myElementFactory.createExpressionFromText(object + ".is()", myInnerMethod)); + setMethodCall((PsiMethodCallExpression)conditionExpression.replace(myElementFactory.createExpressionFromText(object + ".is()", myInnerMethod))); } else if (myElements[0] instanceof PsiExpression){ methodCallStatement.getParent().addBefore(declarationStatement, methodCallStatement); } else { - methodCallStatement.replace(declarationStatement); + final PsiDeclarationStatement replace = (PsiDeclarationStatement)methodCallStatement.replace(declarationStatement); + setMethodCall((PsiMethodCallExpression)((PsiLocalVariable)replace.getDeclaredElements()[0]).getInitializer()); } final List usedVariables = myControlFlowWrapper.getUsedVariables(); diff --git a/java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/ExtractFromAnonymous.java b/java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/ExtractFromAnonymous.java new file mode 100644 index 000000000000..748362292d3a --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/ExtractFromAnonymous.java @@ -0,0 +1,11 @@ +class Test { + void foo() { + new Runnable() { + public void run() { + int i = 0; + int j = 0; + System.out.println(i + j); + } + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/ExtractFromAnonymous.java.after b/java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/ExtractFromAnonymous.java.after new file mode 100644 index 000000000000..ddfa52b76907 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/ExtractFromAnonymous.java.after @@ -0,0 +1,31 @@ +class Test { + void foo() { + new Runnable() { + public void run() { + Inner inner = new Inner().invoke(); + int i = inner.getI(); + int j = inner.getJ(); + System.out.println(i + j); + } + } + } + + private class Inner { + private int i; + private int j; + + public int getI() { + return i; + } + + public int getJ() { + return j; + } + + public Inner invoke() { + i = 0; + j = 0; + return this; + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/ExtractFromIfStatementInsideAnonymous.java b/java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/ExtractFromIfStatementInsideAnonymous.java new file mode 100644 index 000000000000..7b245b23152d --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/ExtractFromIfStatementInsideAnonymous.java @@ -0,0 +1,13 @@ +class Test { + void foo() { + new Runnable() { + public void run() { + String var = null; + if (var == null) { + return; + } + System.out.println(var); + } + }; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/ExtractFromIfStatementInsideAnonymous.java.after b/java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/ExtractFromIfStatementInsideAnonymous.java.after new file mode 100644 index 000000000000..128fea40c9bb --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/ExtractFromIfStatementInsideAnonymous.java.after @@ -0,0 +1,35 @@ +class Test { + void foo() { + new Runnable() { + public void run() { + Inner inner = new Inner().invoke(); + if (inner.is()) return; + String var = inner.getVar(); + System.out.println(var); + } + }; + } + + private class Inner { + private boolean myResult; + private String var; + + boolean is() { + return myResult; + } + + public String getVar() { + return var; + } + + public Inner invoke() { + var = null; + if (var == null) { + myResult = true; + return this; + } + myResult = false; + return this; + } + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodObjectWithMultipleExitPointsTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodObjectWithMultipleExitPointsTest.java index c130d33d45de..6d67e7ad3287 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodObjectWithMultipleExitPointsTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodObjectWithMultipleExitPointsTest.java @@ -102,4 +102,12 @@ public class ExtractMethodObjectWithMultipleExitPointsTest extends LightCodeInsi public void testNonCanonicalNaming() throws Exception { doTest(); } + + public void testExtractFromAnonymous() throws Exception { + doTest(); + } + + public void testExtractFromIfStatementInsideAnonymous() throws Exception { + doTest(); + } }