update run configuration on package rename

This commit is contained in:
Dmitry Jemerov
2015-07-03 19:30:38 +02:00
committed by Nikolay Krasko
parent c6c2404dcf
commit 79602163a3
3 changed files with 52 additions and 6 deletions
@@ -40,6 +40,7 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiPackage;
import com.intellij.refactoring.listeners.RefactoringElementAdapter;
import com.intellij.refactoring.listeners.RefactoringElementListener;
import kotlin.KotlinPackage;
@@ -246,9 +247,16 @@ public class JetRunConfiguration extends ModuleBasedConfiguration<RunConfigurati
@Nullable
@Override
public RefactoringElementListener getRefactoringElementListener(PsiElement element) {
FqName fqNameBeingRenamed = null;
if (element instanceof JetDeclarationContainer) {
FqName name = KotlinRunConfigurationProducer.Companion.getStartClassFqName((JetDeclarationContainer) element);
if (name != null && name.asString().equals(MAIN_CLASS_NAME)) {
fqNameBeingRenamed = KotlinRunConfigurationProducer.Companion.getStartClassFqName((JetDeclarationContainer) element);
}
else if (element instanceof PsiPackage) {
fqNameBeingRenamed = new FqName(((PsiPackage) element).getQualifiedName());
}
FqName ourClassName = new FqName(MAIN_CLASS_NAME);
if (fqNameBeingRenamed != null && fqNameBeingRenamed.isAncestorOf(ourClassName)) {
if (element instanceof JetDeclarationContainer) {
return new RefactoringElementAdapter() {
@Override
public void undoElementMovedOrRenamed(@NotNull PsiElement newElement, @NotNull String oldQualifiedName) {
@@ -261,6 +269,20 @@ public class JetRunConfiguration extends ModuleBasedConfiguration<RunConfigurati
}
};
}
else {
final String nameSuffix = MAIN_CLASS_NAME.substring(fqNameBeingRenamed.toString().length());
return new RefactoringElementAdapter() {
@Override
protected void elementRenamedOrMoved(@NotNull PsiElement newElement) {
updateMainClassNameWithSuffix(newElement, nameSuffix);
}
@Override
public void undoElementMovedOrRenamed(@NotNull PsiElement newElement, @NotNull String oldQualifiedName) {
updateMainClassNameWithSuffix(newElement, nameSuffix);
}
};
}
}
return null;
}
@@ -273,6 +295,12 @@ public class JetRunConfiguration extends ModuleBasedConfiguration<RunConfigurati
}
}
private void updateMainClassNameWithSuffix(PsiElement element, String suffix) {
if (element instanceof PsiPackage) {
MAIN_CLASS_NAME = ((PsiPackage) element).getQualifiedName() + suffix;
}
}
@Override
public String suggestedName() {
if (MAIN_CLASS_NAME == null) {
@@ -0,0 +1,8 @@
package renameTest
import kotlin.platform.platformStatic
object Foo {
platformStatic fun main(args: Array<String>) {
}
}
@@ -33,10 +33,7 @@ import com.intellij.openapi.module.Module
import com.intellij.openapi.projectRoots.Sdk
import com.intellij.openapi.roots.ModuleRootModificationUtil
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.PsiComment
import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiManager
import com.intellij.psi.*
import com.intellij.refactoring.RefactoringFactory
import com.intellij.testFramework.MapDataContext
import com.intellij.testFramework.PlatformTestCase
@@ -116,6 +113,19 @@ class RunConfigurationTest: CodeInsightTestCase() {
Assert.assertEquals("renameTest.Bar", runConfiguration.MAIN_CLASS_NAME)
}
fun testUpdateOnPackageRename() {
val createModuleResult = configureModule(moduleDirPath("module"), getTestProject().getBaseDir()!!)
ConfigLibraryUtil.configureKotlinRuntimeAndSdk(createModuleResult.module, PluginTestCaseBase.mockJdk())
val runConfiguration = createConfigurationFromObject("renameTest.Foo", save = true)
val pkg = JavaPsiFacade.getInstance(getTestProject()).findPackage("renameTest")
val rename = RefactoringFactory.getInstance(getTestProject()).createRename(pkg, "afterRenameTest")
rename.run()
Assert.assertEquals("afterRenameTest.Foo", runConfiguration.MAIN_CLASS_NAME)
}
private fun doTest(configureRuntime: (Module, Sdk) -> Unit) {
val baseDir = getTestProject().getBaseDir()!!
val createModuleResult = configureModule(moduleDirPath("module"), baseDir)