IDEA-64814 Move-refactoring import statements bug

This commit is contained in:
Maxim Medvedev
2011-03-05 21:13:44 +03:00
parent 78964997d9
commit 587e9430c5
15 changed files with 203 additions and 160 deletions
@@ -28,6 +28,10 @@ import org.jetbrains.annotations.Nullable;
public interface MoveClassHandler {
ExtensionPointName<MoveClassHandler> EP_NAME = new ExtensionPointName<MoveClassHandler>("com.intellij.refactoring.moveClassHandler");
void prepareMove(@NotNull PsiClass aClass);
void finishMoveClass(@NotNull PsiClass aClass);
/**
* @return null if it cannot move aClass
*/
@@ -15,7 +15,6 @@
*/
package com.intellij.refactoring.move.moveClassesOrPackages;
import com.intellij.codeInsight.ChangeContextUtil;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
@@ -448,7 +447,7 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor {
element = newElement;
}
else if (element instanceof PsiClass) {
ChangeContextUtil.encodeContextInfo(element, true);
MoveClassesOrPackagesUtil.prepareMoveClass((PsiClass)element);
final PsiClass newElement = MoveClassesOrPackagesUtil.doMoveClass((PsiClass)element, myMoveDestination.getTargetDirectory(element.getContainingFile()));
oldToNewElementsMapping.put(element, newElement);
element = newElement;
@@ -461,7 +460,7 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor {
for (PsiElement element : myElementsToMove) {
if (element instanceof PsiClass) {
ChangeContextUtil.decodeContextInfo(element, null, null);
MoveClassesOrPackagesUtil.finishMoveClass((PsiClass)element);
}
}
@@ -207,6 +207,18 @@ public class MoveClassesOrPackagesUtil {
}
}
public static void prepareMoveClass(PsiClass aClass) {
for (MoveClassHandler handler : MoveClassHandler.EP_NAME.getExtensions()) {
handler.prepareMove(aClass);
}
}
public static void finishMoveClass(PsiClass aClass) {
for (MoveClassHandler handler : MoveClassHandler.EP_NAME.getExtensions()) {
handler.finishMoveClass(aClass);
}
}
// Does not process non-code usages!
public static PsiClass doMoveClass(PsiClass aClass, PsiDirectory moveDestination) throws IncorrectOperationException {
PsiClass newClass;
@@ -15,6 +15,7 @@
*/
package com.intellij.refactoring.move.moveClassesOrPackages;
import com.intellij.codeInsight.ChangeContextUtil;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.psi.*;
@@ -32,6 +33,20 @@ import java.util.Set;
public class MoveJavaClassHandler implements MoveClassHandler {
private static final Logger LOG = Logger.getInstance("#com.intellij.refactoring.move.moveClassesOrPackages.MoveJavaClassHandler");
@Override
public void finishMoveClass(@NotNull PsiClass aClass) {
if (aClass.getContainingFile() instanceof PsiJavaFile) {
ChangeContextUtil.decodeContextInfo(aClass, null, null);
}
}
@Override
public void prepareMove(@NotNull PsiClass aClass) {
if (aClass.getContainingFile() instanceof PsiJavaFile) {
ChangeContextUtil.encodeContextInfo(aClass, true);
}
}
public PsiClass doMoveClass(@NotNull final PsiClass aClass, @NotNull PsiDirectory moveDestination) throws IncorrectOperationException {
PsiFile file = aClass.getContainingFile();
final PsiPackage newPackage = JavaDirectoryService.getInstance().getPackage(moveDestination);