From db30803beedd98f301b605607a28659301f04aee Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 3 Mar 2016 18:24:43 +0100 Subject: [PATCH] inline superclass: don't start push refactoring (with find usages, etc) inside inline; don't collect usages in all inheritors when at the end only one would be processed (IDEA-152480) --- .../InlineSuperClassRefactoringProcessor.java | 70 +++++++++---------- .../after/Test.java | 2 +- .../AbstractPushDownProcessor.java | 41 ++++++----- 3 files changed, 54 insertions(+), 59 deletions(-) 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 0eff2c9ecd4e..1c9de953f11f 100644 --- a/java/java-impl/src/com/intellij/refactoring/inlineSuperClass/InlineSuperClassRefactoringProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inlineSuperClass/InlineSuperClassRefactoringProcessor.java @@ -42,8 +42,10 @@ import com.intellij.refactoring.util.classMembers.MemberInfoStorage; import com.intellij.usageView.UsageInfo; import com.intellij.usageView.UsageViewDescriptor; import com.intellij.util.ArrayUtilRt; +import com.intellij.util.Function; import com.intellij.util.IncorrectOperationException; import com.intellij.util.Processor; +import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.HashMap; import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; @@ -275,50 +277,44 @@ public class InlineSuperClassRefactoringProcessor extends FixableUsagesRefactori } protected void performRefactoring(@NotNull final UsageInfo[] usages) { - final DocCommentPolicy docPolicy = new DocCommentPolicy(myPolicy); - new PushDownProcessor(mySuperClass, myMemberInfos, docPolicy) { - //push down conflicts are already collected - @Override - protected boolean showConflicts(@NotNull MultiMap conflicts, UsageInfo[] usages) { - return true; - } + try { + final UsageInfo[] infos = ContainerUtil.map2Array(myTargetClasses, UsageInfo.class, new Function() { + @Override + public UsageInfo fun(PsiClass psiClass) { + return new UsageInfo(psiClass); + } + }); + new PushDownProcessor(mySuperClass, myMemberInfos, new DocCommentPolicy(myPolicy)).pushDownToClasses(infos); - @Override - protected void performRefactoring(@NotNull UsageInfo[] pushDownUsages) { - if (myCurrentInheritor != null) { - pushDownToDedicatedClass(myCurrentInheritor); - } else { - super.performRefactoring(pushDownUsages); - } - CommonRefactoringUtil.sortDepthFirstRightLeftOrder(usages); - for (UsageInfo usageInfo : usages) { - if (!(usageInfo instanceof ReplaceExtendsListUsageInfo || usageInfo instanceof RemoveImportUsageInfo)) { - try { - ((FixableUsageInfo)usageInfo).fixUsage(); - } - catch (IncorrectOperationException e) { - LOG.info(e); - } - } - } - replaceInnerTypeUsages(); - - //postpone broken hierarchy - for (UsageInfo usage : usages) { - if (usage instanceof ReplaceExtendsListUsageInfo || usage instanceof RemoveImportUsageInfo) { - ((FixableUsageInfo)usage).fixUsage(); - } - } - if (myCurrentInheritor == null) { + CommonRefactoringUtil.sortDepthFirstRightLeftOrder(usages); + for (UsageInfo usageInfo : usages) { + if (!(usageInfo instanceof ReplaceExtendsListUsageInfo || usageInfo instanceof RemoveImportUsageInfo)) { try { - mySuperClass.delete(); + ((FixableUsageInfo)usageInfo).fixUsage(); } catch (IncorrectOperationException e) { - LOG.error(e); + LOG.info(e); } } } - }.run(); + + replaceInnerTypeUsages(); + + //postpone broken hierarchy + for (UsageInfo usage : usages) { + if (usage instanceof ReplaceExtendsListUsageInfo || usage instanceof RemoveImportUsageInfo) { + ((FixableUsageInfo)usage).fixUsage(); + } + } + + //delete the class if all refs replaced + if (myCurrentInheritor == null) { + mySuperClass.delete(); + } + } + catch (IncorrectOperationException e) { + LOG.error(e); + } } @Nullable diff --git a/java/java-tests/testData/refactoring/inlineSuperClass/superConstructorWithFieldInitialization/after/Test.java b/java/java-tests/testData/refactoring/inlineSuperClass/superConstructorWithFieldInitialization/after/Test.java index f95077f47cb6..a9952f3f94a8 100644 --- a/java/java-tests/testData/refactoring/inlineSuperClass/superConstructorWithFieldInitialization/after/Test.java +++ b/java/java-tests/testData/refactoring/inlineSuperClass/superConstructorWithFieldInitialization/after/Test.java @@ -2,6 +2,6 @@ class Test { private final String field; Test(){ - field = "text"; + this.field = "text"; } } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/refactoring/memberPushDown/AbstractPushDownProcessor.java b/platform/lang-impl/src/com/intellij/refactoring/memberPushDown/AbstractPushDownProcessor.java index f874021df7b9..43ad20993dca 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/memberPushDown/AbstractPushDownProcessor.java +++ b/platform/lang-impl/src/com/intellij/refactoring/memberPushDown/AbstractPushDownProcessor.java @@ -159,25 +159,7 @@ public abstract class AbstractPushDownProcessor extends BaseRefactoringProcessor @Override protected void performRefactoring(@NotNull UsageInfo[] usages) { try { - myDelegate.prepareToPush(myPushDownData); - final PsiElement sourceClass = myPushDownData.getSourceClass(); - if (mySubClassData != null) { - final PsiElement subClass = myDelegate.createSubClass(sourceClass, mySubClassData); - if (subClass != null) { - myDelegate.pushDownToClass(subClass, myPushDownData); - } - } - else { - for (UsageInfo usage : usages) { - final PsiElement element = usage.getElement(); - if (element != null) { - final PushDownDelegate targetDelegate = PushDownDelegate.findDelegateForTarget(sourceClass, element); - if (targetDelegate != null) { - targetDelegate.pushDownToClass(element, myPushDownData); - } - } - } - } + pushDownToClasses(usages); myDelegate.removeFromSourceClass(myPushDownData); } catch (IncorrectOperationException e) { @@ -185,8 +167,25 @@ public abstract class AbstractPushDownProcessor extends BaseRefactoringProcessor } } - protected void pushDownToDedicatedClass(PsiElement currentInheritor) { + public void pushDownToClasses(@NotNull UsageInfo[] usages) { myDelegate.prepareToPush(myPushDownData); - myDelegate.pushDownToClass(currentInheritor, myPushDownData); + final PsiElement sourceClass = myPushDownData.getSourceClass(); + if (mySubClassData != null) { + final PsiElement subClass = myDelegate.createSubClass(sourceClass, mySubClassData); + if (subClass != null) { + myDelegate.pushDownToClass(subClass, myPushDownData); + } + } + else { + for (UsageInfo usage : usages) { + final PsiElement element = usage.getElement(); + if (element != null) { + final PushDownDelegate targetDelegate = PushDownDelegate.findDelegateForTarget(sourceClass, element); + if (targetDelegate != null) { + targetDelegate.pushDownToClass(element, myPushDownData); + } + } + } + } } }