[FIR] Use post-compute in typeAliasCache for deserialized symbols
^KTIJ-24156 Fixed
This commit is contained in:
committed by
Space Team
parent
3a6e3290aa
commit
c6886fc779
+15
-4
@@ -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(
|
||||
|
||||
+6
-2
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user