Move: Keep original file package name when moving top-level declarations to separate file (provided it's not ambiguous)

#KT-10950 Fixed
This commit is contained in:
Alexey Sedunov
2016-04-25 14:50:15 +03:00
parent 332fe29e94
commit 676000cdf7
3 changed files with 27 additions and 8 deletions
+1
View File
@@ -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
@@ -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,
@@ -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<FqName> sourcePackageFqNames = CollectionsKt.mapTo(
sourceFiles,
new LinkedHashSet<FqName>(),
new Function1<KtFile, FqName>() {
@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<KtFile, KtFile>() {
@Override
public KtFile invoke(@NotNull KtFile originalFile) {
return JetRefactoringUtilKt.getOrCreateKotlinFile(targetFile.getName(), psiDirectory);
return JetRefactoringUtilKt.getOrCreateKotlinFile(targetFile.getName(), psiDirectory, finalTargetPackageFqName);
}
}
);