diff --git a/idea/src/org/jetbrains/kotlin/idea/run/script/standalone/KotlinStandaloneScriptRunConfiguration.kt b/idea/src/org/jetbrains/kotlin/idea/run/script/standalone/KotlinStandaloneScriptRunConfiguration.kt index e1e69887814..8263b160ef2 100644 --- a/idea/src/org/jetbrains/kotlin/idea/run/script/standalone/KotlinStandaloneScriptRunConfiguration.kt +++ b/idea/src/org/jetbrains/kotlin/idea/run/script/standalone/KotlinStandaloneScriptRunConfiguration.kt @@ -158,15 +158,26 @@ class KotlinStandaloneScriptRunConfiguration( return object : RefactoringElementAdapter() { override fun undoElementMovedOrRenamed(newElement: PsiElement, oldQualifiedName: String) { - filePath = pathFromPsiElement(newElement) + setupFilePath(pathFromPsiElement(newElement) ?: return) } override fun elementRenamedOrMoved(newElement: PsiElement) { - filePath = pathFromPsiElement(newElement) + setupFilePath(pathFromPsiElement(newElement) ?: return) } } } + fun defaultWorkingDirectory(): String? { + return com.intellij.util.PathUtil.getParentPath(filePath ?: return null) + } + + fun setupFilePath(filePath: String) { + val wasDefaultWorkingDirectory = workingDirectory == null || workingDirectory == defaultWorkingDirectory() + this.filePath = filePath + if (wasDefaultWorkingDirectory) { + this.workingDirectory = defaultWorkingDirectory() + } + } } private class ScriptCommandLineState(environment: ExecutionEnvironment, configuration: KotlinStandaloneScriptRunConfiguration) : diff --git a/idea/src/org/jetbrains/kotlin/idea/run/script/standalone/KotlinStandaloneScriptRunConfigurationProducer.kt b/idea/src/org/jetbrains/kotlin/idea/run/script/standalone/KotlinStandaloneScriptRunConfigurationProducer.kt index f30c2a7b2d2..54f33214a9b 100644 --- a/idea/src/org/jetbrains/kotlin/idea/run/script/standalone/KotlinStandaloneScriptRunConfigurationProducer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/run/script/standalone/KotlinStandaloneScriptRunConfigurationProducer.kt @@ -30,7 +30,7 @@ public class KotlinStandaloneScriptRunConfigurationProducer : context: ConfigurationContext?, sourceElement: Ref? ): Boolean { - configuration.filePath = pathFromContext(context) ?: return false + configuration.setupFilePath(pathFromContext(context) ?: return false) configuration.setGeneratedName() return true } diff --git a/idea/testData/run/StandaloneScript/move/a/script.kts b/idea/testData/run/StandaloneScript/move/a/script.kts new file mode 100644 index 00000000000..4907ef4d993 --- /dev/null +++ b/idea/testData/run/StandaloneScript/move/a/script.kts @@ -0,0 +1,3 @@ +package foo + +println("Hello from script") \ No newline at end of file diff --git a/idea/testData/run/StandaloneScript/move/script.kts b/idea/testData/run/StandaloneScript/move/script.kts new file mode 100644 index 00000000000..4907ef4d993 --- /dev/null +++ b/idea/testData/run/StandaloneScript/move/script.kts @@ -0,0 +1,3 @@ +package foo + +println("Hello from script") \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/run/StandaloneScriptRunConfigurationTest.kt b/idea/tests/org/jetbrains/kotlin/idea/run/StandaloneScriptRunConfigurationTest.kt index 84a09a80804..1333f6dfaf9 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/run/StandaloneScriptRunConfigurationTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/run/StandaloneScriptRunConfigurationTest.kt @@ -16,12 +16,18 @@ package org.jetbrains.kotlin.idea.run +import com.intellij.openapi.vfs.VfsUtil +import com.intellij.psi.JavaPsiFacade +import com.intellij.psi.PsiFile import com.intellij.refactoring.RefactoringFactory +import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFilesOrDirectoriesProcessor +import com.intellij.util.ActionRunner import org.jetbrains.kotlin.idea.run.script.standalone.KotlinStandaloneScriptRunConfiguration import org.jetbrains.kotlin.idea.search.allScope import org.jetbrains.kotlin.idea.stubindex.KotlinScriptFqnIndex import org.jetbrains.kotlin.idea.test.KotlinCodeInsightTestCase import org.jetbrains.kotlin.idea.test.PluginTestCaseBase +import org.jetbrains.kotlin.psi.KtScript import org.junit.Assert import kotlin.test.assertNotEquals @@ -48,16 +54,86 @@ class StandaloneScriptRunConfigurationTest : KotlinCodeInsightTestCase() { val runConfiguration = createConfigurationFromElement(script, save = true) as KotlinStandaloneScriptRunConfiguration Assert.assertEquals("SimpleScript", runConfiguration.name) - val originalPath = script.containingFile.virtualFile.canonicalPath + val scriptVirtualFileBefore = script.containingFile.virtualFile + val originalPath = scriptVirtualFileBefore.canonicalPath + val originalWorkingDirectory = scriptVirtualFileBefore.parent.canonicalPath assertEquals(originalPath, runConfiguration.filePath) + assertEquals(originalWorkingDirectory, runConfiguration.workingDirectory) RefactoringFactory.getInstance(project).createRename(script.containingFile, "renamedScript.kts").run() Assert.assertEquals("RenamedScript", runConfiguration.name) - assertEquals(script.containingFile.virtualFile.canonicalPath, runConfiguration.filePath) + val scriptVirtualFileAfter = script.containingFile.virtualFile + + assertEquals(scriptVirtualFileAfter.canonicalPath, runConfiguration.filePath) assertNotEquals(originalPath, runConfiguration.filePath) + + assertEquals(scriptVirtualFileAfter.parent.canonicalPath, runConfiguration.workingDirectory) + assertEquals(originalWorkingDirectory, runConfiguration.workingDirectory) } + fun testOnFileMoveWithDefaultWorkingDir() { + configureByFile("move/script.kts") + val script = KotlinScriptFqnIndex.instance.get("foo.Script", project, project.allScope()).single() + val runConfiguration = createConfigurationFromElement(script, save = true) as KotlinStandaloneScriptRunConfiguration + + Assert.assertEquals("Script", runConfiguration.name) + val scriptVirtualFileBefore = script.containingFile.virtualFile + val originalPath = scriptVirtualFileBefore.canonicalPath + val originalWorkingDirectory = scriptVirtualFileBefore.parent.canonicalPath + assertEquals(originalPath, runConfiguration.filePath) + assertEquals(originalWorkingDirectory, runConfiguration.workingDirectory) + + moveScriptFile(script.containingFile) + + Assert.assertEquals("Script", runConfiguration.name) + val scriptVirtualFileAfter = script.containingFile.virtualFile + + assertEquals(scriptVirtualFileAfter.canonicalPath, runConfiguration.filePath) + assertNotEquals(originalPath, runConfiguration.filePath) + + assertEquals(scriptVirtualFileAfter.parent.canonicalPath, runConfiguration.workingDirectory) + assertNotEquals(originalWorkingDirectory, runConfiguration.workingDirectory) + } + + fun testOnFileMoveWithNonDefaultWorkingDir() { + configureByFile("move/script.kts") + val script = KotlinScriptFqnIndex.instance.get("foo.Script", project, project.allScope()).single() + val runConfiguration = createConfigurationFromElement(script, save = true) as KotlinStandaloneScriptRunConfiguration + + Assert.assertEquals("Script", runConfiguration.name) + runConfiguration.workingDirectory = runConfiguration.workingDirectory + "/customWorkingDirectory" + val scriptVirtualFileBefore = script.containingFile.virtualFile + val originalPath = scriptVirtualFileBefore.canonicalPath + val originalWorkingDirectory = scriptVirtualFileBefore.parent.canonicalPath + "/customWorkingDirectory" + + assertEquals(originalPath, runConfiguration.filePath) + assertEquals(originalWorkingDirectory, runConfiguration.workingDirectory) + + moveScriptFile(script.containingFile) + + Assert.assertEquals("Script", runConfiguration.name) + val scriptVirtualFileAfter = script.containingFile.virtualFile + + assertEquals(scriptVirtualFileAfter.canonicalPath, runConfiguration.filePath) + assertNotEquals(originalPath, runConfiguration.filePath) + + assertNotEquals(scriptVirtualFileAfter.parent.canonicalPath, runConfiguration.workingDirectory) + assertEquals(originalWorkingDirectory, runConfiguration.workingDirectory) + } + + fun moveScriptFile(scriptFile: PsiFile) { + ActionRunner.runInsideWriteAction { VfsUtil.createDirectoryIfMissing(scriptFile.virtualFile.parent, "dest") } + + MoveFilesOrDirectoriesProcessor( + project, + arrayOf(scriptFile), + JavaPsiFacade.getInstance(project).findPackage("dest")!!.getDirectories()[0], + false, true, null, null + ).run() + } + + override fun getTestDataPath() = PluginTestCaseBase.getTestDataPathBase() + "/run/StandaloneScript/" override fun getTestProjectJdk() = PluginTestCaseBase.mockJdk() }