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