From 082e9d1cd76ffa651455e94deca21eb9d6d74474 Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Wed, 10 Apr 2019 21:23:54 +0300 Subject: [PATCH] FIR Java: implement knownClassNamesInPackage optimization --- .../kotlin/fir/java/JavaSymbolProvider.kt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt index 649a81e70a7..a7715f36e97 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt @@ -51,6 +51,7 @@ class JavaSymbolProvider( } override fun getClassLikeSymbolByFqName(classId: ClassId): ConeClassLikeSymbol? { + if (!hasTopLevelClassOf(classId)) return null return classCache.lookupCacheOrCalculateWithPostCompute(classId, { val foundClass = findClass(classId) if (foundClass == null || foundClass.annotations.any { it.classId?.asSingleFqName() == JvmAnnotationNames.METADATA_FQ_NAME }) { @@ -152,5 +153,18 @@ class JavaSymbolProvider( .filter { it.classId.relativeClassName.parent().isRoot } .map { it.fir } } + + private val knownClassNamesInPackage = mutableMapOf?>() + + private fun hasTopLevelClassOf(classId: ClassId): Boolean { + val knownNames = knownClassNamesInPackage.getOrPut(classId.packageFqName) { + facade.knownClassNamesInPackage(classId.packageFqName) + } ?: return true + return classId.relativeClassName.topLevelName() in knownNames + } } +fun FqName.topLevelName() = + asString().substringBefore(".") + +