From dcc19655f17f221ffc431e1cd52604186005143b Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 28 Jun 2018 14:29:17 +0300 Subject: [PATCH] enable move class and package-info in one step (IDEA-147842) --- .../JavaMoveClassesOrPackagesHandler.java | 3 +- .../MoveClassesOrPackagesProcessor.java | 39 ++++++++++++++++--- .../MoveClassesOrPackagesUtil.java | 4 +- .../classAndPackageInfo/after/s/empty.txt | 0 .../classAndPackageInfo/after/t/MyClass.java | 2 + .../classAndPackageInfo/after/t/empty.txt | 0 .../after/t/package-info.java | 1 + .../classAndPackageInfo/before/s/MyClass.java | 2 + .../classAndPackageInfo/before/s/empty.txt | 0 .../before/s/package-info.java | 1 + .../classAndPackageInfo/before/t/empty.txt | 0 .../refactoring/MoveClassAndFileTest.java | 4 ++ 12 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 java/java-tests/testData/refactoring/moveClassAndFile/classAndPackageInfo/after/s/empty.txt create mode 100644 java/java-tests/testData/refactoring/moveClassAndFile/classAndPackageInfo/after/t/MyClass.java create mode 100644 java/java-tests/testData/refactoring/moveClassAndFile/classAndPackageInfo/after/t/empty.txt create mode 100644 java/java-tests/testData/refactoring/moveClassAndFile/classAndPackageInfo/after/t/package-info.java create mode 100644 java/java-tests/testData/refactoring/moveClassAndFile/classAndPackageInfo/before/s/MyClass.java create mode 100644 java/java-tests/testData/refactoring/moveClassAndFile/classAndPackageInfo/before/s/empty.txt create mode 100644 java/java-tests/testData/refactoring/moveClassAndFile/classAndPackageInfo/before/s/package-info.java create mode 100644 java/java-tests/testData/refactoring/moveClassAndFile/classAndPackageInfo/before/t/empty.txt diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/JavaMoveClassesOrPackagesHandler.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/JavaMoveClassesOrPackagesHandler.java index 6a093163c468..e689adf66bee 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/JavaMoveClassesOrPackagesHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/JavaMoveClassesOrPackagesHandler.java @@ -16,6 +16,7 @@ package com.intellij.refactoring.move.moveClassesOrPackages; import com.intellij.CommonBundle; +import com.intellij.ide.util.PackageUtil; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.LangDataKeys; import com.intellij.openapi.application.WriteAction; @@ -82,7 +83,7 @@ public class JavaMoveClassesOrPackagesHandler extends MoveHandlerDelegate { PsiFile parentFile; if (element instanceof PsiClassOwner) { final PsiClass[] classes = ((PsiClassOwner)element).getClasses(); - if (classes.length == 0) return true; + if (classes.length == 0 && !PackageUtil.isPackageInfoFile(element)) return true; for (PsiClass aClass : classes) { if (aClass instanceof PsiSyntheticClass) return true; } diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesProcessor.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesProcessor.java index 68414e657214..50da3fef112f 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesProcessor.java @@ -44,6 +44,7 @@ import com.intellij.refactoring.listeners.RefactoringEventData; import com.intellij.refactoring.move.MoveCallback; import com.intellij.refactoring.move.MoveClassesOrPackagesCallback; import com.intellij.refactoring.move.MoveMultipleElementsViewDescriptor; +import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFilesOrDirectoriesUtil; import com.intellij.refactoring.rename.RenameUtil; import com.intellij.refactoring.util.*; import com.intellij.refactoring.util.classRefs.ClassInstanceScanner; @@ -53,7 +54,6 @@ import com.intellij.usageView.UsageViewDescriptor; import com.intellij.usageView.UsageViewUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.VisibilityUtil; -import java.util.HashMap; import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -88,9 +88,15 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor { for (PsiElement element : elements) { PsiUtilCore.ensureValid(element); if (element instanceof PsiClassOwner) { - for (PsiClass aClass : ((PsiClassOwner)element).getClasses()) { - PsiUtilCore.ensureValid(aClass); - toMove.add(aClass); + PsiClass[] classes = ((PsiClassOwner)element).getClasses(); + if (classes.length > 0) { + for (PsiClass aClass : classes) { + PsiUtilCore.ensureValid(aClass); + toMove.add(aClass); + } + } + else { + toMove.add(element); } } else { toMove.add(element); @@ -419,6 +425,9 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor { else if (element instanceof PsiPackage) { return StringUtil.getQualifiedName(qualifiedName, ((PsiPackage)element).getName()); } + else if (element instanceof PsiClassOwner) { + return ((PsiClassOwner)element).getName(); + } else { LOG.assertTrue(false); return null; @@ -433,6 +442,9 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor { else if (element instanceof PsiPackage) { return ((PsiPackage)element).getQualifiedName(); } + else if (element instanceof PsiClassOwner) { + return ((PsiClassOwner)element).getName(); + } else { LOG.assertTrue(false); return null; @@ -518,7 +530,24 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor { final PsiClass newElement = MoveClassesOrPackagesUtil.doMoveClass(psiClass, myMoveDestination.getTargetDirectory(element.getContainingFile()), allClasses.get(psiClass)); oldToNewElementsMapping.put(element, newElement); element = newElement; - } else { + } + else if (element instanceof PsiClassOwner) { + PsiDirectory directory = myMoveDestination.getTargetDirectory(element.getContainingFile()); + MoveFilesOrDirectoriesUtil.doMoveFile((PsiClassOwner)element, directory); + PsiFile newElement = directory.findFile(((PsiClassOwner)element).getName()); + LOG.assertTrue(newElement != null); + final PsiPackage newPackage = JavaDirectoryService.getInstance().getPackage(directory); + if (newPackage != null) { + String qualifiedName = newPackage.getQualifiedName(); + if (!Comparing.strEqual(qualifiedName, ((PsiClassOwner)newElement).getPackageName()) && + (qualifiedName.isEmpty() || PsiNameHelper.getInstance(myProject).isQualifiedName(qualifiedName))) { + ((PsiClassOwner)newElement).setPackageName(qualifiedName); + } + } + oldToNewElementsMapping.put(element, newElement); + element = newElement; + } + else { LOG.error("Unexpected element to move: " + element); } elementListener.elementMoved(element); diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesUtil.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesUtil.java index 327bd838135f..b37f03fc539d 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesUtil.java @@ -41,7 +41,6 @@ import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.refactoring.util.TextOccurrencesUtil; import com.intellij.usageView.UsageInfo; import com.intellij.util.IncorrectOperationException; -import java.util.HashMap; import org.jetbrains.annotations.Nullable; import java.io.File; @@ -102,6 +101,9 @@ public class MoveClassesOrPackagesUtil { else if (element instanceof PsiDirectory) { return getStringToSearch(JavaDirectoryService.getInstance().getPackage((PsiDirectory)element)); } + else if (element instanceof PsiClassOwner) { + return ((PsiClassOwner)element).getName(); + } else { LOG.error("Unknown element type"); return null; diff --git a/java/java-tests/testData/refactoring/moveClassAndFile/classAndPackageInfo/after/s/empty.txt b/java/java-tests/testData/refactoring/moveClassAndFile/classAndPackageInfo/after/s/empty.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/java/java-tests/testData/refactoring/moveClassAndFile/classAndPackageInfo/after/t/MyClass.java b/java/java-tests/testData/refactoring/moveClassAndFile/classAndPackageInfo/after/t/MyClass.java new file mode 100644 index 000000000000..b85fb0c13bcb --- /dev/null +++ b/java/java-tests/testData/refactoring/moveClassAndFile/classAndPackageInfo/after/t/MyClass.java @@ -0,0 +1,2 @@ +package t; +public class MyClass{} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/moveClassAndFile/classAndPackageInfo/after/t/empty.txt b/java/java-tests/testData/refactoring/moveClassAndFile/classAndPackageInfo/after/t/empty.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/java/java-tests/testData/refactoring/moveClassAndFile/classAndPackageInfo/after/t/package-info.java b/java/java-tests/testData/refactoring/moveClassAndFile/classAndPackageInfo/after/t/package-info.java new file mode 100644 index 000000000000..9a1b9b91e756 --- /dev/null +++ b/java/java-tests/testData/refactoring/moveClassAndFile/classAndPackageInfo/after/t/package-info.java @@ -0,0 +1 @@ +package t; \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/moveClassAndFile/classAndPackageInfo/before/s/MyClass.java b/java/java-tests/testData/refactoring/moveClassAndFile/classAndPackageInfo/before/s/MyClass.java new file mode 100644 index 000000000000..c5275c0eda22 --- /dev/null +++ b/java/java-tests/testData/refactoring/moveClassAndFile/classAndPackageInfo/before/s/MyClass.java @@ -0,0 +1,2 @@ +package s; +public class MyClass{} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/moveClassAndFile/classAndPackageInfo/before/s/empty.txt b/java/java-tests/testData/refactoring/moveClassAndFile/classAndPackageInfo/before/s/empty.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/java/java-tests/testData/refactoring/moveClassAndFile/classAndPackageInfo/before/s/package-info.java b/java/java-tests/testData/refactoring/moveClassAndFile/classAndPackageInfo/before/s/package-info.java new file mode 100644 index 000000000000..11967d0a566a --- /dev/null +++ b/java/java-tests/testData/refactoring/moveClassAndFile/classAndPackageInfo/before/s/package-info.java @@ -0,0 +1 @@ +package s; \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/moveClassAndFile/classAndPackageInfo/before/t/empty.txt b/java/java-tests/testData/refactoring/moveClassAndFile/classAndPackageInfo/before/t/empty.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/MoveClassAndFileTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/MoveClassAndFileTest.java index 54ac61b9e0f5..9c4bd3634a67 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/MoveClassAndFileTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/MoveClassAndFileTest.java @@ -26,6 +26,10 @@ public class MoveClassAndFileTest extends RefactoringTestCase { doTest("onlyPackageLocalClass", "t", "txt2move.txt", "s.MyLocal"); } + public void testPackageInfo() throws Exception { + doTest("classAndPackageInfo", "t", "package-info.java", "s.MyClass"); + } + public void testLeavePackageLocalClass() throws Exception { doTest("leavePackageLocalClass", "t", "txt2move.txt", "s.MyClass"); }