move inner: outer class reference in hierarchy fixed (IDEA-40651)

This commit is contained in:
anna
2010-02-01 14:55:38 +03:00
parent 4be6bea312
commit 735162b601
9 changed files with 158 additions and 31 deletions

View File

@@ -1,13 +1,14 @@
package com.intellij.refactoring;
import com.intellij.JavaTestUtil;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.PostprocessReformattingAspect;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.refactoring.move.moveInner.MoveInnerDialog;
import com.intellij.refactoring.move.moveInner.MoveInnerImpl;
import com.intellij.refactoring.move.moveInner.MoveInnerProcessor;
import com.intellij.JavaTestUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.Nullable;
@@ -64,6 +65,21 @@ public class MoveInnerTest extends MultiFileTestCase {
doTest(createAction("p.A.E", "E", false, null, false, false, null));
}
public void testQualifyThisHierarchy() throws Exception {
final String innerClassName = "pack1.DImpl.MyRunnable";
doTest(new MyPerformAction(innerClassName, "MyRunnable", false, "d",
false, false, null) {
@Override
protected boolean isPassOuterClass() {
final PsiClass outerClass = getJavaFacade().findClass("pack1.DImpl", GlobalSearchScope.moduleScope(myModule));
assertNotNull(outerClass);
final PsiClass innerClass = getJavaFacade().findClass(innerClassName, GlobalSearchScope.moduleScope(myModule));
assertNotNull(innerClass);
return MoveInnerDialog.isThisNeeded(innerClass, outerClass);
}
});
}
private PerformAction createAction(@NonNls final String innerClassName,
@NonNls final String newClassName,
final boolean passOuterClass,
@@ -71,28 +87,52 @@ public class MoveInnerTest extends MultiFileTestCase {
final boolean searchInComments,
final boolean searchInNonJava,
@NonNls @Nullable final String packageName) {
return new PerformAction() {
public void performAction(VirtualFile rootDir, VirtualFile rootAfter) throws Exception {
final JavaPsiFacade manager = getJavaFacade();
final PsiClass aClass = manager.findClass(innerClassName, GlobalSearchScope.moduleScope(myModule));
final MoveInnerProcessor moveInnerProcessor = new MoveInnerProcessor(myProject, null);
final PsiElement targetContainer = packageName != null ? findDirectory(packageName) : MoveInnerImpl.getTargetContainer(aClass, false);
assertNotNull(targetContainer);
moveInnerProcessor.setup(aClass, newClassName, passOuterClass, parameterName,
searchInComments, searchInNonJava, targetContainer);
moveInnerProcessor.run();
PostprocessReformattingAspect.getInstance(getProject()).doPostponedFormatting();
PsiDocumentManager.getInstance(myProject).commitAllDocuments();
FileDocumentManager.getInstance().saveAllDocuments();
}
private PsiElement findDirectory(final String packageName) {
final PsiPackage aPackage = JavaPsiFacade.getInstance(myPsiManager.getProject()).findPackage(packageName);
assert aPackage != null;
final PsiDirectory[] directories = aPackage.getDirectories();
return directories [0];
}
};
return new MyPerformAction(innerClassName, newClassName, passOuterClass, parameterName, searchInComments, searchInNonJava, packageName);
}
private class MyPerformAction implements PerformAction {
private final String myInnerClassName;
private final String myPackageName;
private final String myNewClassName;
private final boolean myPassOuterClass;
private final String myParameterName;
private final boolean mySearchInComments;
private final boolean mySearchInNonJava;
public MyPerformAction(String innerClassName, String newClassName, boolean passOuterClass, String parameterName, boolean searchInComments,
boolean searchInNonJava,
String packageName) {
myInnerClassName = innerClassName;
myPackageName = packageName;
myNewClassName = newClassName;
myPassOuterClass = passOuterClass;
myParameterName = parameterName;
mySearchInComments = searchInComments;
mySearchInNonJava = searchInNonJava;
}
public void performAction(VirtualFile rootDir, VirtualFile rootAfter) throws Exception {
final JavaPsiFacade manager = getJavaFacade();
final PsiClass aClass = manager.findClass(myInnerClassName, GlobalSearchScope.moduleScope(myModule));
final MoveInnerProcessor moveInnerProcessor = new MoveInnerProcessor(myProject, null);
final PsiElement targetContainer = myPackageName != null ? findDirectory(myPackageName) : MoveInnerImpl.getTargetContainer(aClass, false);
assertNotNull(targetContainer);
moveInnerProcessor.setup(aClass, myNewClassName, isPassOuterClass(), myParameterName, mySearchInComments, mySearchInNonJava, targetContainer);
moveInnerProcessor.run();
PostprocessReformattingAspect.getInstance(getProject()).doPostponedFormatting();
PsiDocumentManager.getInstance(myProject).commitAllDocuments();
FileDocumentManager.getInstance().saveAllDocuments();
}
protected boolean isPassOuterClass() {
return myPassOuterClass;
}
private PsiElement findDirectory(final String packageName) {
final PsiPackage aPackage = JavaPsiFacade.getInstance(myPsiManager.getProject()).findPackage(packageName);
assert aPackage != null;
final PsiDirectory[] directories = aPackage.getDirectories();
return directories [0];
}
}
}