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)

This commit is contained in:
Anna Kozlova
2016-03-03 18:54:30 +01:00
parent 20a8fcc015
commit db30803bee
3 changed files with 54 additions and 59 deletions
@@ -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<PsiElement, String> conflicts, UsageInfo[] usages) {
return true;
}
try {
final UsageInfo[] infos = ContainerUtil.map2Array(myTargetClasses, UsageInfo.class, new Function<PsiClass, UsageInfo>() {
@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
@@ -2,6 +2,6 @@ class Test {
private final String field;
Test(){
field = "text";
this.field = "text";
}
}
@@ -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);
}
}
}
}
}
}