From 2d4cbc712d1bf1868d724612e21b90d9d106cf44 Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Mon, 9 Jul 2018 14:37:11 +0300 Subject: [PATCH] KT-25012: Use index to check is java file selected instead of traversing file tree Add initial estimation via fileType index #KT-25012 fixed --- .../kotlin/idea/actions/JavaToKotlinAction.kt | 13 ++++++++++--- .../kotlin/idea/actions/JavaToKotlinAction.kt.173 | 13 ++++++++++--- .../kotlin/idea/actions/JavaToKotlinAction.kt.182 | 13 ++++++++++--- .../kotlin/idea/actions/JavaToKotlinAction.kt.as31 | 13 ++++++++++--- .../kotlin/idea/actions/JavaToKotlinAction.kt.as32 | 13 ++++++++++--- 5 files changed, 50 insertions(+), 15 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/actions/JavaToKotlinAction.kt b/idea/src/org/jetbrains/kotlin/idea/actions/JavaToKotlinAction.kt index 690f8e1a0e9..c36e54ccbf5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/actions/JavaToKotlinAction.kt +++ b/idea/src/org/jetbrains/kotlin/idea/actions/JavaToKotlinAction.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.idea.actions import com.intellij.codeInsight.navigation.NavigationUtil +import com.intellij.ide.highlighter.JavaFileType import com.intellij.ide.scratch.ScratchFileService import com.intellij.ide.scratch.ScratchRootType import com.intellij.openapi.actionSystem.AnAction @@ -36,6 +37,8 @@ import com.intellij.psi.PsiDocumentManager import com.intellij.psi.PsiErrorElement import com.intellij.psi.PsiJavaFile import com.intellij.psi.PsiManager +import com.intellij.psi.search.FileTypeIndex +import com.intellij.psi.search.GlobalSearchScopesCore import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.idea.j2k.IdeaJavaToKotlinServices @@ -182,10 +185,14 @@ class JavaToKotlinAction : AnAction() { } private fun isAnyJavaFileSelected(project: Project, files: Array): Boolean { - val manager = PsiManager.getInstance(project) - if (files.any { manager.findFile(it) is PsiJavaFile && it.isWritable }) return true - return files.any { it.isDirectory && isAnyJavaFileSelected(project, it.children) } + val filesScope = GlobalSearchScopesCore.directoriesScope(project, true, *files) + val potentialJavaFiles = FileTypeIndex.getFiles(JavaFileType.INSTANCE, filesScope) + + if (potentialJavaFiles.isEmpty()) return false + + val manager = PsiManager.getInstance(project) + return potentialJavaFiles.any { manager.findFile(it) is PsiJavaFile && it.isWritable } } private fun selectedJavaFiles(e: AnActionEvent): Sequence { diff --git a/idea/src/org/jetbrains/kotlin/idea/actions/JavaToKotlinAction.kt.173 b/idea/src/org/jetbrains/kotlin/idea/actions/JavaToKotlinAction.kt.173 index bc809416c2e..045bc0cb2e5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/actions/JavaToKotlinAction.kt.173 +++ b/idea/src/org/jetbrains/kotlin/idea/actions/JavaToKotlinAction.kt.173 @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.idea.actions import com.intellij.codeInsight.navigation.NavigationUtil +import com.intellij.ide.highlighter.JavaFileType import com.intellij.ide.scratch.ScratchFileService import com.intellij.ide.scratch.ScratchRootType import com.intellij.openapi.actionSystem.AnAction @@ -36,6 +37,8 @@ import com.intellij.psi.PsiDocumentManager import com.intellij.psi.PsiErrorElement import com.intellij.psi.PsiJavaFile import com.intellij.psi.PsiManager +import com.intellij.psi.search.FileTypeIndex +import com.intellij.psi.search.GlobalSearchScopesCore import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.idea.j2k.IdeaJavaToKotlinServices @@ -182,10 +185,14 @@ class JavaToKotlinAction : AnAction() { } private fun isAnyJavaFileSelected(project: Project, files: Array): Boolean { - val manager = PsiManager.getInstance(project) - if (files.any { manager.findFile(it) is PsiJavaFile && it.isWritable }) return true - return files.any { it.isDirectory && isAnyJavaFileSelected(project, it.children) } + val filesScope = GlobalSearchScopesCore.directoriesScope(project, true, *files) + val potentialJavaFiles = FileTypeIndex.getFiles(JavaFileType.INSTANCE, filesScope) + + if (potentialJavaFiles.isEmpty()) return false + + val manager = PsiManager.getInstance(project) + return potentialJavaFiles.any { manager.findFile(it) is PsiJavaFile && it.isWritable } } private fun selectedJavaFiles(e: AnActionEvent): Sequence { diff --git a/idea/src/org/jetbrains/kotlin/idea/actions/JavaToKotlinAction.kt.182 b/idea/src/org/jetbrains/kotlin/idea/actions/JavaToKotlinAction.kt.182 index c05f0be224e..dee513bdf2d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/actions/JavaToKotlinAction.kt.182 +++ b/idea/src/org/jetbrains/kotlin/idea/actions/JavaToKotlinAction.kt.182 @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.idea.actions import com.intellij.codeInsight.navigation.NavigationUtil +import com.intellij.ide.highlighter.JavaFileType import com.intellij.ide.scratch.ScratchFileService import com.intellij.ide.scratch.ScratchRootType import com.intellij.openapi.actionSystem.AnAction @@ -37,6 +38,8 @@ import com.intellij.psi.PsiDocumentManager import com.intellij.psi.PsiErrorElement import com.intellij.psi.PsiJavaFile import com.intellij.psi.PsiManager +import com.intellij.psi.search.FileTypeIndex +import com.intellij.psi.search.GlobalSearchScopesCore import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.idea.j2k.IdeaJavaToKotlinServices @@ -187,10 +190,14 @@ class JavaToKotlinAction : AnAction() { } private fun isAnyJavaFileSelected(project: Project, files: Array): Boolean { - val manager = PsiManager.getInstance(project) - if (files.any { manager.findFile(it) is PsiJavaFile && it.isWritable }) return true - return files.any { it.isDirectory && isAnyJavaFileSelected(project, it.children) } + val filesScope = GlobalSearchScopesCore.directoriesScope(project, true, *files) + val potentialJavaFiles = FileTypeIndex.getFiles(JavaFileType.INSTANCE, filesScope) + + if (potentialJavaFiles.isEmpty()) return false + + val manager = PsiManager.getInstance(project) + return potentialJavaFiles.any { manager.findFile(it) is PsiJavaFile && it.isWritable } } private fun selectedJavaFiles(e: AnActionEvent): Sequence { diff --git a/idea/src/org/jetbrains/kotlin/idea/actions/JavaToKotlinAction.kt.as31 b/idea/src/org/jetbrains/kotlin/idea/actions/JavaToKotlinAction.kt.as31 index aeef9d02f32..8670340eb90 100644 --- a/idea/src/org/jetbrains/kotlin/idea/actions/JavaToKotlinAction.kt.as31 +++ b/idea/src/org/jetbrains/kotlin/idea/actions/JavaToKotlinAction.kt.as31 @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.idea.actions import com.intellij.codeInsight.navigation.NavigationUtil +import com.intellij.ide.highlighter.JavaFileType import com.intellij.ide.scratch.ScratchFileService import com.intellij.ide.scratch.ScratchRootType import com.intellij.openapi.actionSystem.AnAction @@ -36,6 +37,8 @@ import com.intellij.psi.PsiDocumentManager import com.intellij.psi.PsiErrorElement import com.intellij.psi.PsiJavaFile import com.intellij.psi.PsiManager +import com.intellij.psi.search.FileTypeIndex +import com.intellij.psi.search.GlobalSearchScopesCore import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.idea.j2k.IdeaJavaToKotlinServices @@ -184,10 +187,14 @@ class JavaToKotlinAction : AnAction() { } private fun isAnyJavaFileSelected(project: Project, files: Array): Boolean { - val manager = PsiManager.getInstance(project) - if (files.any { manager.findFile(it) is PsiJavaFile && it.isWritable }) return true - return files.any { it.isDirectory && isAnyJavaFileSelected(project, it.children) } + val filesScope = GlobalSearchScopesCore.directoriesScope(project, true, *files) + val potentialJavaFiles = FileTypeIndex.getFiles(JavaFileType.INSTANCE, filesScope) + + if (potentialJavaFiles.isEmpty()) return false + + val manager = PsiManager.getInstance(project) + return potentialJavaFiles.any { manager.findFile(it) is PsiJavaFile && it.isWritable } } private fun selectedJavaFiles(e: AnActionEvent): Sequence { diff --git a/idea/src/org/jetbrains/kotlin/idea/actions/JavaToKotlinAction.kt.as32 b/idea/src/org/jetbrains/kotlin/idea/actions/JavaToKotlinAction.kt.as32 index 42021706795..fb9a034c2c3 100644 --- a/idea/src/org/jetbrains/kotlin/idea/actions/JavaToKotlinAction.kt.as32 +++ b/idea/src/org/jetbrains/kotlin/idea/actions/JavaToKotlinAction.kt.as32 @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.idea.actions import com.intellij.codeInsight.navigation.NavigationUtil +import com.intellij.ide.highlighter.JavaFileType import com.intellij.ide.scratch.ScratchFileService import com.intellij.ide.scratch.ScratchRootType import com.intellij.openapi.actionSystem.AnAction @@ -36,6 +37,8 @@ import com.intellij.psi.PsiDocumentManager import com.intellij.psi.PsiErrorElement import com.intellij.psi.PsiJavaFile import com.intellij.psi.PsiManager +import com.intellij.psi.search.FileTypeIndex +import com.intellij.psi.search.GlobalSearchScopesCore import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.idea.j2k.IdeaJavaToKotlinServices @@ -184,10 +187,14 @@ class JavaToKotlinAction : AnAction() { } private fun isAnyJavaFileSelected(project: Project, files: Array): Boolean { - val manager = PsiManager.getInstance(project) - if (files.any { manager.findFile(it) is PsiJavaFile && it.isWritable }) return true - return files.any { it.isDirectory && isAnyJavaFileSelected(project, it.children) } + val filesScope = GlobalSearchScopesCore.directoriesScope(project, true, *files) + val potentialJavaFiles = FileTypeIndex.getFiles(JavaFileType.INSTANCE, filesScope) + + if (potentialJavaFiles.isEmpty()) return false + + val manager = PsiManager.getInstance(project) + return potentialJavaFiles.any { manager.findFile(it) is PsiJavaFile && it.isWritable } } private fun selectedJavaFiles(e: AnActionEvent): Sequence {