Move declaration: Create new file when needed
This commit is contained in:
@@ -97,6 +97,10 @@ public fun File.toPsiFile(project: Project): PsiFile? {
|
|||||||
return toVirtualFile()?.let { vfile -> PsiManager.getInstance(project).findFile(vfile) }
|
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 {
|
public fun PsiElement.getUsageContext(): PsiElement {
|
||||||
return when (this) {
|
return when (this) {
|
||||||
is JetElement -> PsiTreeUtil.getParentOfType(this, javaClass<JetNamedDeclaration>(), javaClass<JetFile>())!!
|
is JetElement -> PsiTreeUtil.getParentOfType(this, javaClass<JetNamedDeclaration>(), javaClass<JetFile>())!!
|
||||||
|
|||||||
+29
-7
@@ -77,10 +77,12 @@ import com.intellij.ui.ReferenceEditorComboWithBrowseButton;
|
|||||||
import com.intellij.usageView.UsageViewUtil;
|
import com.intellij.usageView.UsageViewUtil;
|
||||||
import com.intellij.util.IncorrectOperationException;
|
import com.intellij.util.IncorrectOperationException;
|
||||||
import com.intellij.util.ui.UIUtil;
|
import com.intellij.util.ui.UIUtil;
|
||||||
|
import kotlin.Function0;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.lang.psi.JetFile;
|
import org.jetbrains.jet.lang.psi.JetFile;
|
||||||
import org.jetbrains.jet.lang.psi.JetNamedDeclaration;
|
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.JetRefactoringBundle;
|
||||||
import org.jetbrains.jet.plugin.refactoring.RefactoringPackage;
|
import org.jetbrains.jet.plugin.refactoring.RefactoringPackage;
|
||||||
import org.jetbrains.jet.plugin.refactoring.move.moveTopLevelDeclarations.*;
|
import org.jetbrains.jet.plugin.refactoring.move.moveTopLevelDeclarations.*;
|
||||||
@@ -195,9 +197,9 @@ public class MoveKotlinTopLevelDeclarationsDialog extends RefactoringDialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void initFileChooser(JetFile targetFile) {
|
private void initFileChooser(JetFile targetFile) {
|
||||||
FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleFileNoJarsDescriptor();
|
FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleFileNoJarsDescriptor()
|
||||||
descriptor.setRoots(ProjectRootManager.getInstance(myProject).getContentRoots());
|
.withRoots(ProjectRootManager.getInstance(myProject).getContentRoots())
|
||||||
descriptor.setIsTreeRootVisible(true);
|
.withTreeRootVisible(true);
|
||||||
|
|
||||||
String title = JetRefactoringBundle.message("refactoring.move.top.level.declaration.file.title");
|
String title = JetRefactoringBundle.message("refactoring.move.top.level.declaration.file.title");
|
||||||
fileChooser.addBrowseFolderListener(title, null, myProject, descriptor, TextComponentAccessor.TEXT_FIELD_WHOLE_TEXT);
|
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;
|
return moveDestination != null ? new MoveDestinationKotlinMoveTarget(moveDestination) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
JetFile jetFile = (JetFile) RefactoringPackage.toPsiFile(new File(getTargetFilePath()), myProject);
|
final File targetFile = new File(getTargetFilePath());
|
||||||
assert jetFile != null : "Non-Kotlin files must be filtered out before starting the refactoring";
|
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<JetFile>() {
|
||||||
|
@Override
|
||||||
|
public JetFile invoke() {
|
||||||
|
return RefactoringPackage.createKotlinFile(targetFile.getName(), psiDirectory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@@ -307,7 +329,7 @@ public class MoveKotlinTopLevelDeclarationsDialog extends RefactoringDialog {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
PsiFile targetFile = RefactoringPackage.toPsiFile(new File(getTargetFilePath()), myProject);
|
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");
|
return JetRefactoringBundle.message("refactoring.move.non.kotlin.file");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user