[FIR] DeprecationsProvider: caching results

This commit is contained in:
Arseniy Terekhov
2022-08-17 10:58:54 +03:00
committed by teamcity
parent 25fc948d95
commit a80870bc8f
13 changed files with 43 additions and 27 deletions
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.deserialization
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSignatures
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.caches.firCachesFactory
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.builder.*
import org.jetbrains.kotlin.fir.declarations.comparators.FirMemberDeclarationComparator
@@ -226,7 +227,7 @@ fun deserializeClassToSymbol(
it.sourceElement = containerSource
it.replaceDeprecationsProvider(it.getDeprecationsProvider())
it.replaceDeprecationsProvider(it.getDeprecationsProvider(session.firCachesFactory))
classProto.getExtensionOrNull(JvmProtoBuf.classModuleName)?.let { idx ->
it.moduleName = nameResolver.getString(idx)
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.deserialization
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.caches.firCachesFactory
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.builder.*
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter
@@ -421,7 +422,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
}
this.containerSource = c.containerSource
this.initializer = c.constDeserializer.loadConstant(proto, symbol.callableId, c.nameResolver)
deprecationsProvider = annotations.getDeprecationsProviderFromAnnotations(false)
deprecationsProvider = annotations.getDeprecationsProviderFromAnnotations(false, c.session.firCachesFactory)
proto.contextReceiverTypes(c.typeTable).mapTo(contextReceivers, ::loadContextReceiver)
}.apply {
@@ -499,7 +500,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
)
annotations +=
c.annotationDeserializer.loadFunctionAnnotations(c.containerSource, proto, local.nameResolver, local.typeTable)
deprecationsProvider = annotations.getDeprecationsProviderFromAnnotations(false)
deprecationsProvider = annotations.getDeprecationsProviderFromAnnotations(false, c.session.firCachesFactory)
this.containerSource = c.containerSource
proto.contextReceiverTypes(c.typeTable).mapTo(contextReceivers, ::loadContextReceiver)
@@ -578,7 +579,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
annotations +=
c.annotationDeserializer.loadConstructorAnnotations(c.containerSource, proto, local.nameResolver, local.typeTable)
containerSource = c.containerSource
deprecationsProvider = annotations.getDeprecationsProviderFromAnnotations(false)
deprecationsProvider = annotations.getDeprecationsProviderFromAnnotations(false, c.session.firCachesFactory)
contextReceivers.addAll(createContextReceiversForClass(classProto))
}.build().apply {
@@ -185,7 +185,7 @@ abstract class FirJavaFacade(
}
}
firJavaClass.replaceSuperTypeRefs(enhancedSuperTypes)
firJavaClass.replaceDeprecationsProvider(firJavaClass.getDeprecationsProvider())
firJavaClass.replaceDeprecationsProvider(firJavaClass.getDeprecationsProvider(session.firCachesFactory))
return firJavaClass
}
@@ -11,11 +11,11 @@ import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.caches.firCachesFactory
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.builder.FirFieldBuilder
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.languageVersionSettings
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.impl.FirFieldSymbol
import org.jetbrains.kotlin.fir.types.ConeSimpleKotlinType
@@ -62,7 +62,7 @@ class FirJavaField @FirImplementationDetail constructor(
override val annotations: List<FirAnnotation> by lazy { annotationBuilder() }
override val deprecationsProvider: DeprecationsProvider by lazy {
annotations.getDeprecationsProviderFromAnnotations(true)
annotations.getDeprecationsProviderFromAnnotations(true, moduleData.session.firCachesFactory)
}
override val contextReceivers: List<FirContextReceiver>
@@ -8,12 +8,12 @@ package org.jetbrains.kotlin.fir.java.deserialization
import org.jetbrains.kotlin.descriptors.SourceElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.ThreadSafeMutableState
import org.jetbrains.kotlin.fir.caches.firCachesFactory
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.getDeprecationsProvider
import org.jetbrains.kotlin.fir.deserialization.*
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.java.FirJavaFacade
import org.jetbrains.kotlin.fir.languageVersionSettings
import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.load.kotlin.*
@@ -151,7 +151,7 @@ class JvmClassFileBasedSymbolProvider(
},
kotlinClass.byteContent,
)
symbol.fir.replaceDeprecationsProvider(symbol.fir.getDeprecationsProvider())
symbol.fir.replaceDeprecationsProvider(symbol.fir.getDeprecationsProvider(session.firCachesFactory))
}
private fun String?.toPath(): Path? {
@@ -168,7 +168,7 @@ class FirSignatureEnhancement(
delegateGetter = enhancedGetterSymbol.fir as FirSimpleFunction
delegateSetter = enhancedSetterSymbol?.fir as FirSimpleFunction?
status = firElement.status
deprecationsProvider = getDeprecationsProviderFromAccessors(delegateGetter, delegateSetter)
deprecationsProvider = getDeprecationsProviderFromAccessors(delegateGetter, delegateSetter, session.firCachesFactory)
}.symbol
}
else -> {
@@ -320,7 +320,7 @@ class FirSignatureEnhancement(
else -> throw AssertionError("Unknown Java method to enhance: ${firMethod.render()}")
}.apply {
annotations += firMethod.annotations
deprecationsProvider = annotations.getDeprecationsProviderFromAnnotations(true)
deprecationsProvider = annotations.getDeprecationsProviderFromAnnotations(true, session.firCachesFactory)
}.build()
return function.symbol
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.java.scopes
import org.jetbrains.kotlin.builtins.StandardNames
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.caches.firCachesFactory
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunctionCopy
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
@@ -88,7 +89,7 @@ class JavaClassUseSiteMemberScope(
chooseModalityForAccessor(property, delegateGetter)
}
)
deprecationsProvider = getDeprecationsProviderFromAccessors(delegateGetter, delegateSetter)
deprecationsProvider = getDeprecationsProviderFromAccessors(delegateGetter, delegateSetter, session.firCachesFactory)
}.symbol
}
}
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.config.ApiVersion
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fir.FirAnnotationContainer
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.caches.FirCachesFactory
import org.jetbrains.kotlin.fir.declarations.utils.isJavaOrEnhancement
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.references.FirNamedReference
@@ -26,13 +27,14 @@ import org.jetbrains.kotlin.resolve.deprecation.DeprecationInfo
import org.jetbrains.kotlin.resolve.deprecation.DeprecationLevelValue
class DeprecationAnnotationInfoPerUseSiteStorage(val storage: Map<AnnotationUseSiteTarget?, List<DeprecationAnnotationInfo>>) {
fun toDeprecationsProvider(): DeprecationsProvider {
fun toDeprecationsProvider(firCachesFactory: FirCachesFactory): DeprecationsProvider {
if (storage.isEmpty()) {
return EmptyDeprecationsProvider
}
@Suppress("UNCHECKED_CAST")
val specificCallSite = storage.filterKeys { it != null } as Map<AnnotationUseSiteTarget, List<DeprecationAnnotationInfo>>
return DeprecationsProviderImpl(
firCachesFactory,
storage[null],
specificCallSite.takeIf { it.isNotEmpty() }
)
@@ -83,8 +85,8 @@ fun FirBasedSymbol<*>.getDeprecation(apiVersion: ApiVersion, callSite: FirElemen
}
}
fun FirAnnotationContainer.getDeprecationsProvider(): DeprecationsProvider {
return extractDeprecationInfoPerUseSite().toDeprecationsProvider()
fun FirAnnotationContainer.getDeprecationsProvider(firCachesFactory: FirCachesFactory): DeprecationsProvider {
return extractDeprecationInfoPerUseSite().toDeprecationsProvider(firCachesFactory)
}
fun FirAnnotationContainer.extractDeprecationInfoPerUseSite(): DeprecationAnnotationInfoPerUseSiteStorage {
@@ -99,9 +101,10 @@ fun FirAnnotationContainer.extractDeprecationInfoPerUseSite(): DeprecationAnnota
}
fun getDeprecationsProviderFromAccessors(
getter: FirFunction?,
setter: FirFunction?
setter: FirFunction?,
firCachesFactory: FirCachesFactory
): DeprecationsProvider {
return getDeprecationsAnnotationInfoByUseSiteFromAccessors(getter, setter).toDeprecationsProvider()
return getDeprecationsAnnotationInfoByUseSiteFromAccessors(getter, setter).toDeprecationsProvider(firCachesFactory)
}
fun getDeprecationsAnnotationInfoByUseSiteFromAccessors(
getter: FirFunction?,
@@ -127,9 +130,9 @@ fun getDeprecationsAnnotationInfoByUseSiteFromAccessors(
}
}
fun List<FirAnnotation>.getDeprecationsProviderFromAnnotations(fromJava: Boolean): DeprecationsProvider {
fun List<FirAnnotation>.getDeprecationsProviderFromAnnotations(fromJava: Boolean, firCachesFactory: FirCachesFactory): DeprecationsProvider {
val deprecationAnnotationByUseSite = extractDeprecationAnnotationInfoPerUseSite(fromJava)
return deprecationAnnotationByUseSite.toDeprecationsProvider()
return deprecationAnnotationByUseSite.toDeprecationsProvider(firCachesFactory)
}
fun FirBasedSymbol<*>.getDeprecationForCallSite(
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.resolve.calls
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.caches.firCachesFactory
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.synthetic.buildSyntheticProperty
import org.jetbrains.kotlin.fir.declarations.utils.isStatic
@@ -135,7 +136,7 @@ class FirSyntheticPropertiesScope private constructor(
)
delegateGetter = getter
delegateSetter = matchingSetter
deprecationsProvider = getDeprecationsProviderFromAccessors(getter, matchingSetter)
deprecationsProvider = getDeprecationsProviderFromAccessors(getter, matchingSetter, session.firCachesFactory)
}
val syntheticSymbol = property.symbol
(baseScope as? FirUnstableSmartcastTypeScope)?.apply {
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.caches.firCachesFactory
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.builder.*
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
@@ -526,7 +527,7 @@ object FirFakeOverrideGenerator {
delegateGetter = getter
delegateSetter = setter
status = baseProperty.status
deprecationsProvider = getDeprecationsProviderFromAccessors(getter, setter)
deprecationsProvider = getDeprecationsProviderFromAccessors(getter, setter, session.firCachesFactory)
}.symbol
}
@@ -8,12 +8,12 @@ package org.jetbrains.kotlin.fir.resolve.transformers
import org.jetbrains.kotlin.descriptors.EffectiveVisibility
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.caches.firCachesFactory
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.utils.isLocal
import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.languageVersionSettings
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.providers.firProvider
@@ -555,7 +555,7 @@ abstract class AbstractFirStatusResolveTransformer(
protected fun calculateDeprecations(simpleFunction: FirCallableDeclaration) {
if (simpleFunction.deprecationsProvider is UnresolvedDeprecationProvider) {
simpleFunction.replaceDeprecationsProvider(simpleFunction.getDeprecationsProvider())
simpleFunction.replaceDeprecationsProvider(simpleFunction.getDeprecationsProvider(session.firCachesFactory))
}
}
}
@@ -12,13 +12,13 @@ import kotlinx.collections.immutable.persistentListOf
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.caches.firCachesFactory
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase.COMPILER_REQUIRED_ANNOTATIONS
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.extensions.*
import org.jetbrains.kotlin.fir.languageVersionSettings
import org.jetbrains.kotlin.fir.resolve.ResolutionMode
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.fqName
@@ -254,7 +254,7 @@ private class FirAnnotationResolveTransformer(
private fun calculateDeprecations(classLikeDeclaration: FirClassLikeDeclaration) {
if (classLikeDeclaration.deprecationsProvider == UnresolvedDeprecationProvider) {
classLikeDeclaration.replaceDeprecationsProvider(classLikeDeclaration.getDeprecationsProvider())
classLikeDeclaration.replaceDeprecationsProvider(classLikeDeclaration.getDeprecationsProvider(session.firCachesFactory))
}
}
}
@@ -7,6 +7,9 @@ package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.config.ApiVersion
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fir.caches.FirCache
import org.jetbrains.kotlin.fir.caches.FirCachesFactory
import org.jetbrains.kotlin.fir.caches.createCache
import org.jetbrains.kotlin.resolve.deprecation.DeprecationInfo
import org.jetbrains.kotlin.resolve.deprecation.DeprecationLevelValue
import org.jetbrains.kotlin.resolve.deprecation.SimpleDeprecationInfo
@@ -17,18 +20,23 @@ abstract class DeprecationsProvider {
}
class DeprecationsProviderImpl(
firCachesFactory: FirCachesFactory,
private val all: List<DeprecationAnnotationInfo>?,
private val bySpecificSite: Map<AnnotationUseSiteTarget, List<DeprecationAnnotationInfo>>?
) : DeprecationsProvider() {
override fun getDeprecationsInfo(version: ApiVersion): DeprecationsPerUseSite {
private val cache: FirCache<ApiVersion, DeprecationsPerUseSite, Nothing?> = firCachesFactory.createCache { version ->
@Suppress("UNCHECKED_CAST")
return DeprecationsPerUseSite(
DeprecationsPerUseSite(
all?.computeDeprecationInfoOrNull(version),
bySpecificSite?.mapValues { (_, info) -> info.computeDeprecationInfoOrNull(version) }?.filterValues { it != null }
as Map<AnnotationUseSiteTarget, DeprecationInfo>?
)
}
override fun getDeprecationsInfo(version: ApiVersion): DeprecationsPerUseSite {
return cache.getValue(version, null)
}
private fun List<DeprecationAnnotationInfo>.computeDeprecationInfoOrNull(version: ApiVersion): DeprecationInfo? {
return firstNotNullOfOrNull { it.computeDeprecationInfo(version) }
}