From f100015e58460edbb935c1b0848e9cfe86d42578 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Tue, 21 Oct 2014 13:40:35 +0400 Subject: [PATCH] JavaToKotlinAction refactorings + minor fixes in the logic --- .../jet/plugin/actions/JavaToKotlinAction.kt | 121 ++++++++---------- 1 file changed, 56 insertions(+), 65 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/actions/JavaToKotlinAction.kt b/idea/src/org/jetbrains/jet/plugin/actions/JavaToKotlinAction.kt index 7cc92bcefb2..dff1a4c70d8 100644 --- a/idea/src/org/jetbrains/jet/plugin/actions/JavaToKotlinAction.kt +++ b/idea/src/org/jetbrains/jet/plugin/actions/JavaToKotlinAction.kt @@ -31,7 +31,6 @@ import com.intellij.openapi.project.Project import com.intellij.psi.PsiJavaFile import com.intellij.psi.PsiManager import java.util.ArrayList -import java.util.HashSet import com.intellij.openapi.application.ApplicationManager import com.intellij.psi.codeStyle.CodeStyleManager import java.io.IOException @@ -41,12 +40,13 @@ import org.jetbrains.jet.plugin.j2k.J2kPostProcessor import com.intellij.psi.PsiElement import org.jetbrains.jet.j2k.PostProcessor import com.intellij.openapi.vfs.CharsetToolkit +import org.jetbrains.jet.lang.psi.JetFile public class JavaToKotlinAction : AnAction() { override fun actionPerformed(e: AnActionEvent) { val virtualFiles = e.getData(CommonDataKeys.VIRTUAL_FILE_ARRAY)!! val project = CommonDataKeys.PROJECT.getData(e.getDataContext())!! - val selectedJavaFiles = getAllJavaFiles(virtualFiles, project) + val selectedJavaFiles = allJavaFiles(virtualFiles, project) if (selectedJavaFiles.isEmpty()) return val converter = JavaToKotlinConverter(project, ConverterSettings.defaultSettings, FilesConversionScope(selectedJavaFiles), IdeaReferenceSearcher) @@ -55,107 +55,98 @@ public class JavaToKotlinAction : AnAction() { val newFiles = convertFiles(converter, selectedJavaFiles) deleteFiles(selectedJavaFiles) reformatFiles(newFiles, project) - for (vf in newFiles) { - FileEditorManager.getInstance(project).openFile(vf, true) + + if (newFiles.size() == 1) { + FileEditorManager.getInstance(project).openFile(newFiles.single(), true) } } - }, "Convert files from Java to Kotlin", "group_id") + }, "Convert files from Java to Kotlin", null) } override fun update(e: AnActionEvent) { - val enabled = e.getData>(CommonDataKeys.VIRTUAL_FILE_ARRAY) != null - e.getPresentation().setVisible(enabled) + val enabled = e.getData(CommonDataKeys.VIRTUAL_FILE_ARRAY)?.isNotEmpty() ?: false e.getPresentation().setEnabled(enabled) } - private fun getChildrenRecursive(baseDir: VirtualFile?): List { - val result = LinkedList() - val children = if (baseDir != null) baseDir.getChildren() else VirtualFile.EMPTY_ARRAY - result.addAll(children) - for (f in children) { - result.addAll(getChildrenRecursive(f)) - } - return result - } - - private fun getAllJavaFiles(vFiles: Array, project: Project): List { - val filesSet = allVirtualFiles(vFiles) + private fun allJavaFiles(filesOrDirs: Array, project: Project): List { + val allFiles = allFiles(filesOrDirs) val manager = PsiManager.getInstance(project) - val res = ArrayList() - for (file in filesSet) { + val result = ArrayList() + for (file in allFiles) { val psiFile = manager.findFile(file) - if (psiFile != null && psiFile is PsiJavaFile) { - res.add(psiFile) + if (psiFile is PsiJavaFile) { + result.add(psiFile) } } - return res + return result } - private fun allVirtualFiles(vFiles: Array): Set { - val filesSet = HashSet() - for (f in vFiles) { - filesSet.add(f) - filesSet.addAll(getChildrenRecursive(f)) + private fun allFiles(filesOrDirs: Array): Collection { + val result = ArrayList() + filesOrDirs.forEach { result.addFilesRecursive(it) } + return result + } + + private fun MutableCollection.addFilesRecursive(root: VirtualFile) { + if (root.isDirectory()) { + root.getChildren()!!.forEach { + addFilesRecursive(it) + } + } + else { + add(root) } - return filesSet } - private fun reformatFiles(allJetFiles: List, project: Project) { - for (vf in allJetFiles) { + private fun reformatFiles(kotlinFiles: List, project: Project) { + for (file in kotlinFiles) { ApplicationManager.getApplication().runWriteAction { - val psiFile = PsiManager.getInstance(project).findFile(vf) - if (psiFile != null) { - CodeStyleManager.getInstance(project).reformat(psiFile) + val jetFile = PsiManager.getInstance(project).findFile(file) as? JetFile + if (jetFile != null) { + CodeStyleManager.getInstance(project).reformat(jetFile) } } } } - private fun convertFiles(converter: JavaToKotlinConverter, allJavaFilesNear: List): List { - val result = LinkedList() - for (f in allJavaFilesNear) { + private fun convertFiles(converter: JavaToKotlinConverter, javaFiles: List): List { + val result = ArrayList() + for (psiFile in javaFiles) { ApplicationManager.getApplication().runWriteAction { - val vf = convertOneFile(converter, f) - if (vf != null) { - result.add(vf) + val file = convertOneFile(converter, psiFile) + if (file != null) { + result.add(file) } } } return result } - private fun deleteFiles(allJavaFilesNear: List) { - for (psiFile in allJavaFilesNear) { - ApplicationManager.getApplication().runWriteAction(object : Runnable { - override fun run() { - try { - psiFile.getVirtualFile()?.delete(this) - } - catch (e: IOException) { - MessagesEx.error(psiFile.getProject(), e.getMessage()).showLater() - } + private fun deleteFiles(javaFiles: List) { + for (psiFile in javaFiles) { + ApplicationManager.getApplication().runWriteAction { + try { + psiFile.getVirtualFile()?.delete(this) } - }) + catch (e: IOException) { + MessagesEx.error(psiFile.getProject(), e.getMessage()).showLater() + } + } } } - private private fun convertOneFile(converter: JavaToKotlinConverter, psiFile: PsiFile): VirtualFile? { + private fun convertOneFile(converter: JavaToKotlinConverter, psiFile: PsiJavaFile): VirtualFile? { try { - val virtualFile = psiFile.getVirtualFile() - if (psiFile is PsiJavaFile && virtualFile != null) { - val postProcessor = J2kPostProcessor(psiFile) - val result = converter.elementsToKotlin(Pair(psiFile, postProcessor)).get(0) //TODO: convert all files in one call! - val manager = psiFile.getManager() - assert(manager != null) - val copy = virtualFile.copy(manager, virtualFile.getParent(), virtualFile.getNameWithoutExtension() + ".kt") - copy.setBinaryContent(CharsetToolkit.getUtf8Bytes(result)) - return copy - } + val virtualFile = psiFile.getVirtualFile()!! + val postProcessor = J2kPostProcessor(psiFile) + val result = converter.elementsToKotlin(Pair(psiFile, postProcessor)).get(0) //TODO: convert all files in one call! + val kotlinFile = virtualFile.copy(this, virtualFile.getParent(), virtualFile.getNameWithoutExtension() + ".kt") + kotlinFile.setBinaryContent(CharsetToolkit.getUtf8Bytes(result)) + return kotlinFile } catch (e: IOException) { MessagesEx.error(psiFile.getProject(), e.getMessage()).showLater() + return null } - - return null } }