move instance method: do not break visitor - postpone whole expr replacement (IDEA-84207)

This commit is contained in:
anna
2012-04-06 18:06:20 +02:00
parent a144726c76
commit 6482929c2d
4 changed files with 58 additions and 3 deletions
@@ -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();