From c805dc4cdbe956ca8748a7013b31ee29b08660b2 Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 18 Apr 2012 12:06:44 +0200 Subject: [PATCH] check module conflicts if move directory (IDEA-62765) --- .../JavaMoveDirectoryWithClassesHelper.java | 11 ++++++++ .../MoveClassesOrPackagesImpl.java | 27 +++++++++++++------ .../util/RefactoringConflictsUtil.java | 2 +- .../MoveDirectoryWithClassesHelper.java | 8 ++++++ .../MoveDirectoryWithClassesProcessor.java | 3 +++ 5 files changed, 42 insertions(+), 9 deletions(-) diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/JavaMoveDirectoryWithClassesHelper.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/JavaMoveDirectoryWithClassesHelper.java index ca4a899167a0..7e3838ac891d 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/JavaMoveDirectoryWithClassesHelper.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/JavaMoveDirectoryWithClassesHelper.java @@ -6,8 +6,10 @@ import com.intellij.psi.*; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.listeners.RefactoringElementListener; +import com.intellij.refactoring.util.RefactoringConflictsUtil; import com.intellij.usageView.UsageInfo; import com.intellij.util.Function; +import com.intellij.util.containers.MultiMap; import java.util.*; @@ -99,6 +101,15 @@ public class JavaMoveDirectoryWithClassesHelper extends MoveDirectoryWithClasses } } + @Override + public void preprocessUsages(Project project, + Set files, + UsageInfo[] infos, + PsiDirectory directory, + MultiMap conflicts) { + RefactoringConflictsUtil.analyzeModuleConflicts(project, files, infos, directory, conflicts); + } + @Override public void beforeMove(PsiFile psiFile) { ChangeContextUtil.encodeContextInfo(psiFile, true); diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesImpl.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesImpl.java index 47c4b9a8fb48..f732c2284200 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesImpl.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesImpl.java @@ -33,18 +33,15 @@ import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Ref; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; -import com.intellij.refactoring.HelpID; -import com.intellij.refactoring.JavaRefactoringSettings; -import com.intellij.refactoring.PackageWrapper; -import com.intellij.refactoring.RefactoringBundle; +import com.intellij.refactoring.*; import com.intellij.refactoring.move.MoveCallback; import com.intellij.refactoring.rename.DirectoryAsPackageRenameHandlerBase; import com.intellij.refactoring.rename.RenameUtil; -import com.intellij.refactoring.util.CommonRefactoringUtil; -import com.intellij.refactoring.util.RefactoringUIUtil; -import com.intellij.refactoring.util.RefactoringUtil; -import com.intellij.refactoring.util.TextOccurrencesUtil; +import com.intellij.refactoring.ui.ConflictsDialog; +import com.intellij.refactoring.util.*; +import com.intellij.usageView.UsageInfo; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; @@ -326,6 +323,20 @@ public class MoveClassesOrPackagesImpl { if (!chooser.isOK()) return; final PsiDirectory selectedTarget = chooser.getSelectedDirectory(); if (selectedTarget == null) return; + final MultiMap conflicts = new MultiMap(); + RefactoringConflictsUtil.analyzeModuleConflicts(project, Arrays.asList(directories), UsageInfo.EMPTY_ARRAY, selectedTarget, conflicts); + if (!conflicts.isEmpty()) { + if (ApplicationManager.getApplication().isUnitTestMode()) { + throw new BaseRefactoringProcessor.ConflictsInTestsException(conflicts.values()); + } + else { + final ConflictsDialog conflictsDialog = new ConflictsDialog(project, conflicts); + conflictsDialog.show(); + if (!conflictsDialog.isOK()) { + return; + } + } + } final Ref ex = Ref.create(null); final String commandDescription = RefactoringBundle.message("moving.directories.command"); Runnable runnable = new Runnable() { diff --git a/java/java-impl/src/com/intellij/refactoring/util/RefactoringConflictsUtil.java b/java/java-impl/src/com/intellij/refactoring/util/RefactoringConflictsUtil.java index d5f6b4414ff3..9c2fb9458b3d 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/RefactoringConflictsUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/RefactoringConflictsUtil.java @@ -227,7 +227,7 @@ public class RefactoringConflictsUtil { final MultiMap conflicts) { if (scopes == null) return; for (final PsiElement scope : scopes) { - if (scope instanceof PsiPackage || scope instanceof PsiDirectory) return; + if (scope instanceof PsiPackage) return; } final Module targetModule = ModuleUtil.findModuleForFile(vFile, project); diff --git a/platform/lang-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveDirectoryWithClassesHelper.java b/platform/lang-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveDirectoryWithClassesHelper.java index 77401394a326..e68ffd487575 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveDirectoryWithClassesHelper.java +++ b/platform/lang-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveDirectoryWithClassesHelper.java @@ -11,12 +11,14 @@ import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFileHandler; import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFilesOrDirectoriesUtil; import com.intellij.usageView.UsageInfo; import com.intellij.util.Function; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Set; /** * @author ksafonov @@ -40,6 +42,12 @@ public abstract class MoveDirectoryWithClassesHelper { public abstract void afterMove(PsiElement newElement); + public void preprocessUsages(Project project, + Set files, + UsageInfo[] infos, + PsiDirectory directory, + MultiMap conflicts) {} + public static MoveDirectoryWithClassesHelper[] findAll() { return Extensions.getExtensions(EP_NAME); } diff --git a/platform/lang-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveDirectoryWithClassesProcessor.java b/platform/lang-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveDirectoryWithClassesProcessor.java index 697be80c58dd..017c41d38b40 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveDirectoryWithClassesProcessor.java +++ b/platform/lang-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveDirectoryWithClassesProcessor.java @@ -123,6 +123,9 @@ public class MoveDirectoryWithClassesProcessor extends BaseRefactoringProcessor conflicts.putValue(psiFile, e.getMessage()); } } + for (MoveDirectoryWithClassesHelper helper : MoveDirectoryWithClassesHelper.findAll()) { + helper.preprocessUsages(myProject, myFilesToMove.keySet(), refUsages.get(), myTargetDirectory, conflicts); + } return showConflicts(conflicts, refUsages.get()); }