diff --git a/ChangeLog.md b/ChangeLog.md index c237c0136ac..fe5b65f0577 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -40,6 +40,7 @@ Issues fixed: - [KT-11482](https://youtrack.jetbrains.com/issue/KT-11482) Fixed exception in "Move to companion object" intention - [KT-11483](https://youtrack.jetbrains.com/issue/KT-11483) Pass implicit receiver as argument when moving member function to companion object - [KT-11512](https://youtrack.jetbrains.com/issue/KT-11512) Allow choosing any source root in "Move file to directory" intention +- [KT-10950](https://youtrack.jetbrains.com/issue/KT-10950) Keep original file package name when moving top-level declarations to separate file (provided it's not ambiguous) #### Debugger diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/jetRefactoringUtil.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/jetRefactoringUtil.kt index bf87885cf53..1db82369061 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/jetRefactoringUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/jetRefactoringUtil.kt @@ -95,8 +95,11 @@ import java.lang.annotation.Retention import java.util.* import javax.swing.Icon -fun getOrCreateKotlinFile(fileName: String, targetDir: PsiDirectory): KtFile? = - (targetDir.findFile(fileName) ?: createKotlinFile(fileName, targetDir)) as? KtFile +@JvmOverloads +fun getOrCreateKotlinFile(fileName: String, + targetDir: PsiDirectory, + packageName: String? = targetDir.getPackage()?.qualifiedName): KtFile? = + (targetDir.findFile(fileName) ?: createKotlinFile(fileName, targetDir, packageName)) as? KtFile fun createKotlinFile(fileName: String, targetDir: PsiDirectory, diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ui/MoveKotlinTopLevelDeclarationsDialog.java b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ui/MoveKotlinTopLevelDeclarationsDialog.java index 8ef465eea0f..aae705cccd0 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ui/MoveKotlinTopLevelDeclarationsDialog.java +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ui/MoveKotlinTopLevelDeclarationsDialog.java @@ -586,19 +586,34 @@ public class MoveKotlinTopLevelDeclarationsDialog extends RefactoringDialog { return null; } - PsiPackage psiPackage = JavaDirectoryService.getInstance().getPackage(psiDirectory); - if (psiPackage == null) { - setErrorText("Could not find package corresponding to " + targetDir.getPath()); - return null; + Set sourcePackageFqNames = CollectionsKt.mapTo( + sourceFiles, + new LinkedHashSet(), + new Function1() { + @Override + public FqName invoke(KtFile file) { + return file.getPackageFqName(); + } + } + ); + FqName targetPackageFqName = CollectionsKt.singleOrNull(sourcePackageFqNames); + if (targetPackageFqName == null) { + PsiPackage psiPackage = JavaDirectoryService.getInstance().getPackage(psiDirectory); + if (psiPackage == null) { + setErrorText("Could not find package corresponding to " + targetDir.getPath()); + return null; + } + targetPackageFqName = new FqName(psiPackage.getQualifiedName()); } + final String finalTargetPackageFqName = targetPackageFqName.asString(); return new KotlinMoveTargetForDeferredFile( - new FqName(psiPackage.getQualifiedName()), + targetPackageFqName, psiDirectory, new Function1() { @Override public KtFile invoke(@NotNull KtFile originalFile) { - return JetRefactoringUtilKt.getOrCreateKotlinFile(targetFile.getName(), psiDirectory); + return JetRefactoringUtilKt.getOrCreateKotlinFile(targetFile.getName(), psiDirectory, finalTargetPackageFqName); } } );