mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
enable move class and package-info in one step (IDEA-147842)
This commit is contained in:
+2
-1
@@ -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;
|
||||
}
|
||||
|
||||
+34
-5
@@ -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);
|
||||
|
||||
+3
-1
@@ -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;
|
||||
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
package t;
|
||||
public class MyClass{}
|
||||
+1
@@ -0,0 +1 @@
|
||||
package t;
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
package s;
|
||||
public class MyClass{}
|
||||
+1
@@ -0,0 +1 @@
|
||||
package s;
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user