replace method duplicates: qualify with super instead of this when method is located in the base class ( IDEA-21753 )

This commit is contained in:
anna
2010-05-31 19:33:22 +04:00
parent 2c00677a53
commit 40d73b7c32
5 changed files with 52 additions and 13 deletions
@@ -413,20 +413,28 @@ public class RefactoringUtil {
}
public static PsiThisExpression createThisExpression(PsiManager manager, PsiClass qualifierClass) throws IncorrectOperationException {
PsiElementFactory factory = JavaPsiFacade.getInstance(manager.getProject()).getElementFactory();
if (qualifierClass != null) {
PsiThisExpression qualifiedThis = (PsiThisExpression)factory.createExpressionFromText("q.this", null);
qualifiedThis = (PsiThisExpression)CodeStyleManager.getInstance(manager.getProject()).reformat(qualifiedThis);
PsiJavaCodeReferenceElement thisQualifier = qualifiedThis.getQualifier();
LOG.assertTrue(thisQualifier != null);
thisQualifier.bindToElement(qualifierClass);
return qualifiedThis;
}
else {
return (PsiThisExpression)factory.createExpressionFromText("this", null);
}
return RefactoringUtil.<PsiThisExpression>createQualifiedExpression(manager, qualifierClass, "this");
}
public static PsiSuperExpression createSuperExpression(PsiManager manager, PsiClass qualifierClass) throws IncorrectOperationException {
return RefactoringUtil.<PsiSuperExpression>createQualifiedExpression(manager, qualifierClass, "super");
}
private static <T extends PsiQualifiedExpression> T createQualifiedExpression(PsiManager manager, PsiClass qualifierClass, String qName) throws IncorrectOperationException {
PsiElementFactory factory = JavaPsiFacade.getInstance(manager.getProject()).getElementFactory();
if (qualifierClass != null) {
T qualifiedThis = (T)factory.createExpressionFromText("q." + qName, null);
qualifiedThis = (T)CodeStyleManager.getInstance(manager.getProject()).reformat(qualifiedThis);
PsiJavaCodeReferenceElement thisQualifier = qualifiedThis.getQualifier();
LOG.assertTrue(thisQualifier != null);
thisQualifier.bindToElement(qualifierClass);
return qualifiedThis;
}
else {
return (T)factory.createExpressionFromText(qName, null);
}
}
/**
* removes a reference to the specified class from the reference list given
*
@@ -257,7 +257,12 @@ public class MethodDuplicatesHandler implements RefactoringActionHandler {
} else if (needStaticQualifier || myMethod.hasModifierProperty(PsiModifier.STATIC)) {
qualifierExpression.replace(factory.createReferenceExpression(containingClass));
} else {
qualifierExpression.replace(RefactoringUtil.createThisExpression(containingClass.getManager(), containingClass));
final PsiClass psiClass = PsiTreeUtil.getParentOfType(match.getMatchStart(), PsiClass.class);
if (psiClass != null && psiClass.isInheritor(containingClass, true)) {
qualifierExpression.replace(RefactoringUtil.createSuperExpression(containingClass.getManager(), psiClass));
} else {
qualifierExpression.replace(RefactoringUtil.createThisExpression(containingClass.getManager(), containingClass));
}
}
}
VisibilityUtil.escalateVisibility(myMethod, match.getMatchStart());
@@ -0,0 +1,11 @@
public class a {
void f<caret>oo() {
System.out.println();
}
}
class b extends a {
void foo() {
System.out.println();
}
}
@@ -0,0 +1,11 @@
public class a {
void foo() {
System.out.println();
}
}
class b extends a {
void foo() {
b.super.foo();
}
}
@@ -61,4 +61,8 @@ public class FindMethodDuplicatesMiscTest extends FindMethodDuplicatesBaseTest {
public void testSuperInTheSameContextQualified() throws Exception {
doTest();
}
public void testInsertSuperQualifierWhenNameConflicts() throws Exception {
doTest();
}
}