diff --git a/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpHelper.java b/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpHelper.java index aa7f8d617d00..71305101c8d1 100644 --- a/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpHelper.java +++ b/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpHelper.java @@ -33,8 +33,10 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressManager; +import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.Ref; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleSettings; @@ -62,6 +64,7 @@ import com.intellij.util.IncorrectOperationException; import com.intellij.util.Query; import com.intellij.util.VisibilityUtil; import com.intellij.util.containers.HashMap; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -148,7 +151,7 @@ public class PullUpHelper extends BaseRefactoringProcessor{ final Set methodsToSearchDuplicates = new HashSet(); for (PsiMember psiMember : myMembersAfterMove) { if (psiMember instanceof PsiMethod && ((PsiMethod)psiMember).getBody() != null) { - methodsToSearchDuplicates.add((PsiMethod)psiMember); + methodsToSearchDuplicates.add(psiMember); } } @@ -289,7 +292,7 @@ public class PullUpHelper extends BaseRefactoringProcessor{ PsiJavaCodeReferenceElement ref = mySourceClass.equals(sourceReferenceList.getParent()) ? RefactoringUtil.removeFromReferenceList(sourceReferenceList, aClass) : RefactoringUtil.findReferenceToClass(sourceReferenceList, aClass); - if (ref != null) { + if (ref != null && !myTargetSuperClass.isInheritor(aClass, false)) { RefactoringUtil.replaceMovedMemberTypeParameters(ref, PsiUtil.typeParametersIterable(mySourceClass), substitutor, elementFactory); final PsiReferenceList referenceList = myTargetSuperClass.isInterface() ? myTargetSuperClass.getExtendsList() : myTargetSuperClass.getImplementsList(); diff --git a/java/java-tests/testData/refactoring/pullUp/MergeInterfaces.java b/java/java-tests/testData/refactoring/pullUp/MergeInterfaces.java new file mode 100644 index 000000000000..68f3d11cf803 --- /dev/null +++ b/java/java-tests/testData/refactoring/pullUp/MergeInterfaces.java @@ -0,0 +1,3 @@ +class Base implements I {} +class Test extends Base implements I {} +interface I{} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/pullUp/MergeInterfaces_after.java b/java/java-tests/testData/refactoring/pullUp/MergeInterfaces_after.java new file mode 100644 index 000000000000..dfad6f6eb34f --- /dev/null +++ b/java/java-tests/testData/refactoring/pullUp/MergeInterfaces_after.java @@ -0,0 +1,3 @@ +class Base implements I {} +class Test extends Base {} +interface I{} \ 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 b17563b2f75c..c4f5a7aa0e89 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java @@ -111,6 +111,10 @@ public class PullUpTest extends LightRefactoringTestCase { doTest(false, new RefactoringTestUtil.MemberDescriptor("foo", PsiMethod.class)); } + public void testMergeInterfaces() throws Exception { + doTest(false, new RefactoringTestUtil.MemberDescriptor("I", PsiClass.class)); + } + private void doTest(RefactoringTestUtil.MemberDescriptor... membersToFind) throws Exception { doTest(true, membersToFind); }