From 4c730104a876c9e02679f1ce96e7c7a7e2d2c06f Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 25 May 2012 14:14:53 +0400 Subject: [PATCH] inline superclass: correct super references in extends/implements lists without pushdown (IDEA-86639) --- .../InlineSuperClassRefactoringProcessor.java | 29 ++----------------- .../ReplaceExtendsListUsageInfo.java | 10 +++---- .../after/Super.java | 2 ++ .../after/Test.java | 2 ++ .../before/Super.java | 4 +++ .../before/Test.java | 2 ++ .../refactoring/InlineSuperClassTest.java | 4 +++ 7 files changed, 22 insertions(+), 31 deletions(-) create mode 100644 java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/after/Super.java create mode 100644 java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/after/Test.java create mode 100644 java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/before/Super.java create mode 100644 java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/before/Test.java diff --git a/java/java-impl/src/com/intellij/refactoring/inlineSuperClass/InlineSuperClassRefactoringProcessor.java b/java/java-impl/src/com/intellij/refactoring/inlineSuperClass/InlineSuperClassRefactoringProcessor.java index 3856c20bb935..c98e6b8da9d4 100644 --- a/java/java-impl/src/com/intellij/refactoring/inlineSuperClass/InlineSuperClassRefactoringProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inlineSuperClass/InlineSuperClassRefactoringProcessor.java @@ -40,11 +40,11 @@ import com.intellij.refactoring.util.classMembers.MemberInfoStorage; import com.intellij.usageView.UsageInfo; import com.intellij.usageView.UsageViewDescriptor; import com.intellij.util.IncorrectOperationException; -import com.intellij.util.Processor;import com.intellij.util.containers.HashMap; +import com.intellij.util.Processor; +import com.intellij.util.containers.HashMap; import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -63,39 +63,16 @@ public class InlineSuperClassRefactoringProcessor extends FixableUsagesRefactori myTargetClasses = targetClasses; MemberInfoStorage memberInfoStorage = new MemberInfoStorage(mySuperClass, new MemberInfo.Filter() { public boolean includeMember(PsiMember element) { - return true; + return !(element instanceof PsiClass) || PsiTreeUtil.isAncestor(mySuperClass, element, true); } }); List members = memberInfoStorage.getClassMemberInfos(mySuperClass); for (MemberInfo member : members) { member.setChecked(true); } - members = appendSuperRefs(members); myMemberInfos = members.toArray(new MemberInfo[members.size()]); } - private List appendSuperRefs(List members) { - if (!mySuperClass.isInterface()) { - PsiReferenceList extendsList = mySuperClass.getExtendsList(); - if (extendsList != null && extendsList.getReferenceElements().length > 0) { - PsiElement resolve = extendsList.getReferenceElements()[0].resolve(); - if (resolve instanceof PsiClass) { - members = new ArrayList(members); - - MemberInfo memberInfo = new MemberInfo((PsiMember)resolve, true, extendsList) { - { - overrides = false; - } - }; - - memberInfo.setChecked(true); - members.add(memberInfo); - } - } - } - return members; - } - @NotNull protected UsageViewDescriptor createUsageViewDescriptor(final UsageInfo[] usages) { return new InlineSuperClassUsageViewDescriptor(mySuperClass); diff --git a/java/java-impl/src/com/intellij/refactoring/inlineSuperClass/usageInfo/ReplaceExtendsListUsageInfo.java b/java/java-impl/src/com/intellij/refactoring/inlineSuperClass/usageInfo/ReplaceExtendsListUsageInfo.java index 686950aaba32..f9d28ac491b7 100644 --- a/java/java-impl/src/com/intellij/refactoring/inlineSuperClass/usageInfo/ReplaceExtendsListUsageInfo.java +++ b/java/java-impl/src/com/intellij/refactoring/inlineSuperClass/usageInfo/ReplaceExtendsListUsageInfo.java @@ -21,22 +21,22 @@ package com.intellij.refactoring.inlineSuperClass.usageInfo; import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiElement; import com.intellij.psi.PsiJavaCodeReferenceElement; +import com.intellij.refactoring.safeDelete.usageInfo.SafeDeleteExtendsClassUsageInfo; import com.intellij.refactoring.util.FixableUsageInfo; import com.intellij.util.IncorrectOperationException; public class ReplaceExtendsListUsageInfo extends FixableUsageInfo { + private final SafeDeleteExtendsClassUsageInfo mySafeDeleteUsageInfo; public ReplaceExtendsListUsageInfo(PsiJavaCodeReferenceElement element, final PsiClass superClass, final PsiClass targetClass) { super(element); - + mySafeDeleteUsageInfo = new SafeDeleteExtendsClassUsageInfo(element, superClass, targetClass); } public void fixUsage() throws IncorrectOperationException { - final PsiElement element = getElement(); - if (element != null) { - element.delete(); + if (mySafeDeleteUsageInfo.isSafeDelete()) { + mySafeDeleteUsageInfo.deleteElement(); } } } diff --git a/java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/after/Super.java b/java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/after/Super.java new file mode 100644 index 000000000000..f0c2064481b6 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/after/Super.java @@ -0,0 +1,2 @@ +interface Int { +} diff --git a/java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/after/Test.java b/java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/after/Test.java new file mode 100644 index 000000000000..32dd1902afa5 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/after/Test.java @@ -0,0 +1,2 @@ +interface Test extends Int { +} diff --git a/java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/before/Super.java b/java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/before/Super.java new file mode 100644 index 000000000000..35f223875043 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/before/Super.java @@ -0,0 +1,4 @@ +interface Super extends Int { +} +interface Int { +} diff --git a/java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/before/Test.java b/java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/before/Test.java new file mode 100644 index 000000000000..2eeeb5d5fe8a --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/before/Test.java @@ -0,0 +1,2 @@ +interface Test extends Super{ +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/InlineSuperClassTest.java b/java/java-tests/testSrc/com/intellij/refactoring/InlineSuperClassTest.java index 3370d5863e06..fb7d2a75a9a7 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/InlineSuperClassTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/InlineSuperClassTest.java @@ -173,6 +173,10 @@ public class InlineSuperClassTest extends MultiFileTestCase { doTest(); } + public void testInterfaceHierarchyWithSubstitution() throws Exception { + doTest(); + } + private void doTestMultipleSubclasses() throws Exception { doTest(new PerformAction() { @Override