mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-13 21:55:01 +07:00
SOE (IDEA-142291)
This commit is contained in:
+13
-9
@@ -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);
|
||||
}
|
||||
|
||||
+5
-3
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user