FIR Java: implement knownClassNamesInPackage optimization

This commit is contained in:
Simon Ogorodnik
2019-04-10 21:23:54 +03:00
committed by Mikhail Glukhikh
parent a51b7fb8d0
commit 082e9d1cd7
@@ -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<FqName, Set<String>?>()
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(".")