IDEA-275841 [copy class] fix: show overwrite dialog for empty relative path

GitOrigin-RevId: b7288e6c8dae8cab34ed341d972d98b2ee803f99
This commit is contained in:
Alexandr Suhinin
2021-08-18 10:36:20 +00:00
committed by intellij-monorepo-bot
parent f7a1ecf08e
commit 6101375b0b
3 changed files with 22 additions and 15 deletions
@@ -330,31 +330,23 @@ public class CopyClassesHandler extends CopyHandlerDelegateBase {
return doCopyClasses(fileToClasses, null, copyClassName, targetDirectory, project);
}
private static PsiDirectory getOrCreateRelativeDirectory(@NotNull PsiDirectory directory, @Nullable String relativePath) {
if (StringUtil.isNotEmpty(relativePath)) {
return WriteAction.compute(() -> buildRelativeDir(directory, relativePath).findOrCreateTargetDirectory());
} else {
return directory;
}
}
private static List<PsiFile> checkExistingFiles(@NotNull Collection<PsiFile> files, @NotNull PsiDirectory directory,
@Nullable Map<PsiFile, String> relativePaths, @Nullable String className){
SkipOverwriteChoice choice = SkipOverwriteChoice.OVERWRITE;
List<PsiFile> filesToProcess = new ArrayList<>();
for (PsiFile file : files) {
final String relativePath = relativePaths != null ? relativePaths.get(file) : null;
final PsiDirectory targetDirectory = relativePath != null ? buildRelativeDir(directory, relativePath).getTargetDirectory() : directory;
final PsiDirectory targetDirectory = buildRelativeDir(directory, relativePath).getTargetDirectory();
final String fileName = getNewFileName(file, className);
final boolean isExistingFile = targetDirectory != null && targetDirectory.findFile(fileName) != null;
if (isExistingFile) {
final PsiFile existingFile = targetDirectory != null ? targetDirectory.findFile(fileName) : null;
if (existingFile != null) {
if (choice != SkipOverwriteChoice.SKIP_ALL && choice != SkipOverwriteChoice.OVERWRITE_ALL) {
String message = ExecutionBundle.message("copy.classes.command.name");
choice = SkipOverwriteChoice.askUser(targetDirectory, fileName, message, files.size() > 1);
}
}
if (!isExistingFile || choice == SkipOverwriteChoice.OVERWRITE || choice == SkipOverwriteChoice.OVERWRITE_ALL) {
filesToProcess.add(file);
if (existingFile == null || choice == SkipOverwriteChoice.OVERWRITE || choice == SkipOverwriteChoice.OVERWRITE_ALL) {
if (existingFile != file) filesToProcess.add(file);
}
}
return filesToProcess;
@@ -405,7 +397,9 @@ public class CopyClassesHandler extends CopyHandlerDelegateBase {
}
final PsiClass[] sources = fileToClasses.get(psiFile);
final String relativePath = fileToRelativePath != null ? fileToRelativePath.get(psiFile) : null;
final PsiDirectoryImpl directory = (PsiDirectoryImpl)getOrCreateRelativeDirectory(targetDirectory, relativePath);
final PsiDirectoryImpl directory = WriteAction.compute(() ->
(PsiDirectoryImpl) buildRelativeDir(targetDirectory, relativePath).findOrCreateTargetDirectory()
);
Ref<PsiFile> createdFileReference = new Ref<>();
directory.executeWithUpdatingAddedFilesDisabled(() -> createdFileReference.set(copy(directory, psiFile, copyClassName)));
final PsiFile createdFile = createdFileReference.get();
@@ -511,7 +505,8 @@ public class CopyClassesHandler extends CopyHandlerDelegateBase {
@NotNull
private static MoveDirectoryWithClassesProcessor.TargetDirectoryWrapper buildRelativeDir(final @NotNull PsiDirectory directory,
final @NotNull String relativePath) {
final @Nullable String relativePath) {
if (StringUtil.isEmpty(relativePath)) return new MoveDirectoryWithClassesProcessor.TargetDirectoryWrapper(directory);
MoveDirectoryWithClassesProcessor.TargetDirectoryWrapper current = null;
for (String pathElement : relativePath.split("/")) {
if (current == null) {
@@ -0,0 +1,8 @@
public class Foo<A> {
public Foo(Foo<A> f) {
}
Foo<Foo<A>> foos() {
return new Foo<Foo<A>>(new Foo<Foo<A>>(null));
}
}
@@ -39,6 +39,10 @@ public class CopyClassTest extends LightMultiFileTestCase {
doTest("Foo", "Bar");
}
public void testConflictInSameFolder() throws Exception {
assertThrows(RuntimeException.class, "already exist", () -> doTest("Foo", "Foo"));
}
public void testLibraryClass() throws Exception { // IDEADEV-28791
JavaCodeStyleSettings javaSettings = JavaCodeStyleSettings.getInstance(getProject());
javaSettings.CLASS_NAMES_IN_JAVADOC = JavaCodeStyleSettings.FULLY_QUALIFY_NAMES_ALWAYS;