diff --git a/java/java-impl/src/com/intellij/refactoring/util/classMembers/MemberInfoStorage.java b/java/java-impl/src/com/intellij/refactoring/util/classMembers/MemberInfoStorage.java index 7af179e23852..34fd3241e368 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/classMembers/MemberInfoStorage.java +++ b/java/java-impl/src/com/intellij/refactoring/util/classMembers/MemberInfoStorage.java @@ -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 { @@ -53,24 +55,26 @@ public class MemberInfoStorage extends AbstractMemberInfoStorage()); + } + + private void buildSubClassesMap(PsiClass aClass, Set 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 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); } } } diff --git a/java/java-tests/testData/refactoring/pullUp/SOEOnSelfInheritance.java b/java/java-tests/testData/refactoring/pullUp/SOEOnSelfInheritance.java new file mode 100644 index 000000000000..8f94c6680294 --- /dev/null +++ b/java/java-tests/testData/refactoring/pullUp/SOEOnSelfInheritance.java @@ -0,0 +1,4 @@ +class C extends C { + @Override + public void test() {} +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/pullUp/SOEOnSelfInheritance_after.java b/java/java-tests/testData/refactoring/pullUp/SOEOnSelfInheritance_after.java new file mode 100644 index 000000000000..d7b0a3ea17c1 --- /dev/null +++ b/java/java-tests/testData/refactoring/pullUp/SOEOnSelfInheritance_after.java @@ -0,0 +1,3 @@ +class C extends C { + public void test() {} +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java b/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java index df5f293dc6d3..2527ffa22e6d 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java @@ -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); } diff --git a/platform/lang-impl/src/com/intellij/refactoring/classMembers/AbstractMemberInfoStorage.java b/platform/lang-impl/src/com/intellij/refactoring/classMembers/AbstractMemberInfoStorage.java index 2a34b16804ec..6fa96bf5d885 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/classMembers/AbstractMemberInfoStorage.java +++ b/platform/lang-impl/src/com/intellij/refactoring/classMembers/AbstractMemberInfoStorage.java @@ -82,7 +82,7 @@ public abstract class AbstractMemberInfoStorage result = myTargetClassToIntermediateMemberInfosMap.get(baseClass); if (result == null) { - Set list = getIntermediateClassesMemberInfosList(baseClass); + Set list = getIntermediateClassesMemberInfosList(baseClass, new HashSet()); result = Collections.unmodifiableList(new ArrayList(list)); myTargetClassToIntermediateMemberInfosMap.put(baseClass, result); } @@ -90,7 +90,7 @@ public abstract class AbstractMemberInfoStorage getIntermediateClassesMemberInfosList(C targetClass) { + private Set getIntermediateClassesMemberInfosList(C targetClass, Set visited) { LinkedHashSet result = myTargetClassToMemberInfosListMap.get(targetClass); if(result == null) { result = new LinkedHashSet(); @@ -100,7 +100,9 @@ public abstract class AbstractMemberInfoStorage