mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
move instance method: do not break visitor - postpone whole expr replacement (IDEA-84207)
This commit is contained in:
+8
-3
@@ -376,6 +376,7 @@ public class MoveInstanceMethodProcessor extends BaseRefactoringProcessor{
|
||||
//correct internal references
|
||||
final PsiCodeBlock body = myMethod.getBody();
|
||||
if (body != null) {
|
||||
final Map<PsiElement, PsiElement> replaceMap = new HashMap<PsiElement, PsiElement>();
|
||||
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();
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
class A {
|
||||
|
||||
void n(B b) {
|
||||
m(b);
|
||||
}
|
||||
|
||||
void m<caret>(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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
+2
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user