From bfac5ceeafd49c8cf9d457244e4fedb36a2b0f24 Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Fri, 11 Apr 2014 19:33:25 +0400 Subject: [PATCH] EA-55604 - assert: CopyFilesOrDirectoriesHandler.doCloneFile --- .../copy/CopyFilesOrDirectoriesHandler.java | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/refactoring/copy/CopyFilesOrDirectoriesHandler.java b/platform/lang-impl/src/com/intellij/refactoring/copy/CopyFilesOrDirectoriesHandler.java index 12e59b2aed02..94c64a7bab0f 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/copy/CopyFilesOrDirectoriesHandler.java +++ b/platform/lang-impl/src/com/intellij/refactoring/copy/CopyFilesOrDirectoriesHandler.java @@ -21,7 +21,9 @@ import com.intellij.ide.util.EditorHelper; import com.intellij.ide.util.PlatformPackageUtil; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.CommandProcessor; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.ThrowableComputable; import com.intellij.openapi.vfs.VfsUtil; @@ -34,6 +36,7 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFilesOrDirectoriesUtil; import com.intellij.refactoring.util.CommonRefactoringUtil; +import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -43,6 +46,9 @@ import java.util.HashSet; import java.util.Set; public class CopyFilesOrDirectoriesHandler extends CopyHandlerDelegateBase { + + private static Logger LOG = Logger.getInstance("com.intellij.refactoring.copy.CopyFilesOrDirectoriesHandler"); + @Override public boolean canCopy(PsiElement[] elements, boolean fromUpdate) { Set names = new HashSet(); @@ -73,15 +79,26 @@ public class CopyFilesOrDirectoriesHandler extends CopyHandlerDelegateBase { if (defaultTargetDirectory == null) return; } - if (defaultTargetDirectory == null) { - VirtualFile root = project.getBaseDir(); - if (root == null) root = VfsUtil.getUserHomeDir(); - if (root != null) defaultTargetDirectory = PsiManager.getInstance(project).findDirectory(root); - } + defaultTargetDirectory = tryNotNullizeDirectory(project, defaultTargetDirectory); copyAsFiles(elements, defaultTargetDirectory, project); } + @Nullable + private static PsiDirectory tryNotNullizeDirectory(@NotNull Project project, @Nullable PsiDirectory defaultTargetDirectory) { + if (defaultTargetDirectory == null) { + VirtualFile root = ArrayUtil.getFirstElement(ProjectRootManager.getInstance(project).getContentRoots()); + if (root == null) root = project.getBaseDir(); + if (root == null) root = VfsUtil.getUserHomeDir(); + defaultTargetDirectory = root != null ? PsiManager.getInstance(project).findDirectory(root) : null; + + if (defaultTargetDirectory == null) { + LOG.warn("No directory found for project: " + project.getName() +", root: " + root); + } + } + return defaultTargetDirectory; + } + public static void copyAsFiles(PsiElement[] elements, @Nullable PsiDirectory defaultTargetDirectory, Project project) { PsiDirectory targetDirectory = null; String newName = null; @@ -131,7 +148,8 @@ public class CopyFilesOrDirectoriesHandler extends CopyHandlerDelegateBase { else { targetDirectory = PlatformPackageUtil.getDirectory(element); } - assert targetDirectory != null : element; + targetDirectory = tryNotNullizeDirectory(element.getProject(), targetDirectory); + if (targetDirectory == null) return; PsiElement[] elements = {element}; CopyFilesOrDirectoriesDialog dialog = new CopyFilesOrDirectoriesDialog(elements, null, element.getProject(), true);