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