From d343bb4dc3da2ef6b689e373ed106dcb84e085c5 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Mon, 20 Oct 2014 21:14:06 +0400 Subject: [PATCH] Move declaration: Create new file when needed --- .../plugin/refactoring/jetRefactoringUtil.kt | 4 +++ .../MoveKotlinTopLevelDeclarationsDialog.java | 36 +++++++++++++++---- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/jetRefactoringUtil.kt b/idea/src/org/jetbrains/jet/plugin/refactoring/jetRefactoringUtil.kt index 2f495ed3518..3f408f954c4 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/jetRefactoringUtil.kt +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/jetRefactoringUtil.kt @@ -97,6 +97,10 @@ public fun File.toPsiFile(project: Project): PsiFile? { return toVirtualFile()?.let { vfile -> PsiManager.getInstance(project).findFile(vfile) } } +public fun File.toPsiDirectory(project: Project): PsiDirectory? { + return toVirtualFile()?.let { vfile -> PsiManager.getInstance(project).findDirectory(vfile) } +} + public fun PsiElement.getUsageContext(): PsiElement { return when (this) { is JetElement -> PsiTreeUtil.getParentOfType(this, javaClass(), javaClass())!! diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/move/moveTopLevelDeclarations/ui/MoveKotlinTopLevelDeclarationsDialog.java b/idea/src/org/jetbrains/jet/plugin/refactoring/move/moveTopLevelDeclarations/ui/MoveKotlinTopLevelDeclarationsDialog.java index fa409607fbd..b3ae982fbb1 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/move/moveTopLevelDeclarations/ui/MoveKotlinTopLevelDeclarationsDialog.java +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/move/moveTopLevelDeclarations/ui/MoveKotlinTopLevelDeclarationsDialog.java @@ -77,10 +77,12 @@ import com.intellij.ui.ReferenceEditorComboWithBrowseButton; import com.intellij.usageView.UsageViewUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.ui.UIUtil; +import kotlin.Function0; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetNamedDeclaration; +import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.plugin.refactoring.JetRefactoringBundle; import org.jetbrains.jet.plugin.refactoring.RefactoringPackage; import org.jetbrains.jet.plugin.refactoring.move.moveTopLevelDeclarations.*; @@ -195,9 +197,9 @@ public class MoveKotlinTopLevelDeclarationsDialog extends RefactoringDialog { } private void initFileChooser(JetFile targetFile) { - FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleFileNoJarsDescriptor(); - descriptor.setRoots(ProjectRootManager.getInstance(myProject).getContentRoots()); - descriptor.setIsTreeRootVisible(true); + FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleFileNoJarsDescriptor() + .withRoots(ProjectRootManager.getInstance(myProject).getContentRoots()) + .withTreeRootVisible(true); String title = JetRefactoringBundle.message("refactoring.move.top.level.declaration.file.title"); fileChooser.addBrowseFolderListener(title, null, myProject, descriptor, TextComponentAccessor.TEXT_FIELD_WHOLE_TEXT); @@ -291,10 +293,30 @@ public class MoveKotlinTopLevelDeclarationsDialog extends RefactoringDialog { return moveDestination != null ? new MoveDestinationKotlinMoveTarget(moveDestination) : null; } - JetFile jetFile = (JetFile) RefactoringPackage.toPsiFile(new File(getTargetFilePath()), myProject); - assert jetFile != null : "Non-Kotlin files must be filtered out before starting the refactoring"; + final File targetFile = new File(getTargetFilePath()); + JetFile jetFile = (JetFile) RefactoringPackage.toPsiFile(targetFile, myProject); + if (jetFile != null) return new JetFileKotlinMoveTarget(jetFile); - return new JetFileKotlinMoveTarget(jetFile); + File targetDir = targetFile.getParentFile(); + final PsiDirectory psiDirectory = RefactoringPackage.toPsiDirectory(targetDir, myProject); + assert psiDirectory != null : "No directory found: " + targetDir.getPath(); + + PsiPackage psiPackage = JavaDirectoryService.getInstance().getPackage(psiDirectory); + if (psiPackage == null) { + setErrorText("Could not find package corresponding to " + targetDir.getPath()); + return null; + } + + return new DeferredJetFileKotlinMoveTarget( + myProject, + new FqName(psiPackage.getQualifiedName()), + new Function0() { + @Override + public JetFile invoke() { + return RefactoringPackage.createKotlinFile(targetFile.getName(), psiDirectory); + } + } + ); } @Nullable @@ -307,7 +329,7 @@ public class MoveKotlinTopLevelDeclarationsDialog extends RefactoringDialog { } else { PsiFile targetFile = RefactoringPackage.toPsiFile(new File(getTargetFilePath()), myProject); - if (!(targetFile instanceof JetFile)) { + if (!(targetFile == null || targetFile instanceof JetFile)) { return JetRefactoringBundle.message("refactoring.move.non.kotlin.file"); } }