[FIR] Use post-compute in typeAliasCache for deserialized symbols

^KTIJ-24156 Fixed
This commit is contained in:
aleksandrina-streltsova
2023-01-09 13:27:36 +02:00
committed by Space Team
parent 3a6e3290aa
commit c6886fc779
2 changed files with 21 additions and 6 deletions
@@ -64,6 +64,8 @@ abstract class LibraryPathFilter {
typealias DeserializedClassPostProcessor = (FirRegularClassSymbol) -> Unit
typealias DeserializedTypeAliasPostProcessor = (FirTypeAliasSymbol) -> Unit
abstract class AbstractFirDeserializedSymbolProvider(
session: FirSession,
val moduleDataProvider: ModuleDataProvider,
@@ -74,7 +76,15 @@ abstract class AbstractFirDeserializedSymbolProvider(
// ------------------------ Caches ------------------------
private val packagePartsCache = session.firCachesFactory.createCache(::tryComputePackagePartInfos)
private val typeAliasCache = session.firCachesFactory.createCache(::findAndDeserializeTypeAlias)
private val typeAliasCache: FirCache<ClassId, FirTypeAliasSymbol?, FirDeserializationContext?> =
session.firCachesFactory.createCacheWithPostCompute(
createValue = { classId, _ -> findAndDeserializeTypeAlias(classId) },
postCompute = { _, symbol, postProcessor ->
if (postProcessor != null && symbol != null) {
postProcessor.invoke(symbol)
}
}
)
private val classCache: FirCache<ClassId, FirRegularClassSymbol?, FirDeserializationContext?> =
session.firCachesFactory.createCacheWithPostCompute(
createValue = { classId, context -> findAndDeserializeClass(classId, context) },
@@ -120,13 +130,14 @@ abstract class AbstractFirDeserializedSymbolProvider(
return computePackagePartsInfos(packageFqName)
}
private fun findAndDeserializeTypeAlias(classId: ClassId): FirTypeAliasSymbol? {
private fun findAndDeserializeTypeAlias(classId: ClassId): Pair<FirTypeAliasSymbol?, DeserializedTypeAliasPostProcessor?> {
return getPackageParts(classId.packageFqName).firstNotNullOfOrNull { part ->
val ids = part.typeAliasNameIndex[classId.shortClassName]
if (ids == null || ids.isEmpty()) return@firstNotNullOfOrNull null
val aliasProto = part.proto.getTypeAlias(ids.single())
part.context.memberDeserializer.loadTypeAlias(aliasProto).symbol
}
val postProcessor: DeserializedTypeAliasPostProcessor = { part.context.memberDeserializer.loadTypeAlias(aliasProto, it) }
FirTypeAliasSymbol(classId) to postProcessor
} ?: (null to null)
}
private fun findAndDeserializeClass(
@@ -191,11 +191,15 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
return lowSixBits + rest
}
fun loadTypeAlias(proto: ProtoBuf.TypeAlias): FirTypeAlias {
/**
* If loading happens in post-compute, then symbol for type alias is already computed and should be provided in [preComputedSymbol]
* @See AbstractFirDeserializedSymbolProvider.findAndDeserializeTypeAlias
*/
fun loadTypeAlias(proto: ProtoBuf.TypeAlias, preComputedSymbol: FirTypeAliasSymbol? = null): FirTypeAlias {
val flags = proto.flags
val name = c.nameResolver.getName(proto.name)
val classId = ClassId(c.packageFqName, name)
val symbol = FirTypeAliasSymbol(classId)
val symbol = preComputedSymbol ?: FirTypeAliasSymbol(classId)
val local = c.childContext(proto.typeParameterList, containingDeclarationSymbol = symbol)
return buildTypeAlias {
moduleData = c.moduleData