From 3e4d1af932d38f7c6e7225b726c868e2676169f9 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 6 Jan 2020 20:41:21 +0100 Subject: [PATCH] copy class: fix copy of one class from file with multiple top level classes (IDEA-230143) GitOrigin-RevId: 2d73053c1851e8c40bfeaef6466e944acc59b6bf --- .../refactoring/copy/CopyClassesHandler.java | 28 +++++++++---------- .../copyClass/replaceAllOccurrences/Foo.java | 1 + 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/java/java-impl/src/com/intellij/refactoring/copy/CopyClassesHandler.java b/java/java-impl/src/com/intellij/refactoring/copy/CopyClassesHandler.java index 1dd625956083..f3f756fc489d 100644 --- a/java/java-impl/src/com/intellij/refactoring/copy/CopyClassesHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/copy/CopyClassesHandler.java @@ -358,23 +358,23 @@ public class CopyClassesHandler extends CopyHandlerDelegateBase { continue; } - List nonSyntheticClasses = new ArrayList<>(); - for (final PsiClass aClass : ((PsiClassOwner)createdFile).getClasses()) { - if (!isSynthetic(aClass)) { - nonSyntheticClasses.add(aClass); + Map sourceToDestination = new LinkedHashMap<>(); + for (final PsiClass destination : ((PsiClassOwner)createdFile).getClasses()) { + if (!isSynthetic(destination)) { + PsiClass source = findByName(sources, destination.getName()); + if (source == null) { + WriteAction.run(() -> destination.delete()); + } + else { + sourceToDestination.put(source, destination); + } } } - for (final PsiClass destination : nonSyntheticClasses) { - PsiClass source = findByName(sources, destination.getName()); - if (source != null) { - final PsiClass copy = copy(source, nonSyntheticClasses.size() > 1 ? null : copyClassName); - PsiElement newElement = WriteAction.compute(() -> destination.replace(copy)); - oldToNewMap.put(source, newElement); - } - else { - WriteAction.run(() -> destination.delete()); - } + for (final Map.Entry classEntry : sourceToDestination.entrySet()) { + final PsiClass copy = copy(classEntry.getKey(), sourceToDestination.size() > 1 ? null : copyClassName); + PsiElement newElement = WriteAction.compute(() -> classEntry.getValue().replace(copy)); + oldToNewMap.put(classEntry.getKey(), newElement); } createdFiles.add(createdFile); } diff --git a/java/java-tests/testData/refactoring/copyClass/replaceAllOccurrences/Foo.java b/java/java-tests/testData/refactoring/copyClass/replaceAllOccurrences/Foo.java index 385bd5c14f78..718c20dd89b3 100644 --- a/java/java-tests/testData/refactoring/copyClass/replaceAllOccurrences/Foo.java +++ b/java/java-tests/testData/refactoring/copyClass/replaceAllOccurrences/Foo.java @@ -1,3 +1,4 @@ +class AnotherFoo {} public class Foo { public static Foo createInstance() {