inline superclass: correct super references in extends/implements lists without pushdown (IDEA-86639)

This commit is contained in:
Anna Kozlova
2012-05-25 14:16:50 +04:00
parent 523a165038
commit 4c730104a8
7 changed files with 22 additions and 31 deletions
@@ -40,11 +40,11 @@ import com.intellij.refactoring.util.classMembers.MemberInfoStorage;
import com.intellij.usageView.UsageInfo;
import com.intellij.usageView.UsageViewDescriptor;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.Processor;import com.intellij.util.containers.HashMap;
import com.intellij.util.Processor;
import com.intellij.util.containers.HashMap;
import com.intellij.util.containers.MultiMap;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -63,39 +63,16 @@ public class InlineSuperClassRefactoringProcessor extends FixableUsagesRefactori
myTargetClasses = targetClasses;
MemberInfoStorage memberInfoStorage = new MemberInfoStorage(mySuperClass, new MemberInfo.Filter<PsiMember>() {
public boolean includeMember(PsiMember element) {
return true;
return !(element instanceof PsiClass) || PsiTreeUtil.isAncestor(mySuperClass, element, true);
}
});
List<MemberInfo> members = memberInfoStorage.getClassMemberInfos(mySuperClass);
for (MemberInfo member : members) {
member.setChecked(true);
}
members = appendSuperRefs(members);
myMemberInfos = members.toArray(new MemberInfo[members.size()]);
}
private List<MemberInfo> appendSuperRefs(List<MemberInfo> members) {
if (!mySuperClass.isInterface()) {
PsiReferenceList extendsList = mySuperClass.getExtendsList();
if (extendsList != null && extendsList.getReferenceElements().length > 0) {
PsiElement resolve = extendsList.getReferenceElements()[0].resolve();
if (resolve instanceof PsiClass) {
members = new ArrayList<MemberInfo>(members);
MemberInfo memberInfo = new MemberInfo((PsiMember)resolve, true, extendsList) {
{
overrides = false;
}
};
memberInfo.setChecked(true);
members.add(memberInfo);
}
}
}
return members;
}
@NotNull
protected UsageViewDescriptor createUsageViewDescriptor(final UsageInfo[] usages) {
return new InlineSuperClassUsageViewDescriptor(mySuperClass);
@@ -21,22 +21,22 @@
package com.intellij.refactoring.inlineSuperClass.usageInfo;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiJavaCodeReferenceElement;
import com.intellij.refactoring.safeDelete.usageInfo.SafeDeleteExtendsClassUsageInfo;
import com.intellij.refactoring.util.FixableUsageInfo;
import com.intellij.util.IncorrectOperationException;
public class ReplaceExtendsListUsageInfo extends FixableUsageInfo {
private final SafeDeleteExtendsClassUsageInfo mySafeDeleteUsageInfo;
public ReplaceExtendsListUsageInfo(PsiJavaCodeReferenceElement element, final PsiClass superClass, final PsiClass targetClass) {
super(element);
mySafeDeleteUsageInfo = new SafeDeleteExtendsClassUsageInfo(element, superClass, targetClass);
}
public void fixUsage() throws IncorrectOperationException {
final PsiElement element = getElement();
if (element != null) {
element.delete();
if (mySafeDeleteUsageInfo.isSafeDelete()) {
mySafeDeleteUsageInfo.deleteElement();
}
}
}
@@ -0,0 +1,2 @@
interface Test<T> extends Int<T> {
}
@@ -0,0 +1,4 @@
interface Super<T> extends Int<T> {
}
interface Int<T> {
}
@@ -0,0 +1,2 @@
interface Test<T> extends Super<T>{
}
@@ -173,6 +173,10 @@ public class InlineSuperClassTest extends MultiFileTestCase {
doTest();
}
public void testInterfaceHierarchyWithSubstitution() throws Exception {
doTest();
}
private void doTestMultipleSubclasses() throws Exception {
doTest(new PerformAction() {
@Override