[FIR] Add cache for top-level functions and properties to AbstractFirDeserializedSymbolsProvider
This commit is contained in:
committed by
TeamCityServer
parent
c523379e6a
commit
fa8d8ad503
+25
-25
@@ -14,10 +14,7 @@ import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider
|
|||||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||||
import org.jetbrains.kotlin.metadata.ProtoBuf
|
import org.jetbrains.kotlin.metadata.ProtoBuf
|
||||||
import org.jetbrains.kotlin.metadata.deserialization.NameResolver
|
import org.jetbrains.kotlin.metadata.deserialization.NameResolver
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.*
|
||||||
import org.jetbrains.kotlin.name.FqName
|
|
||||||
import org.jetbrains.kotlin.name.Name
|
|
||||||
import org.jetbrains.kotlin.name.isOneSegmentFQN
|
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.getName
|
import org.jetbrains.kotlin.serialization.deserialization.getName
|
||||||
|
|
||||||
@@ -60,6 +57,9 @@ abstract class AbstractFirDeserializedSymbolsProvider(
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
private val functionCache = session.firCachesFactory.createCache(::loadFunctionsByCallableId)
|
||||||
|
private val propertyCache = session.firCachesFactory.createCache(::loadPropertiesByCallableId)
|
||||||
|
|
||||||
// ------------------------ Abstract members ------------------------
|
// ------------------------ Abstract members ------------------------
|
||||||
|
|
||||||
protected abstract fun computePackagePartsInfos(packageFqName: FqName): List<PackagePartsCacheData>
|
protected abstract fun computePackagePartsInfos(packageFqName: FqName): List<PackagePartsCacheData>
|
||||||
@@ -131,41 +131,45 @@ abstract class AbstractFirDeserializedSymbolsProvider(
|
|||||||
return classCache.getValueIfComputed(classId)
|
return classCache.getValueIfComputed(classId)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun loadFunctionsByName(part: PackagePartsCacheData, name: Name): List<FirNamedFunctionSymbol> {
|
private fun loadFunctionsByCallableId(callableId: CallableId): List<FirNamedFunctionSymbol> {
|
||||||
val functionIds = part.topLevelFunctionNameIndex[name] ?: return emptyList()
|
return getPackageParts(callableId.packageName).flatMap { part ->
|
||||||
return functionIds.map {
|
val functionIds = part.topLevelFunctionNameIndex[callableId.callableName] ?: return@flatMap emptyList()
|
||||||
part.context.memberDeserializer.loadFunction(part.proto.getFunction(it)).symbol
|
functionIds.map {
|
||||||
|
part.context.memberDeserializer.loadFunction(part.proto.getFunction(it)).symbol
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun loadPropertiesByName(part: PackagePartsCacheData, name: Name): List<FirPropertySymbol> {
|
private fun loadPropertiesByCallableId(callableId: CallableId): List<FirPropertySymbol> {
|
||||||
val propertyIds = part.topLevelPropertyNameIndex[name] ?: return emptyList()
|
return getPackageParts(callableId.packageName).flatMap { part ->
|
||||||
return propertyIds.map {
|
val propertyIds = part.topLevelPropertyNameIndex[callableId.callableName] ?: return@flatMap emptyList()
|
||||||
part.context.memberDeserializer.loadProperty(part.proto.getProperty(it)).symbol
|
propertyIds.map {
|
||||||
|
part.context.memberDeserializer.loadProperty(part.proto.getProperty(it)).symbol
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun getPackageParts(packageFqName: FqName): Collection<PackagePartsCacheData> {
|
||||||
|
return packagePartsCache.getValue(packageFqName)
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------------ SymbolProvider methods ------------------------
|
// ------------------------ SymbolProvider methods ------------------------
|
||||||
|
|
||||||
@FirSymbolProviderInternals
|
@FirSymbolProviderInternals
|
||||||
override fun getTopLevelCallableSymbolsTo(destination: MutableList<FirCallableSymbol<*>>, packageFqName: FqName, name: Name) {
|
override fun getTopLevelCallableSymbolsTo(destination: MutableList<FirCallableSymbol<*>>, packageFqName: FqName, name: Name) {
|
||||||
getPackageParts(packageFqName).flatMapTo(destination) { part ->
|
val callableId = CallableId(packageFqName, name)
|
||||||
loadFunctionsByName(part, name) + loadPropertiesByName(part, name)
|
destination += functionCache.getValue(callableId)
|
||||||
}
|
destination += propertyCache.getValue(callableId)
|
||||||
}
|
}
|
||||||
|
|
||||||
@FirSymbolProviderInternals
|
@FirSymbolProviderInternals
|
||||||
override fun getTopLevelFunctionSymbolsTo(destination: MutableList<FirNamedFunctionSymbol>, packageFqName: FqName, name: Name) {
|
override fun getTopLevelFunctionSymbolsTo(destination: MutableList<FirNamedFunctionSymbol>, packageFqName: FqName, name: Name) {
|
||||||
getPackageParts(packageFqName).flatMapTo(destination) { part ->
|
destination += functionCache.getValue(CallableId(packageFqName, name))
|
||||||
loadFunctionsByName(part, name)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@FirSymbolProviderInternals
|
@FirSymbolProviderInternals
|
||||||
override fun getTopLevelPropertySymbolsTo(destination: MutableList<FirPropertySymbol>, packageFqName: FqName, name: Name) {
|
override fun getTopLevelPropertySymbolsTo(destination: MutableList<FirPropertySymbol>, packageFqName: FqName, name: Name) {
|
||||||
getPackageParts(packageFqName).flatMapTo(destination) { part ->
|
destination += propertyCache.getValue(CallableId(packageFqName, name))
|
||||||
loadPropertiesByName(part, name)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getClassLikeSymbolByFqName(classId: ClassId): FirClassLikeSymbol<*>? {
|
override fun getClassLikeSymbolByFqName(classId: ClassId): FirClassLikeSymbol<*>? {
|
||||||
@@ -186,9 +190,5 @@ abstract class AbstractFirDeserializedSymbolsProvider(
|
|||||||
return typeAliasCache.getValue(classId)
|
return typeAliasCache.getValue(classId)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getPackageParts(packageFqName: FqName): Collection<PackagePartsCacheData> {
|
|
||||||
return packagePartsCache.getValue(packageFqName)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getPackage(fqName: FqName): FqName? = null
|
override fun getPackage(fqName: FqName): FqName? = null
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user