mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
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:
+33
-37
@@ -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
|
||||
|
||||
+1
-1
@@ -2,6 +2,6 @@ class Test {
|
||||
private final String field;
|
||||
|
||||
Test(){
|
||||
field = "text";
|
||||
this.field = "text";
|
||||
}
|
||||
}
|
||||
+20
-21
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user