enable move class and package-info in one step (IDEA-147842)

This commit is contained in:
Anna Kozlova
2018-06-28 16:58:45 +03:00
parent 22b2afb038
commit dcc19655f1
12 changed files with 49 additions and 7 deletions
@@ -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;
}
@@ -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);
@@ -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;
@@ -0,0 +1,2 @@
package t;
public class MyClass{}
@@ -0,0 +1,2 @@
package s;
public class MyClass{}
@@ -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");
}