diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveFilesOrDirectories/MoveKotlinFileHandler.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveFilesOrDirectories/MoveKotlinFileHandler.kt
index 0bf63f8071d..a88f854314c 100644
--- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveFilesOrDirectories/MoveKotlinFileHandler.kt
+++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveFilesOrDirectories/MoveKotlinFileHandler.kt
@@ -132,7 +132,10 @@ class MoveKotlinFileHandler : MoveFileHandler() {
val moveContext = MoveContext(file, moveProcessor)
oldToNewMap[moveContext] = moveContext
val packageNameInfo = file.getPackageNameInfo(moveDestination, true) ?: return
- file.packageDirective?.fqName = packageNameInfo.newContainer.fqName!!.quoteIfNeeded()
+ val newFqName = packageNameInfo.newContainer.fqName
+ if (newFqName != null) {
+ file.packageDirective?.fqName = newFqName.quoteIfNeeded()
+ }
}
override fun updateMovedFile(file: PsiFile) {
diff --git a/idea/testData/refactoring/moveMultiModule/moveFileToNonSrc/after/A/A.iml b/idea/testData/refactoring/moveMultiModule/moveFileToNonSrc/after/A/A.iml
new file mode 100644
index 00000000000..245d3429faa
--- /dev/null
+++ b/idea/testData/refactoring/moveMultiModule/moveFileToNonSrc/after/A/A.iml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/idea/testData/refactoring/moveMultiModule/moveFileToNonSrc/after/A/notSrc/dummy.txt b/idea/testData/refactoring/moveMultiModule/moveFileToNonSrc/after/A/notSrc/dummy.txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/idea/testData/refactoring/moveMultiModule/moveFileToNonSrc/after/A/notSrc/foo.kt b/idea/testData/refactoring/moveMultiModule/moveFileToNonSrc/after/A/notSrc/foo.kt
new file mode 100644
index 00000000000..8db7f19bc92
--- /dev/null
+++ b/idea/testData/refactoring/moveMultiModule/moveFileToNonSrc/after/A/notSrc/foo.kt
@@ -0,0 +1,5 @@
+package test
+
+fun foo() {
+
+}
\ No newline at end of file
diff --git a/idea/testData/refactoring/moveMultiModule/moveFileToNonSrc/after/A/src/test/dummy.txt b/idea/testData/refactoring/moveMultiModule/moveFileToNonSrc/after/A/src/test/dummy.txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/idea/testData/refactoring/moveMultiModule/moveFileToNonSrc/before/A/A.iml b/idea/testData/refactoring/moveMultiModule/moveFileToNonSrc/before/A/A.iml
new file mode 100644
index 00000000000..245d3429faa
--- /dev/null
+++ b/idea/testData/refactoring/moveMultiModule/moveFileToNonSrc/before/A/A.iml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/idea/testData/refactoring/moveMultiModule/moveFileToNonSrc/before/A/notSrc/dummy.txt b/idea/testData/refactoring/moveMultiModule/moveFileToNonSrc/before/A/notSrc/dummy.txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/idea/testData/refactoring/moveMultiModule/moveFileToNonSrc/before/A/src/test/dummy.txt b/idea/testData/refactoring/moveMultiModule/moveFileToNonSrc/before/A/src/test/dummy.txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/idea/testData/refactoring/moveMultiModule/moveFileToNonSrc/before/A/src/test/foo.kt b/idea/testData/refactoring/moveMultiModule/moveFileToNonSrc/before/A/src/test/foo.kt
new file mode 100644
index 00000000000..8db7f19bc92
--- /dev/null
+++ b/idea/testData/refactoring/moveMultiModule/moveFileToNonSrc/before/A/src/test/foo.kt
@@ -0,0 +1,5 @@
+package test
+
+fun foo() {
+
+}
\ No newline at end of file
diff --git a/idea/testData/refactoring/moveMultiModule/moveFileToNonSrc/moveFileToNonSrc.test b/idea/testData/refactoring/moveMultiModule/moveFileToNonSrc/moveFileToNonSrc.test
new file mode 100644
index 00000000000..22752136f05
--- /dev/null
+++ b/idea/testData/refactoring/moveMultiModule/moveFileToNonSrc/moveFileToNonSrc.test
@@ -0,0 +1,5 @@
+{
+ "mainFile": "A/src/test/foo.kt",
+ "type": "MOVE_FILES",
+ "targetDirectory": "A/notSrc"
+}
\ No newline at end of file
diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/AbstractMoveTest.kt b/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/AbstractMoveTest.kt
index d5f46cb3666..ee20a47dae7 100644
--- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/AbstractMoveTest.kt
+++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/AbstractMoveTest.kt
@@ -261,12 +261,19 @@ enum class MoveAction {
val project = mainFile.project
val targetPackage = config.getNullableString("targetPackage")
- if (targetPackage != null) {
- ActionRunner.runInsideWriteAction { VfsUtil.createDirectoryIfMissing(rootDir, targetPackage.replace('.', '/')) }
+ val targetDirPath = targetPackage?.replace('.', '/') ?: config.getNullableString("targetDirectory")
+ if (targetDirPath != null) {
+ ActionRunner.runInsideWriteAction { VfsUtil.createDirectoryIfMissing(rootDir, targetDirPath) }
+ val newParent = if (targetPackage != null) {
+ JavaPsiFacade.getInstance(project).findPackage(targetPackage)!!.directories[0]
+ }
+ else {
+ rootDir.findFileByRelativePath(targetDirPath)!!.toPsiDirectory(project)!!
+ }
MoveFilesOrDirectoriesProcessor(
project,
arrayOf(mainFile),
- JavaPsiFacade.getInstance(project).findPackage(targetPackage)!!.directories[0],
+ newParent,
/* searchInComments = */ false,
/* searchInNonJavaFiles = */ true,
/* moveCallback = */ null,
diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/MultiModuleMoveTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/MultiModuleMoveTestGenerated.java
index 42215e7042c..7be9f39ada8 100644
--- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/MultiModuleMoveTestGenerated.java
+++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/MultiModuleMoveTestGenerated.java
@@ -48,6 +48,12 @@ public class MultiModuleMoveTestGenerated extends AbstractMultiModuleMoveTest {
doTest(fileName);
}
+ @TestMetadata("moveFileToNonSrc/moveFileToNonSrc.test")
+ public void testMoveFileToNonSrc_MoveFileToNonSrc() throws Exception {
+ String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/moveMultiModule/moveFileToNonSrc/moveFileToNonSrc.test");
+ doTest(fileName);
+ }
+
@TestMetadata("moveFileWithDeclarationsToUnrelatedModuleConflict/moveFileWithDeclarationsToUnrelatedModuleConflict.test")
public void testMoveFileWithDeclarationsToUnrelatedModuleConflict_MoveFileWithDeclarationsToUnrelatedModuleConflict() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/moveMultiModule/moveFileWithDeclarationsToUnrelatedModuleConflict/moveFileWithDeclarationsToUnrelatedModuleConflict.test");