diff --git a/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperClassUtil.java b/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperClassUtil.java index 3e2ea10db7a3..9f2b8b002d33 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperClassUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperClassUtil.java @@ -78,8 +78,16 @@ public class ExtractSuperClassUtil { final PsiReferenceList subClassExtends = subclass.getExtendsList(); if (subClassExtends != null) { copyPsiReferenceList(subClassExtends, superclass.getExtendsList()); - } else if (subclass instanceof PsiAnonymousClass) { - superclass.getExtendsList().add(((PsiAnonymousClass)subclass).getBaseClassReference()); + } + else if (subclass instanceof PsiAnonymousClass) { + PsiJavaCodeReferenceElement classReference = ((PsiAnonymousClass)subclass).getBaseClassReference(); + PsiElement baseClass = classReference.resolve(); + if (baseClass instanceof PsiClass && ((PsiClass)baseClass).isInterface()) { + superclass.getImplementsList().add(classReference); + } + else { + superclass.getExtendsList().add(classReference); + } } // create constructors if neccesary diff --git a/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperclassHandler.java b/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperclassHandler.java index db102a468441..f711ec9fd4d9 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperclassHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperclassHandler.java @@ -40,6 +40,7 @@ import com.intellij.refactoring.util.DocCommentPolicy; import com.intellij.refactoring.util.classMembers.MemberInfo; import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; @@ -98,13 +99,18 @@ public class ExtractSuperclassHandler implements RefactoringActionHandler, Extra } - final List memberInfos = MemberInfo.extractClassMembers(mySubclass, new MemberInfo.Filter() { + List memberInfos = MemberInfo.extractClassMembers(mySubclass, new MemberInfo.Filter() { @Override public boolean includeMember(PsiMember element) { return true; } }, false); + if (mySubclass instanceof PsiAnonymousClass) { + memberInfos = ContainerUtil.filter(memberInfos, memberInfo -> !(memberInfo.getMember() instanceof PsiClass && + memberInfo.getOverrides() != null)); + } + final ExtractSuperclassDialog dialog = new ExtractSuperclassDialog(project, mySubclass, memberInfos, this); if (!dialog.showAndGet() || !dialog.isExtractSuperclass()) { diff --git a/java/java-tests/testData/refactoring/extractSuperClass/anonymClass/after/TestSubclass.java b/java/java-tests/testData/refactoring/extractSuperClass/anonymClass/after/TestSubclass.java index ee185f31c1e9..c0cba01bc4f3 100644 --- a/java/java-tests/testData/refactoring/extractSuperClass/anonymClass/after/TestSubclass.java +++ b/java/java-tests/testData/refactoring/extractSuperClass/anonymClass/after/TestSubclass.java @@ -1,2 +1,2 @@ -public abstract class TestSubclass extends Runnable { +public abstract class TestSubclass implements Runnable { } \ No newline at end of file