From a80870bc8fc02f4d440c41dc7fd08640480072b0 Mon Sep 17 00:00:00 2001 From: Arseniy Terekhov Date: Wed, 17 Aug 2022 10:58:54 +0300 Subject: [PATCH] [FIR] DeprecationsProvider: caching results --- .../fir/deserialization/ClassDeserialization.kt | 3 ++- .../deserialization/FirMemberDeserializer.kt | 7 ++++--- .../jetbrains/kotlin/fir/java/FirJavaFacade.kt | 2 +- .../fir/java/declarations/FirJavaField.kt | 4 ++-- .../JvmClassFileBasedSymbolProvider.kt | 4 ++-- .../java/enhancement/SignatureEnhancement.kt | 4 ++-- .../java/scopes/JavaClassUseSiteMemberScope.kt | 3 ++- .../kotlin/fir/declarations/deprecationUtils.kt | 17 ++++++++++------- .../kotlin/fir/resolve/calls/Synthetics.kt | 3 ++- .../fir/scopes/impl/FirFakeOverrideGenerator.kt | 3 ++- .../transformers/FirStatusResolveTransformer.kt | 4 ++-- ...ilerRequiredAnnotationsResolveTransformer.kt | 4 ++-- .../fir/declarations/DeprecationsProvider.kt | 12 ++++++++++-- 13 files changed, 43 insertions(+), 27 deletions(-) diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt index 026490f4a6c..f2b524a7109 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt @@ -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) diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt index 70fa6cf3815..69035c6f0a9 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt @@ -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 { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt index 5c6b95dbb50..2481f93b8d4 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt @@ -185,7 +185,7 @@ abstract class FirJavaFacade( } } firJavaClass.replaceSuperTypeRefs(enhancedSuperTypes) - firJavaClass.replaceDeprecationsProvider(firJavaClass.getDeprecationsProvider()) + firJavaClass.replaceDeprecationsProvider(firJavaClass.getDeprecationsProvider(session.firCachesFactory)) return firJavaClass } diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaField.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaField.kt index afdd06cfaf9..200b21e0faa 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaField.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaField.kt @@ -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 by lazy { annotationBuilder() } override val deprecationsProvider: DeprecationsProvider by lazy { - annotations.getDeprecationsProviderFromAnnotations(true) + annotations.getDeprecationsProviderFromAnnotations(true, moduleData.session.firCachesFactory) } override val contextReceivers: List diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmClassFileBasedSymbolProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmClassFileBasedSymbolProvider.kt index 295220032f2..b4b187895df 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmClassFileBasedSymbolProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmClassFileBasedSymbolProvider.kt @@ -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? { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt index f084251a5d9..ab9ef05603b 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt @@ -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 diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt index bc97d5cda0e..390315aeac5 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt @@ -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 } } diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/deprecationUtils.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/deprecationUtils.kt index ab7eb5a6b40..104617dcc6a 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/deprecationUtils.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/deprecationUtils.kt @@ -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>) { - fun toDeprecationsProvider(): DeprecationsProvider { + fun toDeprecationsProvider(firCachesFactory: FirCachesFactory): DeprecationsProvider { if (storage.isEmpty()) { return EmptyDeprecationsProvider } @Suppress("UNCHECKED_CAST") val specificCallSite = storage.filterKeys { it != null } as Map> 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.getDeprecationsProviderFromAnnotations(fromJava: Boolean): DeprecationsProvider { +fun List.getDeprecationsProviderFromAnnotations(fromJava: Boolean, firCachesFactory: FirCachesFactory): DeprecationsProvider { val deprecationAnnotationByUseSite = extractDeprecationAnnotationInfoPerUseSite(fromJava) - return deprecationAnnotationByUseSite.toDeprecationsProvider() + return deprecationAnnotationByUseSite.toDeprecationsProvider(firCachesFactory) } fun FirBasedSymbol<*>.getDeprecationForCallSite( diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/calls/Synthetics.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/calls/Synthetics.kt index 9832f7bcf4f..473bca2165c 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/calls/Synthetics.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/calls/Synthetics.kt @@ -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 { diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirFakeOverrideGenerator.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirFakeOverrideGenerator.kt index a251a2ebeb8..339ba221009 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirFakeOverrideGenerator.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirFakeOverrideGenerator.kt @@ -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 } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt index 2fa1dce24ff..1299cf52527 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt @@ -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)) } } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirCompilerRequiredAnnotationsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirCompilerRequiredAnnotationsResolveTransformer.kt index c8a79831242..dcfd3df46c4 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirCompilerRequiredAnnotationsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirCompilerRequiredAnnotationsResolveTransformer.kt @@ -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)) } } } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/DeprecationsProvider.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/DeprecationsProvider.kt index bf670955a6e..f6896c78d5e 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/DeprecationsProvider.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/DeprecationsProvider.kt @@ -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?, private val bySpecificSite: Map>? ) : DeprecationsProvider() { - override fun getDeprecationsInfo(version: ApiVersion): DeprecationsPerUseSite { + private val cache: FirCache = firCachesFactory.createCache { version -> @Suppress("UNCHECKED_CAST") - return DeprecationsPerUseSite( + DeprecationsPerUseSite( all?.computeDeprecationInfoOrNull(version), bySpecificSite?.mapValues { (_, info) -> info.computeDeprecationInfoOrNull(version) }?.filterValues { it != null } as Map? ) } + override fun getDeprecationsInfo(version: ApiVersion): DeprecationsPerUseSite { + return cache.getValue(version, null) + } + private fun List.computeDeprecationInfoOrNull(version: ApiVersion): DeprecationInfo? { return firstNotNullOfOrNull { it.computeDeprecationInfo(version) } }