mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
move package: check if it contains dirs in libs and suggest to move dirs in project only (IDEA-63657)
This commit is contained in:
+111
-42
@@ -15,6 +15,7 @@
|
||||
*/
|
||||
package com.intellij.refactoring.move.moveClassesOrPackages;
|
||||
|
||||
import com.intellij.CommonBundle;
|
||||
import com.intellij.codeInsight.daemon.impl.CollectHighlightsUtil;
|
||||
import com.intellij.openapi.actionSystem.DataContext;
|
||||
import com.intellij.openapi.actionSystem.LangDataKeys;
|
||||
@@ -23,8 +24,10 @@ import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.module.ModuleUtil;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.roots.ProjectFileIndex;
|
||||
import com.intellij.openapi.roots.ProjectRootManager;
|
||||
import com.intellij.openapi.ui.DialogWrapper;
|
||||
import com.intellij.openapi.ui.Messages;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.impl.file.JavaDirectoryServiceImpl;
|
||||
@@ -105,9 +108,14 @@ public class MoveClassesOrPackagesHandlerBase extends MoveHandlerDelegate {
|
||||
}
|
||||
|
||||
public void doMove(final Project project, final PsiElement[] elements, final PsiElement targetContainer, final MoveCallback callback) {
|
||||
final PsiDirectory[] directories = new PsiDirectory[elements.length];
|
||||
System.arraycopy(elements, 0, directories, 0, directories.length);
|
||||
final String prompt = getPromptToMoveDirectoryLibrariesSafe(elements);
|
||||
if (prompt != null) {
|
||||
moveDirectoriesLibrariesSafe(project, targetContainer, callback, directories, prompt);
|
||||
return;
|
||||
}
|
||||
if (canMoveOrRearrangePackages(elements) ) {
|
||||
final PsiDirectory[] directories = new PsiDirectory[elements.length];
|
||||
System.arraycopy(elements, 0, directories, 0, directories.length);
|
||||
SelectMoveOrRearrangePackageDialog dialog = new SelectMoveOrRearrangePackageDialog(project, directories, targetContainer == null);
|
||||
dialog.show();
|
||||
if (!dialog.isOK()) return;
|
||||
@@ -118,46 +126,7 @@ public class MoveClassesOrPackagesHandlerBase extends MoveHandlerDelegate {
|
||||
}
|
||||
|
||||
if (dialog.isMoveDirectory()) {
|
||||
if (targetContainer instanceof PsiDirectory) {
|
||||
final JavaRefactoringSettings refactoringSettings = JavaRefactoringSettings.getInstance();
|
||||
final MoveDirectoryWithClassesProcessor processor =
|
||||
new MoveDirectoryWithClassesProcessor(project, directories, (PsiDirectory)targetContainer,
|
||||
refactoringSettings.RENAME_SEARCH_IN_COMMENTS_FOR_PACKAGE,
|
||||
refactoringSettings.RENAME_SEARCH_IN_COMMENTS_FOR_PACKAGE, true, callback);
|
||||
processor.setPrepareSuccessfulSwingThreadCallback(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
}
|
||||
});
|
||||
processor.run();
|
||||
}
|
||||
else {
|
||||
final boolean containsJava = hasJavaFiles(directories[0]);
|
||||
if (!containsJava) {
|
||||
MoveFilesOrDirectoriesUtil.doMove(project, new PsiElement[] {directories[0]}, new PsiElement[]{targetContainer}, callback);
|
||||
return;
|
||||
}
|
||||
final MoveClassesOrPackagesToNewDirectoryDialog dlg =
|
||||
new MoveClassesOrPackagesToNewDirectoryDialog(directories[0], new PsiElement[0], false, callback) {
|
||||
@Override
|
||||
protected void performRefactoring(Project project,
|
||||
final PsiDirectory targetDirectory,
|
||||
PsiPackage aPackage,
|
||||
boolean searchInComments,
|
||||
boolean searchForTextOccurences) {
|
||||
final MoveDirectoryWithClassesProcessor processor =
|
||||
new MoveDirectoryWithClassesProcessor(project, directories, targetDirectory, searchInComments, searchForTextOccurences,
|
||||
true, callback);
|
||||
processor.setPrepareSuccessfulSwingThreadCallback(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
}
|
||||
});
|
||||
processor.run();
|
||||
}
|
||||
};
|
||||
dlg.show();
|
||||
}
|
||||
moveAsDirectory(project, targetContainer, callback, directories);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -167,6 +136,81 @@ public class MoveClassesOrPackagesHandlerBase extends MoveHandlerDelegate {
|
||||
MoveClassesOrPackagesImpl.doMove(project, elements, targetContainer, callback);
|
||||
}
|
||||
|
||||
private static void moveDirectoriesLibrariesSafe(Project project,
|
||||
PsiElement targetContainer,
|
||||
MoveCallback callback,
|
||||
PsiDirectory[] directories,
|
||||
String prompt) {
|
||||
final PsiPackage aPackage = JavaDirectoryService.getInstance().getPackage(directories[0]);
|
||||
LOG.assertTrue(aPackage != null);
|
||||
final PsiDirectory[] projectDirectories = aPackage.getDirectories(GlobalSearchScope.projectScope(project));
|
||||
if (projectDirectories.length > 1) {
|
||||
int ret = Messages
|
||||
.showDialog(project, prompt + " or all directories in project?", RefactoringBundle.message("warning.title"),
|
||||
new String[]{
|
||||
RefactoringBundle.message("move.current.directory"),
|
||||
RefactoringBundle.message("move.directories"),
|
||||
CommonBundle.getCancelButtonText()}, 0, Messages.getWarningIcon());
|
||||
if (ret == 0) {
|
||||
moveAsDirectory(project, targetContainer, callback, directories);
|
||||
}
|
||||
else if (ret == 1) {
|
||||
moveAsDirectory(project, targetContainer, callback, projectDirectories);
|
||||
}
|
||||
}
|
||||
else if (Messages.showDialog(project, prompt + "?", RefactoringBundle.message("warning.title"),
|
||||
new String[]{CommonBundle.getOkButtonText(), CommonBundle.getCancelButtonText()}, 0,
|
||||
Messages.getWarningIcon()) == DialogWrapper.OK_EXIT_CODE) {
|
||||
moveAsDirectory(project, targetContainer, callback, directories);
|
||||
}
|
||||
}
|
||||
|
||||
private static void moveAsDirectory(Project project,
|
||||
PsiElement targetContainer,
|
||||
final MoveCallback callback,
|
||||
final PsiDirectory[] directories) {
|
||||
if (targetContainer instanceof PsiDirectory) {
|
||||
final JavaRefactoringSettings refactoringSettings = JavaRefactoringSettings.getInstance();
|
||||
final MoveDirectoryWithClassesProcessor processor =
|
||||
new MoveDirectoryWithClassesProcessor(project, directories, (PsiDirectory)targetContainer,
|
||||
refactoringSettings.RENAME_SEARCH_IN_COMMENTS_FOR_PACKAGE,
|
||||
refactoringSettings.RENAME_SEARCH_IN_COMMENTS_FOR_PACKAGE, true, callback);
|
||||
processor.setPrepareSuccessfulSwingThreadCallback(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
}
|
||||
});
|
||||
processor.run();
|
||||
}
|
||||
else {
|
||||
final boolean containsJava = hasJavaFiles(directories[0]);
|
||||
if (!containsJava) {
|
||||
MoveFilesOrDirectoriesUtil.doMove(project, new PsiElement[]{directories[0]}, new PsiElement[]{targetContainer}, callback);
|
||||
return;
|
||||
}
|
||||
final MoveClassesOrPackagesToNewDirectoryDialog dlg =
|
||||
new MoveClassesOrPackagesToNewDirectoryDialog(directories[0], new PsiElement[0], false, callback) {
|
||||
@Override
|
||||
protected void performRefactoring(Project project,
|
||||
final PsiDirectory targetDirectory,
|
||||
PsiPackage aPackage,
|
||||
boolean searchInComments,
|
||||
boolean searchForTextOccurences) {
|
||||
final MoveDirectoryWithClassesProcessor processor =
|
||||
new MoveDirectoryWithClassesProcessor(project, directories, targetDirectory, searchInComments, searchForTextOccurences,
|
||||
true, callback);
|
||||
processor.setPrepareSuccessfulSwingThreadCallback(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
}
|
||||
});
|
||||
processor.run();
|
||||
}
|
||||
};
|
||||
dlg.show();
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean hasJavaFiles(PsiDirectory directory) {
|
||||
final boolean [] containsJava = new boolean[]{false};
|
||||
directory.accept(new JavaRecursiveElementWalkingVisitor() {
|
||||
@@ -220,6 +264,31 @@ public class MoveClassesOrPackagesHandlerBase extends MoveHandlerDelegate {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static String getPromptToMoveDirectoryLibrariesSafe(PsiElement[] elements) {
|
||||
if (elements.length == 0 || elements.length > 1) return null;
|
||||
final Project project = elements[0].getProject();
|
||||
final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex();
|
||||
if (!(elements[0] instanceof PsiDirectory)) return null;
|
||||
final PsiDirectory directory = ((PsiDirectory)elements[0]);
|
||||
if (RefactoringUtil.isSourceRoot(directory)) {
|
||||
return null;
|
||||
}
|
||||
final PsiPackage aPackage = JavaDirectoryService.getInstance().getPackage(directory);
|
||||
if (aPackage == null) return null;
|
||||
if ("".equals(aPackage.getQualifiedName())) return null;
|
||||
final PsiDirectory[] directories = aPackage.getDirectories();
|
||||
|
||||
boolean inLib = false;
|
||||
for (PsiDirectory psiDirectory : directories) {
|
||||
inLib |= !fileIndex.isInContent(psiDirectory.getVirtualFile());
|
||||
}
|
||||
|
||||
return inLib ? "Package \'" +
|
||||
aPackage.getName() +
|
||||
"\' contains directories in libraries which cannot be moved. Do you want to move current directory" : null;
|
||||
}
|
||||
|
||||
private static boolean canMoveOrRearrangePackages(PsiElement[] elements) {
|
||||
if (elements.length == 0) return false;
|
||||
final Project project = elements[0].getProject();
|
||||
|
||||
@@ -225,6 +225,8 @@ rename.package.button.text=Rename &package
|
||||
rename.directory.button.text=Rename &directory
|
||||
rename.directories= Rename &all
|
||||
rename.current.directory= Rename ¤t
|
||||
move.current.directory= Move ¤t
|
||||
move.directories= Move &all
|
||||
warning.title=Warning
|
||||
replace.constructor.with.factory.method.title=Replace Constructor With Factory Method
|
||||
class.does.not.have.implicit.default.consructor=Class {0} does not have implicit default consructor.
|
||||
|
||||
Reference in New Issue
Block a user