From b618855e2caa87a199c0026566b551da87a18d44 Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Tue, 6 Sep 2022 14:19:16 +0200 Subject: [PATCH] [lc] KotlinAsJavaSupportBase: add more lightweight checks for facades ^KT-50241 --- .../kotlin/asJava/KotlinAsJavaSupportBase.kt | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/KotlinAsJavaSupportBase.kt b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/KotlinAsJavaSupportBase.kt index 47db0477c81..14c358c2451 100644 --- a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/KotlinAsJavaSupportBase.kt +++ b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/KotlinAsJavaSupportBase.kt @@ -23,12 +23,11 @@ import org.jetbrains.kotlin.psi.* abstract class KotlinAsJavaSupportBase(protected val project: Project) : KotlinAsJavaSupport() { fun createLightFacade(file: KtFile): Pair? { - if (file.isScript()) return null - if (file.isCompiled && !file.name.endsWith(".class")) return null + if (!file.facadeIsPossible()) return null val module = file.findModule().takeIf { facadeIsApplicable(it, file) } ?: return null val facadeFqName = file.javaFileFacadeFqName - val facadeFiles = if (file.isJvmMultifileClassFile && !file.isCompiled) { + val facadeFiles = if (file.canHaveAdditionalFilesInFacade()) { findFilesForFacade(facadeFqName, module.contentSearchScope).filter(KtFile::isJvmMultifileClassFile) } else { listOf(file) @@ -48,6 +47,18 @@ abstract class KotlinAsJavaSupportBase(protected val project: Project) } } + /** + * lightweight applicability check + */ + private fun KtFile.facadeIsPossible(): Boolean = when { + isCompiled && !name.endsWith(".class") -> false + isScript() -> false + canHaveAdditionalFilesInFacade() -> true + else -> hasTopLevelCallables() + } + + private fun KtFile.canHaveAdditionalFilesInFacade(): Boolean = !isCompiled && isJvmMultifileClassFile + protected abstract fun KtFile.findModule(): TModule protected abstract fun facadeIsApplicable(module: TModule, file: KtFile): Boolean protected abstract val TModule.contentSearchScope: GlobalSearchScope @@ -88,11 +99,17 @@ abstract class KotlinAsJavaSupportBase(protected val project: Project) override fun getFacadeNames(packageFqName: FqName, scope: GlobalSearchScope): Collection { return findFilesForFacadeByPackage(packageFqName, scope).mapNotNullTo(mutableSetOf()) { file -> - file.takeIf { facadeIsApplicable(it.findModule(), file) }?.javaFileFacadeFqName?.shortName()?.asString() + file.takeIf { it.facadeIsPossible() } + ?.takeIf { facadeIsApplicable(it.findModule(), file) } + ?.javaFileFacadeFqName + ?.shortName() + ?.asString() }.toSet() } - private fun Collection.toFacadeClasses(): List = groupBy { + private fun Collection.toFacadeClasses(): List = filter { + it.facadeIsPossible() + }.groupBy { FacadeKey(it.javaFileFacadeFqName, it.isJvmMultifileClassFile, it.findModule()) }.mapNotNull { (key, files) -> files.firstOrNull { facadeIsApplicable(key.module, it) }?.let(::getLightFacade)