From 289b838d77c0a18cc256b559cb2a1d26158e49c0 Mon Sep 17 00:00:00 2001 From: Vladimir Dolzhenko Date: Sat, 29 Jan 2022 23:55:56 +0100 Subject: [PATCH] [kotlin] Optimize file.fileType calculation #KTIJ-20095 --- .../load/java/AbstractJavaClassFinder.kt | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/AbstractJavaClassFinder.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/AbstractJavaClassFinder.kt index b946ea25b74..c95a5117b87 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/AbstractJavaClassFinder.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/AbstractJavaClassFinder.kt @@ -16,6 +16,10 @@ package org.jetbrains.kotlin.load.java +import com.intellij.ide.highlighter.JavaClassFileType +import com.intellij.ide.highlighter.JavaFileType +import com.intellij.openapi.fileTypes.FileTypeRegistry +import com.intellij.openapi.fileTypes.UnknownFileType import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.search.DelegatingGlobalSearchScope @@ -68,9 +72,22 @@ abstract class AbstractJavaClassFinder : JavaClassFinder { override val topPackageNames: Set? get() = (myBaseScope as? TopPackageNamesProvider)?.topPackageNames - override fun contains(file: VirtualFile) = - (file.isDirectory || file.fileType !== KotlinFileType.INSTANCE) && - myBaseScope.contains(file) + override fun contains(file: VirtualFile): Boolean { + // KTIJ-20095: optimization to avoid heavy file.fileType calculation + val extension = file.extension + val ktFile = + when { + file.isDirectory -> false + extension == KotlinFileType.EXTENSION -> true + extension == JavaFileType.DEFAULT_EXTENSION || extension == JavaClassFileType.INSTANCE.defaultExtension -> false + else -> { + val fileTypeByFileName = FileTypeRegistry.getInstance().getFileTypeByFileName(file.name) + fileTypeByFileName == KotlinFileType.INSTANCE || fileTypeByFileName == UnknownFileType.INSTANCE && + FileTypeRegistry.getInstance().isFileOfType(file, KotlinFileType.INSTANCE) + } + } + return !ktFile && myBaseScope.contains(file) + } val base: GlobalSearchScope = myBaseScope