diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveInstanceMethod/MoveInstanceMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/move/moveInstanceMethod/MoveInstanceMethodProcessor.java index 2dfc5ba48288..04f4c4e17ead 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveInstanceMethod/MoveInstanceMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveInstanceMethod/MoveInstanceMethodProcessor.java @@ -376,6 +376,7 @@ public class MoveInstanceMethodProcessor extends BaseRefactoringProcessor{ //correct internal references final PsiCodeBlock body = myMethod.getBody(); if (body != null) { + final Map replaceMap = new HashMap(); body.accept(new JavaRecursiveElementVisitor() { @Override public void visitThisExpression(PsiThisExpression expression) { final PsiClass classReferencedByThis = MoveInstanceMembersUtil.getClassReferencedByThis(expression); @@ -384,7 +385,7 @@ public class MoveInstanceMethodProcessor extends BaseRefactoringProcessor{ String paramName = getParameterNameToCreate(classReferencedByThis); try { final PsiExpression refExpression = factory.createExpressionFromText(paramName, null); - expression.replace(refExpression); + replaceMap.put(expression, refExpression); } catch (IncorrectOperationException e) { LOG.error(e); @@ -411,7 +412,7 @@ public class MoveInstanceMethodProcessor extends BaseRefactoringProcessor{ } if (myTargetVariable.equals(resolved)) { PsiThisExpression thisExpression = (PsiThisExpression)factory.createExpressionFromText("this", null); - expression.replace(thisExpression); + replaceMap.put(expression, thisExpression); return; } else if (myMethod.equals(resolved)) { @@ -446,7 +447,7 @@ public class MoveInstanceMethodProcessor extends BaseRefactoringProcessor{ if (qualifier != null) qualifier.delete(); final String paramName = getParameterNameToCreate(classReferencedByThis); final PsiExpression newExpression = factory.createExpressionFromText(paramName + "." + expression.getText(), null); - expression = (PsiNewExpression)expression.replace(newExpression); + replaceMap.put(expression, newExpression); } } super.visitNewExpression(expression); @@ -461,6 +462,10 @@ public class MoveInstanceMethodProcessor extends BaseRefactoringProcessor{ super.visitMethodCallExpression(expression); } }); + for (PsiElement element : replaceMap.keySet()) { + final PsiElement replacement = replaceMap.get(element); + element.replace(replacement); + } } final PsiMethod methodCopy = getPatternMethod(); diff --git a/java/java-tests/testData/refactoring/moveInstanceMethod/PolyadicExpr.java b/java/java-tests/testData/refactoring/moveInstanceMethod/PolyadicExpr.java new file mode 100644 index 000000000000..d9ecff9098e5 --- /dev/null +++ b/java/java-tests/testData/refactoring/moveInstanceMethod/PolyadicExpr.java @@ -0,0 +1,24 @@ +class A { + + void n(B b) { + m(b); + } + + void m(B b) { + System.out.print("display for me the shape" + this + " " + b.getI() + "times"); + } +} + +class B { + private final int i; + + public B(int i) { + this.i = i; + } + + + public int getI() { + return i; + } + +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/moveInstanceMethod/PolyadicExpr.java.after b/java/java-tests/testData/refactoring/moveInstanceMethod/PolyadicExpr.java.after new file mode 100644 index 000000000000..4cd4987f69fe --- /dev/null +++ b/java/java-tests/testData/refactoring/moveInstanceMethod/PolyadicExpr.java.after @@ -0,0 +1,24 @@ +class A { + + void n(B b) { + b.m(this); + } + +} + +class B { + private final int i; + + public B(int i) { + this.i = i; + } + + + public int getI() { + return i; + } + + void m(A a) { + System.out.print("display for me the shape" + a + " " + getI() + "times"); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/moveMethod/MoveInstanceMethodTest.java b/java/java-tests/testSrc/com/intellij/refactoring/moveMethod/MoveInstanceMethodTest.java index 70c369cdb3e8..d1b0d026be00 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/moveMethod/MoveInstanceMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/moveMethod/MoveInstanceMethodTest.java @@ -55,6 +55,8 @@ public class MoveInstanceMethodTest extends LightRefactoringTestCase { public void testOverloadingMethods() throws Exception { doTest(true, 0); } + public void testPolyadicExpr() throws Exception { doTest(true, 0); } + public void testEscalateVisibility() throws Exception { doTest(true, 0, VisibilityUtil.ESCALATE_VISIBILITY); }