From d74f07e07cacb1521a58cedd03c935f155d25dc5 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 1 Jun 2016 15:22:47 +0300 Subject: [PATCH] extract superclass: hide implements base type from chooser for anonymous classes; fixed implements/extends list in the generated superclass --- .../extractSuperclass/ExtractSuperClassUtil.java | 12 ++++++++++-- .../extractSuperclass/ExtractSuperclassHandler.java | 8 +++++++- .../anonymClass/after/TestSubclass.java | 2 +- 3 files changed, 18 insertions(+), 4 deletions(-) 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