mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-13 09:19:13 +07:00
replace method duplicates: qualify with super instead of this when method is located in the base class ( IDEA-21753 )
This commit is contained in:
@@ -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
|
||||
*
|
||||
|
||||
+6
-1
@@ -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());
|
||||
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
public class a {
|
||||
void f<caret>oo() {
|
||||
System.out.println();
|
||||
}
|
||||
}
|
||||
|
||||
class b extends a {
|
||||
void foo() {
|
||||
System.out.println();
|
||||
}
|
||||
}
|
||||
+11
@@ -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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user