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-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-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-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 #### Debugger
@@ -95,8 +95,11 @@ import java.lang.annotation.Retention
import java.util.* import java.util.*
import javax.swing.Icon import javax.swing.Icon
fun getOrCreateKotlinFile(fileName: String, targetDir: PsiDirectory): KtFile? = @JvmOverloads
(targetDir.findFile(fileName) ?: createKotlinFile(fileName, targetDir)) as? KtFile 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, fun createKotlinFile(fileName: String,
targetDir: PsiDirectory, targetDir: PsiDirectory,
@@ -586,19 +586,34 @@ public class MoveKotlinTopLevelDeclarationsDialog extends RefactoringDialog {
return null; return null;
} }
PsiPackage psiPackage = JavaDirectoryService.getInstance().getPackage(psiDirectory); Set<FqName> sourcePackageFqNames = CollectionsKt.mapTo(
if (psiPackage == null) { sourceFiles,
setErrorText("Could not find package corresponding to " + targetDir.getPath()); new LinkedHashSet<FqName>(),
return null; 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( return new KotlinMoveTargetForDeferredFile(
new FqName(psiPackage.getQualifiedName()), targetPackageFqName,
psiDirectory, psiDirectory,
new Function1<KtFile, KtFile>() { new Function1<KtFile, KtFile>() {
@Override @Override
public KtFile invoke(@NotNull KtFile originalFile) { public KtFile invoke(@NotNull KtFile originalFile) {
return JetRefactoringUtilKt.getOrCreateKotlinFile(targetFile.getName(), psiDirectory); return JetRefactoringUtilKt.getOrCreateKotlinFile(targetFile.getName(), psiDirectory, finalTargetPackageFqName);
} }
} }
); );