From 0b4c7588dad3c25ffa9c4a88dc79a6bde4c26a05 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 29 Oct 2014 18:17:01 +0300 Subject: [PATCH] Java to Kotlin action: no infinite recursion for symlinks + more efficient update() --- .../jet/plugin/actions/JavaToKotlinAction.kt | 47 ++++++++----------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/actions/JavaToKotlinAction.kt b/idea/src/org/jetbrains/jet/plugin/actions/JavaToKotlinAction.kt index 1934f2d273b..e898d9e9f10 100644 --- a/idea/src/org/jetbrains/jet/plugin/actions/JavaToKotlinAction.kt +++ b/idea/src/org/jetbrains/jet/plugin/actions/JavaToKotlinAction.kt @@ -39,10 +39,12 @@ import com.intellij.openapi.vfs.CharsetToolkit import org.jetbrains.jet.lang.psi.JetFile import org.jetbrains.jet.utils.addIfNotNull import org.jetbrains.jet.plugin.caches.resolve.getLazyResolveSession +import com.intellij.openapi.vfs.VfsUtilCore +import com.intellij.openapi.vfs.VirtualFileVisitor public class JavaToKotlinAction : AnAction() { override fun actionPerformed(e: AnActionEvent) { - val selectedJavaFiles = selectedJavaFiles(e) + val selectedJavaFiles = selectedJavaFiles(e).toList() val project = CommonDataKeys.PROJECT.getData(e.getDataContext())!! CommandProcessor.getInstance().executeCommand(project, object : Runnable { @@ -59,46 +61,37 @@ public class JavaToKotlinAction : AnAction() { } override fun update(e: AnActionEvent) { - val enabled = selectedJavaFiles(e).isNotEmpty() + val enabled = selectedJavaFiles(e).any() e.getPresentation().setEnabled(enabled) } - private fun selectedJavaFiles(e: AnActionEvent): List { - val virtualFiles = e.getData(CommonDataKeys.VIRTUAL_FILE_ARRAY) ?: return listOf() - val project = CommonDataKeys.PROJECT.getData(e.getDataContext()) ?: return listOf() + private fun selectedJavaFiles(e: AnActionEvent): Stream { + val virtualFiles = e.getData(CommonDataKeys.VIRTUAL_FILE_ARRAY) ?: return streamOf() + val project = CommonDataKeys.PROJECT.getData(e.getDataContext()) ?: return streamOf() return allJavaFiles(virtualFiles, project) } - private fun allJavaFiles(filesOrDirs: Array, project: Project): List { - val allFiles = allFiles(filesOrDirs) + private fun allJavaFiles(filesOrDirs: Array, project: Project): Stream { val manager = PsiManager.getInstance(project) - val result = ArrayList() - for (file in allFiles) { - val psiFile = manager.findFile(file) - if (psiFile is PsiJavaFile) { - result.add(psiFile) - } - } - return result + return allFiles(filesOrDirs) + .stream() + .map { manager.findFile(it) as? PsiJavaFile } + .filterNotNull() } private fun allFiles(filesOrDirs: Array): Collection { val result = ArrayList() - filesOrDirs.forEach { result.addFilesRecursive(it) } + for (file in filesOrDirs) { + VfsUtilCore.visitChildrenRecursively(file, object : VirtualFileVisitor() { + override fun visitFile(file: VirtualFile): Boolean { + result.add(file) + return true + } + }) + } return result } - private fun MutableCollection.addFilesRecursive(root: VirtualFile) { - if (root.isDirectory()) { - root.getChildren()!!.forEach { - addFilesRecursive(it) - } - } - else { - add(root) - } - } - private fun reformatFiles(kotlinFiles: List, project: Project) { for (file in kotlinFiles) { ApplicationManager.getApplication().runWriteAction {