From aa9a7b18bcc3b098fd69ce49560b4f775887c2e7 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 5 Jun 2014 12:30:23 +0400 Subject: [PATCH] move: filter out nested dirs/files on actionPerformed, update should be fast (IDEA-111413) --- .../JavaMoveFilesOrDirectoriesHandler.java | 19 ++++++++++--------- .../MoveFilesOrDirectoriesHandler.java | 17 +++++++++++------ 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/JavaMoveFilesOrDirectoriesHandler.java b/java/java-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/JavaMoveFilesOrDirectoriesHandler.java index 0b92f9983262..ec99cfe9cea5 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/JavaMoveFilesOrDirectoriesHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/JavaMoveFilesOrDirectoriesHandler.java @@ -36,14 +36,6 @@ import org.jetbrains.annotations.Nullable; import java.util.*; public class JavaMoveFilesOrDirectoriesHandler extends MoveFilesOrDirectoriesHandler { - @Override - public boolean canMove(PsiElement[] elements, PsiElement targetContainer) { - final PsiElement[] srcElements = adjustForMove(null, elements, targetContainer); - assert srcElements != null; - - return super.canMove(srcElements, targetContainer); - } - @Override public PsiElement adjustTargetForMove(DataContext dataContext, PsiElement targetContainer) { if (targetContainer instanceof PsiPackage) { @@ -60,6 +52,11 @@ public class JavaMoveFilesOrDirectoriesHandler extends MoveFilesOrDirectoriesHan @Override public PsiElement[] adjustForMove(Project project, PsiElement[] sourceElements, PsiElement targetElement) { + sourceElements = super.adjustForMove(project, sourceElements, targetElement); + if (sourceElements == null) { + return null; + } + Set result = new LinkedHashSet(); for (PsiElement sourceElement : sourceElements) { result.add(sourceElement instanceof PsiClass ? sourceElement.getContainingFile() : sourceElement); @@ -70,6 +67,10 @@ public class JavaMoveFilesOrDirectoriesHandler extends MoveFilesOrDirectoriesHan @Override public void doMove(final Project project, PsiElement[] elements, PsiElement targetContainer, MoveCallback callback) { + elements = adjustForMove(project, elements, targetContainer); + if (elements == null) { + return; + } MoveFilesOrDirectoriesUtil .doMove(project, elements, new PsiElement[]{targetContainer}, callback, new Function() { @Override @@ -89,7 +90,7 @@ public class JavaMoveFilesOrDirectoriesHandler extends MoveFilesOrDirectoriesHan adjustedElements.add(containingFile); continue; } - } + } } adjustedElements.add(element); } diff --git a/platform/lang-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/MoveFilesOrDirectoriesHandler.java b/platform/lang-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/MoveFilesOrDirectoriesHandler.java index 66505d903dbf..277e8fa10324 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/MoveFilesOrDirectoriesHandler.java +++ b/platform/lang-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/MoveFilesOrDirectoriesHandler.java @@ -50,11 +50,6 @@ public class MoveFilesOrDirectoriesHandler extends MoveHandlerDelegate { } } - PsiElement[] filteredElements = PsiTreeUtil.filterAncestors(elements); - if (filteredElements.length != elements.length) { - // there are nested dirs - return false; - } return super.canMove(elements, targetContainer); } @@ -72,13 +67,23 @@ public class MoveFilesOrDirectoriesHandler extends MoveHandlerDelegate { doMove(project, elements, targetContainer, null); } + + @Nullable + @Override + public PsiElement[] adjustForMove(Project project, PsiElement[] sourceElements, PsiElement targetElement) { + return PsiTreeUtil.filterAncestors(sourceElements); + } + @Override public void doMove(final Project project, final PsiElement[] elements, final PsiElement targetContainer, @Nullable final MoveCallback callback) { if (!LOG.assertTrue(targetContainer == null || targetContainer instanceof PsiDirectory || targetContainer instanceof PsiDirectoryContainer, "container: " + targetContainer + "; elements: " + Arrays.toString(elements) + "; working handler: " + toString())) { return; } - MoveFilesOrDirectoriesUtil.doMove(project, adjustForMove(project, elements, targetContainer), new PsiElement[] {targetContainer}, callback); + final PsiElement[] adjustedElements = adjustForMove(project, elements, targetContainer); + if (adjustedElements != null) { + MoveFilesOrDirectoriesUtil.doMove(project, adjustedElements, new PsiElement[] {targetContainer}, callback); + } } @Override