SOE (IDEA-142291)

This commit is contained in:
Anna Kozlova
2015-07-06 15:56:21 +03:00
parent 721b78049e
commit 0c0d95fbc9
5 changed files with 29 additions and 12 deletions
@@ -20,6 +20,8 @@ import com.intellij.psi.util.MethodSignatureUtil;
import com.intellij.refactoring.classMembers.AbstractMemberInfoStorage;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
public class MemberInfoStorage extends AbstractMemberInfoStorage<PsiMember, PsiClass, MemberInfo> {
@@ -53,24 +55,26 @@ public class MemberInfoStorage extends AbstractMemberInfoStorage<PsiMember, PsiC
@Override
protected void buildSubClassesMap(PsiClass aClass) {
buildSubClassesMap(aClass, new HashSet<PsiClass>());
}
private void buildSubClassesMap(PsiClass aClass, Set<PsiClass> visited) {
final PsiReferenceList extendsList = aClass.getExtendsList();
if (extendsList != null) {
buildSubClassesMapForList(extendsList.getReferencedTypes(), aClass);
buildSubClassesMapForList(extendsList.getReferencedTypes(), aClass, visited);
}
final PsiReferenceList implementsList = aClass.getImplementsList();
if (implementsList != null) {
buildSubClassesMapForList(implementsList.getReferencedTypes(), aClass);
buildSubClassesMapForList(implementsList.getReferencedTypes(), aClass, visited);
}
}
private void buildSubClassesMapForList(final PsiClassType[] classesList, PsiClass aClass) {
for (int i = 0; i < classesList.length; i++) {
PsiClassType element = classesList[i];
private void buildSubClassesMapForList(final PsiClassType[] classesList, PsiClass aClass, Set<PsiClass> processed) {
for (PsiClassType element : classesList) {
PsiClass resolved = element.resolve();
if(resolved != null) {
PsiClass superClass = resolved;
getSubclasses(superClass).add(aClass);
buildSubClassesMap(superClass);
if (resolved != null && processed.add(resolved)) {
getSubclasses(resolved).add(aClass);
buildSubClassesMap(resolved, processed);
}
}
}
@@ -0,0 +1,4 @@
class C extends C {
@Override
public void test() {}
}
@@ -0,0 +1,3 @@
class C extends C {
public void test() {}
}
@@ -178,6 +178,10 @@ public class PullUpTest extends LightRefactoringTestCase {
doTest(false, new RefactoringTestUtil.MemberDescriptor("HM", PsiClass.class), new RefactoringTestUtil.MemberDescriptor("foo", PsiMethod.class));
}
public void testSOEOnSelfInheritance() throws Exception {
doTest(false, IGNORE_CONFLICTS, new RefactoringTestUtil.MemberDescriptor("test", PsiMethod.class));
}
private void doTest(RefactoringTestUtil.MemberDescriptor... membersToFind) {
doTest(true, membersToFind);
}
@@ -82,7 +82,7 @@ public abstract class AbstractMemberInfoStorage<T extends PsiElement, C extends
List<M> result = myTargetClassToIntermediateMemberInfosMap.get(baseClass);
if (result == null) {
Set<M> list = getIntermediateClassesMemberInfosList(baseClass);
Set<M> list = getIntermediateClassesMemberInfosList(baseClass, new HashSet<C>());
result = Collections.unmodifiableList(new ArrayList<M>(list));
myTargetClassToIntermediateMemberInfosMap.put(baseClass, result);
}
@@ -90,7 +90,7 @@ public abstract class AbstractMemberInfoStorage<T extends PsiElement, C extends
return result;
}
private Set<M> getIntermediateClassesMemberInfosList(C targetClass) {
private Set<M> getIntermediateClassesMemberInfosList(C targetClass, Set<C> visited) {
LinkedHashSet<M> result = myTargetClassToMemberInfosListMap.get(targetClass);
if(result == null) {
result = new LinkedHashSet<M>();
@@ -100,7 +100,9 @@ public abstract class AbstractMemberInfoStorage<T extends PsiElement, C extends
result.addAll(memberInfos);
}
for (C subclass : subclasses) {
result.addAll(getIntermediateClassesMemberInfosList(subclass));
if (visited.add(subclass)) {
result.addAll(getIntermediateClassesMemberInfosList(subclass, visited));
}
}
myTargetClassToMemberInfosListMap.put(targetClass, result);
}