do refactoring from conflicts view ( IDEA-52320 )

This commit is contained in:
anna
2010-04-28 13:15:23 +04:00
parent b7c185352d
commit ba07a224ba
28 changed files with 77 additions and 37 deletions
@@ -372,7 +372,7 @@ public class ChangeSignatureProcessor extends BaseRefactoringProcessor {
protected boolean preprocessUsages(Ref<UsageInfo[]> refUsages) {
MultiMap<PsiElement, String> conflictDescriptions = new MultiMap<PsiElement, String>();
UsageInfo[] usagesIn = refUsages.get();
final UsageInfo[] usagesIn = refUsages.get();
addMethodConflicts(conflictDescriptions);
RenameUtil.addConflictDescriptions(usagesIn, conflictDescriptions);
Set<UsageInfo> usagesSet = new HashSet<UsageInfo>(Arrays.asList(usagesIn));
@@ -387,7 +387,11 @@ public class ChangeSignatureProcessor extends BaseRefactoringProcessor {
}
if (myPrepareSuccessfulSwingThreadCallback != null && !conflictDescriptions.isEmpty()) {
ConflictsDialog dialog = new ConflictsDialog(myProject, conflictDescriptions);
ConflictsDialog dialog = new ConflictsDialog(myProject, conflictDescriptions, new Runnable(){
public void run() {
execute(usagesIn);
}
});
dialog.show();
if (!dialog.isOK()){
if (dialog.isShowConflicts()) prepareSuccessful();
@@ -172,7 +172,7 @@ public class ConvertToInstanceMethodProcessor extends BaseRefactoringProcessor {
LOG.error(e);
}
return showConflicts(conflicts);
return showConflicts(conflicts, usagesIn);
}
private void addInaccessibilityConflicts(final UsageInfo[] usages, final MultiMap<PsiElement, String> conflicts) throws IncorrectOperationException {
@@ -127,7 +127,7 @@ public class EncapsulateFieldsProcessor extends BaseRefactoringProcessor {
}
}
}
return showConflicts(conflicts);
return showConflicts(conflicts, refUsages.get());
}
private void checkExistingMethods(PsiMethod[] prototypes, MultiMap<PsiElement, String> conflicts, boolean isGetter) {
@@ -151,7 +151,7 @@ public class ExtractClassProcessor extends FixableUsagesRefactoringProcessor {
conflicts.putValue(field, "Field \'" + field.getName() + "\' needs getter");
}
}
return showConflicts(conflicts);
return showConflicts(conflicts, refUsages.get());
}
@@ -186,7 +186,7 @@ public class InheritanceToDelegationProcessor extends BaseRefactoringProcessor {
}
protected boolean preprocessUsages(Ref<UsageInfo[]> refUsages) {
UsageInfo[] usagesIn = refUsages.get();
final UsageInfo[] usagesIn = refUsages.get();
ArrayList<UsageInfo> oldUsages = new ArrayList<UsageInfo>();
addAll(oldUsages, usagesIn);
final ObjectUpcastedUsageInfo[] objectUpcastedUsageInfos = objectUpcastedUsages(usagesIn);
@@ -202,7 +202,11 @@ public class InheritanceToDelegationProcessor extends BaseRefactoringProcessor {
analyzeConflicts(usagesIn, conflicts);
if (!conflicts.isEmpty()) {
ConflictsDialog conflictsDialog =
new ConflictsDialog(myProject, conflicts);
new ConflictsDialog(myProject, conflicts, new Runnable() {
public void run() {
execute(usagesIn);
}
});
conflictsDialog.show();
if (!conflictsDialog.isOK()){
if (conflictsDialog.isShowConflicts()) prepareSuccessful();
@@ -228,7 +228,7 @@ class InlineConstantFieldProcessor extends BaseRefactoringProcessor {
}
}
return showConflicts(conflicts);
return showConflicts(conflicts, usagesIn);
}
private static boolean isAccessedForWriting (PsiExpression expr) {
@@ -141,7 +141,7 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor {
if (!myInlineThisOnly) {
if (!CommonRefactoringUtil.checkReadOnlyStatus(myProject, myMethod)) return false;
}
return showConflicts(conflicts);
return showConflicts(conflicts, usagesIn);
}
private void addInaccessibleSuperCallsConflicts(final UsageInfo[] usagesIn, final MultiMap<PsiElement, String> conflicts) {
@@ -205,7 +205,7 @@ public class InlineParameterExpressionProcessor extends BaseRefactoringProcessor
}
}
}
return showConflicts(conflicts);
return showConflicts(conflicts, usages);
}
private static boolean isAccessedForWriting (PsiExpression expr) {
@@ -128,7 +128,7 @@ public class InlineToAnonymousClassProcessor extends BaseRefactoringProcessor {
protected boolean preprocessUsages(final Ref<UsageInfo[]> refUsages) {
MultiMap<PsiElement, String> conflicts = getConflicts(refUsages.get());
if (!conflicts.isEmpty()) {
return showConflicts(conflicts);
return showConflicts(conflicts, refUsages.get());
}
return super.preprocessUsages(refUsages);
}
@@ -201,14 +201,14 @@ public class InlineSuperClassRefactoringProcessor extends FixableUsagesRefactori
conflicts.put(element, conflictsMap.get(element));
}
checkConflicts(refUsages, conflicts);
return showConflicts(conflicts);
return showConflicts(conflicts, refUsages.get());
}
protected void performRefactoring(final UsageInfo[] usages) {
new PushDownProcessor(mySuperClass.getProject(), myMemberInfos, mySuperClass, new DocCommentPolicy(DocCommentPolicy.ASIS)){
//push down conflicts are already collected
@Override
protected boolean showConflicts(MultiMap<PsiElement, String> conflicts) {
protected boolean showConflicts(MultiMap<PsiElement, String> conflicts, UsageInfo[] usages) {
return true;
}
}.run();
@@ -243,7 +243,7 @@ public class IntroduceParameterProcessor extends BaseRefactoringProcessor implem
processor.findConflicts(this, refUsages.get(), conflicts);
}
return showConflicts(conflicts);
return showConflicts(conflicts, usagesIn);
}
private void detectAccessibilityConflicts(final UsageInfo[] usageArray, MultiMap<PsiElement, String> conflicts) {
@@ -149,7 +149,7 @@ public class IntroduceParameterObjectProcessor extends FixableUsagesRefactoringP
}
}
}
return showConflicts(conflicts);
return showConflicts(conflicts, refUsages.get());
}
public void findUsages(@NotNull List<FixableUsageInfo> usages) {
@@ -70,12 +70,16 @@ public abstract class MakeMethodOrClassStaticProcessor<T extends PsiTypeParamete
return new MakeMethodOrClassStaticViewDescriptor(myMember);
}
protected final boolean preprocessUsages(Ref<UsageInfo[]> refUsages) {
protected final boolean preprocessUsages(final Ref<UsageInfo[]> refUsages) {
UsageInfo[] usagesIn = refUsages.get();
if (myPrepareSuccessfulSwingThreadCallback != null) {
MultiMap<PsiElement, String> conflicts = getConflictDescriptions(usagesIn);
if (conflicts.size() > 0) {
ConflictsDialog conflictsDialog = new ConflictsDialog(myProject, conflicts);
ConflictsDialog conflictsDialog = new ConflictsDialog(myProject, conflicts, new Runnable(){
public void run() {
execute(refUsages.get());
}
});
conflictsDialog.show();
if (!conflictsDialog.isOK()) {
if (conflictsDialog.isShowConflicts()) prepareSuccessful();
@@ -104,7 +104,7 @@ public class PushDownProcessor extends BaseRefactoringProcessor {
myCreateClassDlg = CreateSubclassAction.chooseSubclassToCreate(myClass);
if (myCreateClassDlg != null) {
pushDownConflicts.checkTargetClassConflicts(null, false, myCreateClassDlg.getTargetDirectory());
return showConflicts(pushDownConflicts.getConflicts());
return showConflicts(pushDownConflicts.getConflicts(), usagesIn);
} else {
return false;
}
@@ -118,7 +118,7 @@ public class PushDownProcessor extends BaseRefactoringProcessor {
}
}
return showConflicts(pushDownConflicts.getConflicts());
return showConflicts(pushDownConflicts.getConflicts(), usagesIn);
}
protected void refreshElements(PsiElement[] elements) {
@@ -149,7 +149,7 @@ public class PushDownProcessor extends BaseRefactoringProcessor {
removeFromTargetClass();
}
catch (IncorrectOperationException e) {
LOG.assertTrue(false);
LOG.error(e);
}
}
@@ -109,7 +109,8 @@ public class MoveClassToInnerProcessor extends BaseRefactoringProcessor {
}
protected boolean preprocessUsages(final Ref<UsageInfo[]> refUsages) {
return showConflicts(getConflicts(refUsages.get()));
final UsageInfo[] usages = refUsages.get();
return showConflicts(getConflicts(usages), usages);
}
protected void refreshElements(final PsiElement[] elements) {
@@ -204,7 +204,7 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor {
}
refUsages.set(filteredUsages.toArray(new UsageInfo[filteredUsages.size()]));
return showConflicts(conflicts);
return showConflicts(conflicts, usages);
}
private boolean isInsideMoved(PsiElement place) {
@@ -146,7 +146,7 @@ public class MoveDirectoryWithClassesProcessor extends BaseRefactoringProcessor
conflicts.putValue(psiFile, e.getMessage());
}
}
return showConflicts(conflicts);
return showConflicts(conflicts, refUsages.get());
}
@Override
@@ -403,7 +403,7 @@ public class MoveInnerProcessor extends BaseRefactoringProcessor {
// if (myInnerClass.hasModifierProperty(PsiModifier.)) {
myOuterClass.accept(new Visitor());
return showConflicts(conflicts);
return showConflicts(conflicts, refUsages.get());
}
private static boolean isInPackage(final PsiFile containingFile, PsiPackage aPackage) {
@@ -127,7 +127,7 @@ public class MoveInstanceMethodProcessor extends BaseRefactoringProcessor{
}
catch (IncorrectOperationException e) {}
return showConflicts(conflicts);
return showConflicts(conflicts, usages);
}
@NotNull
@@ -242,7 +242,7 @@ public class MoveMembersProcessor extends BaseRefactoringProcessor {
}
analyzeMoveConflicts(myMembersToMove, myTargetClass, myNewVisibility, conflicts);
RefactoringConflictsUtil.analyzeModuleConflicts(myProject, myMembersToMove, usages, myTargetClass, conflicts);
return showConflicts(conflicts);
return showConflicts(conflicts, usages);
}
private void addInaccessiblleConflicts(final MultiMap<PsiElement, String> conflicts, final UsageInfo[] usages) throws IncorrectOperationException {
@@ -84,7 +84,7 @@ public class RemoveMiddlemanProcessor extends FixableUsagesRefactoringProcessor
}
}
}
return showConflicts(conflicts);
return showConflicts(conflicts, refUsages.get());
}
private void processUsagesForMethod(final boolean deleteMethodHierarchy, PsiMethod method, int[] paramPermutation, String getterName, PsiMethod delegatedMethod,
@@ -285,7 +285,7 @@ public class ReplaceConstructorWithBuilderProcessor extends FixableUsagesRefacto
conflicts.putValue(null, "Found constructors are not reducible to simple chain");
}
return showConflicts(conflicts);
return showConflicts(conflicts, refUsages.get());
}
protected String getCommandName() {
@@ -172,7 +172,7 @@ public class ReplaceConstructorWithFactoryProcessor extends BaseRefactoringProce
}
return showConflicts(conflicts);
return showConflicts(conflicts, usages);
}
private PsiClass getConstructorContainingClass() {
@@ -228,7 +228,7 @@ public class WrapReturnValueProcessor extends FixableUsagesRefactoringProcessor
conflicts.putValue(existingClass, RefactorJBundle.message("there.already.exists.a.class.with.the.selected.name"));
}
}
return showConflicts(conflicts);
return showConflicts(conflicts, refUsages.get());
}
protected void performRefactoring(UsageInfo[] usageInfos) {
@@ -256,7 +256,7 @@ public abstract class BaseRefactoringProcessor {
return CommonRefactoringUtil.checkReadOnlyStatus(project, psiElements);
}
void execute(final UsageInfo[] usages) {
protected void execute(final UsageInfo[] usages) {
CommandProcessor.getInstance().executeCommand(myProject, new Runnable() {
public void run() {
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@@ -495,13 +495,22 @@ public abstract class BaseRefactoringProcessor {
}
}
protected boolean showConflicts(final MultiMap<PsiElement,String> conflicts) {
@Deprecated
protected boolean showConflicts(final MultiMap<PsiElement, String> conflicts) {
return showConflicts(conflicts, null);
}
protected boolean showConflicts(final MultiMap<PsiElement, String> conflicts, final UsageInfo[] usages) {
if (!conflicts.isEmpty() && ApplicationManager.getApplication().isUnitTestMode()) {
throw new ConflictsInTestsException(conflicts.values());
}
if (myPrepareSuccessfulSwingThreadCallback != null && !conflicts.isEmpty()) {
final ConflictsDialog conflictsDialog = new ConflictsDialog(myProject, conflicts);
final ConflictsDialog conflictsDialog = new ConflictsDialog(myProject, conflicts, usages == null ? null : new Runnable() {
public void run() {
execute(usages);
}
});
conflictsDialog.show();
if (!conflictsDialog.isOK()) {
if (conflictsDialog.isShowConflicts()) prepareSuccessful();
@@ -115,7 +115,7 @@ public class RenameProcessor extends BaseRefactoringProcessor {
return RenamePsiElementProcessor.forElement(myPrimaryElement).getHelpID(myPrimaryElement);
}
public boolean preprocessUsages(Ref<UsageInfo[]> refUsages) {
public boolean preprocessUsages(final Ref<UsageInfo[]> refUsages) {
UsageInfo[] usagesIn = refUsages.get();
MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
@@ -125,7 +125,11 @@ public class RenameProcessor extends BaseRefactoringProcessor {
if (ApplicationManager.getApplication().isUnitTestMode()) {
throw new ConflictsInTestsException(conflicts.values());
}
ConflictsDialog conflictsDialog = new ConflictsDialog(myProject, conflicts);
ConflictsDialog conflictsDialog = new ConflictsDialog(myProject, conflicts, new Runnable() {
public void run() {
execute(refUsages.get());
}
});
conflictsDialog.show();
if (!conflictsDialog.isOK()) {
if (conflictsDialog.isShowConflicts()) prepareSuccessful();
@@ -50,10 +50,18 @@ public class ConflictsDialog extends DialogWrapper{
private String[] myConflictDescriptions;
private MultiMap<PsiElement, String> myElementConflictDescription;
private final Project myProject;
private Runnable myDoRefactoringRunnable;
public ConflictsDialog(Project project, MultiMap<PsiElement, String> conflictDescriptions) {
this(project, conflictDescriptions, null);
}
public ConflictsDialog(Project project,
MultiMap<PsiElement, String> conflictDescriptions,
Runnable doRefactoringRunnable) {
super(project, true);
myProject = project;
myDoRefactoringRunnable = doRefactoringRunnable;
final LinkedHashSet<String> conflicts = new LinkedHashSet<String>();
for (String conflict : conflictDescriptions.values()) {
@@ -141,6 +149,7 @@ public class ConflictsDialog extends DialogWrapper{
presentation.setCodeUsagesString(codeUsagesString);
presentation.setTabName(codeUsagesString);
presentation.setTabText(codeUsagesString);
presentation.setShowCancelButton(true);
final Usage[] usages = new Usage[myElementConflictDescription.size()];
int i = 0;
@@ -176,7 +185,12 @@ public class ConflictsDialog extends DialogWrapper{
}
};
}
UsageViewManager.getInstance(myProject).showUsages(UsageTarget.EMPTY_ARRAY, usages, presentation);
final UsageView usageView = UsageViewManager.getInstance(myProject).showUsages(UsageTarget.EMPTY_ARRAY, usages, presentation);
if (myDoRefactoringRunnable != null) {
usageView.addPerformOperationAction(
myDoRefactoringRunnable,
RefactoringBundle.message("retry.command"), "Unable to perform refactoring. There were changes in code after the usages have been found.", RefactoringBundle.message("usageView.doAction"));
}
close(SHOW_CONFLICTS_EXIT_CODE);
}
@@ -78,7 +78,7 @@ public class MoveGroovyScriptProcessor extends MoveClassesOrPackagesProcessor {
@Override
protected boolean preprocessUsages(Ref<UsageInfo[]> refUsages) {
return showConflicts(new MultiMap<PsiElement, String>());
return showConflicts(new MultiMap<PsiElement, String>(), refUsages.get());
}
@Override