[FIR] Enhance caches in providers

This commit is contained in:
Simon Ogorodnik
2019-06-14 19:50:21 +03:00
committed by Mikhail Glukhikh
parent f88fafea9d
commit 03c3469a14
2 changed files with 10 additions and 10 deletions
@@ -55,6 +55,7 @@ import org.jetbrains.kotlin.resolve.jvm.JvmClassName
import org.jetbrains.kotlin.serialization.deserialization.IncompatibleVersionErrorData
import org.jetbrains.kotlin.serialization.deserialization.getName
import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult
import org.jetbrains.kotlin.utils.getOrPutNullable
class KotlinDeserializedJvmSymbolsProvider(
val session: FirSession,
@@ -63,10 +64,9 @@ class KotlinDeserializedJvmSymbolsProvider(
private val kotlinClassFinder: KotlinClassFinder,
private val javaClassFinder: JavaClassFinder
) : AbstractFirSymbolProvider() {
private val classesCache = mutableMapOf<ClassId, FirClassSymbol>()
private val typeAliasCache = mutableMapOf<ClassId, FirTypeAliasSymbol?>()
private val packagePartsCache = mutableMapOf<FqName, Collection<PackagePartsCacheData>>()
private val classesCache = HashMap<ClassId, FirClassSymbol>()
private val typeAliasCache = HashMap<ClassId, FirTypeAliasSymbol?>()
private val packagePartsCache = HashMap<FqName, Collection<PackagePartsCacheData>>()
private class PackagePartsCacheData(
val proto: ProtoBuf.Package,
@@ -156,7 +156,7 @@ class KotlinDeserializedJvmSymbolsProvider(
private fun findAndDeserializeTypeAlias(
classId: ClassId
): FirTypeAliasSymbol? {
return typeAliasCache.getOrPut(classId) {
return typeAliasCache.getOrPutNullable(classId) {
getPackageParts(classId.packageFqName).firstNotNullResult { part ->
val ids = part.typeAliasNameIndex[classId.shortClassName]
if (ids == null || ids.isEmpty()) return@firstNotNullResult null
@@ -15,12 +15,12 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
abstract class AbstractFirSymbolProvider : FirSymbolProvider() {
protected val classCache = mutableMapOf<ClassId, ConeClassLikeSymbol?>()
protected val topLevelCallableCache = mutableMapOf<CallableId, List<ConeCallableSymbol>>()
protected val packageCache = mutableMapOf<FqName, FqName?>()
protected val classCache = HashMap<ClassId, ConeClassLikeSymbol?>()
protected val topLevelCallableCache = HashMap<CallableId, List<ConeCallableSymbol>>()
protected val packageCache = HashMap<FqName, FqName?>()
protected inline fun <K, V : Any?> MutableMap<K, V>.lookupCacheOrCalculate(key: K, crossinline l: (K) -> V): V? {
return if (key in this.keys) {
return if (containsKey(key)) {
this[key]
} else {
val calculated = l(key)
@@ -32,7 +32,7 @@ abstract class AbstractFirSymbolProvider : FirSymbolProvider() {
protected inline fun <K, V : Any?, T> MutableMap<K, V>.lookupCacheOrCalculateWithPostCompute(
key: K, crossinline l: (K) -> Pair<V, T>, postCompute: (V, T) -> Unit
): V? {
return if (key in this.keys) {
return if (containsKey(key)) {
this[key]
} else {
val calculated = l(key)