diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt index 9b23d94b031..99669e0eb81 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.fir.java.JvmSupertypeUpdater import org.jetbrains.kotlin.fir.java.enhancement.FirAnnotationTypeQualifierResolver import org.jetbrains.kotlin.fir.java.enhancement.FirEnhancedSymbolsStorage import org.jetbrains.kotlin.fir.java.scopes.JavaOverridabilityRules +import org.jetbrains.kotlin.fir.java.FirOriginalSyntheticPropertiesStorage import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.calls.ConeCallConflictResolverFactory import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticNamesProvider @@ -88,6 +89,7 @@ fun FirSession.registerCommonJavaComponents(javaModuleResolver: JavaModuleResolv val jsr305State = languageVersionSettings.getFlag(JvmAnalysisFlags.javaTypeEnhancementState) register(FirAnnotationTypeQualifierResolver::class, FirAnnotationTypeQualifierResolver(this, jsr305State, javaModuleResolver)) register(FirEnhancedSymbolsStorage::class, FirEnhancedSymbolsStorage(this)) + register(FirOriginalSyntheticPropertiesStorage::class, FirOriginalSyntheticPropertiesStorage(this)) register( FirJvmDefaultModeComponent::class, FirJvmDefaultModeComponent(languageVersionSettings.getFlag(JvmAnalysisFlags.jvmDefaultMode)) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirOriginalSyntheticPropertiesStorage.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirOriginalSyntheticPropertiesStorage.kt new file mode 100644 index 00000000000..960459ebed7 --- /dev/null +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirOriginalSyntheticPropertiesStorage.kt @@ -0,0 +1,27 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.java + +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.FirSessionComponent +import org.jetbrains.kotlin.fir.caches.FirCache +import org.jetbrains.kotlin.fir.caches.createCache +import org.jetbrains.kotlin.fir.caches.firCachesFactory +import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirSyntheticPropertySymbol +import org.jetbrains.kotlin.name.Name + +class FirOriginalSyntheticPropertiesStorage(session: FirSession) : FirSessionComponent { + private val cachesFactory = session.firCachesFactory + + val cacheByOwner: FirCache, Nothing?> = + cachesFactory.createCache { _ -> + cachesFactory.createCache { _, symbol -> symbol } + } + +} + +val FirSession.originalSyntheticPropertiesStorage: FirOriginalSyntheticPropertiesStorage by FirSession.sessionComponentAccessor() 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 552394acb4b..06a64e51f56 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 @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.fir.java.declarations.FirJavaMethod import org.jetbrains.kotlin.fir.java.declarations.buildJavaMethodCopy import org.jetbrains.kotlin.fir.java.declarations.buildJavaValueParameterCopy import org.jetbrains.kotlin.fir.java.symbols.FirJavaOverriddenSyntheticPropertySymbol +import org.jetbrains.kotlin.fir.java.originalSyntheticPropertiesStorage import org.jetbrains.kotlin.fir.java.toConeKotlinTypeProbablyFlexible import org.jetbrains.kotlin.fir.resolve.defaultType import org.jetbrains.kotlin.fir.scopes.* @@ -59,19 +60,21 @@ class JavaClassUseSiteMemberScope( declaredMemberScope ) { private val typeParameterStack = klass.javaTypeParameterStack - private val syntheticPropertyByNameMap = hashMapOf() private val canUseSpecialGetters: Boolean by lazy { !klass.hasKotlinSuper(session) } private val javaOverrideChecker: JavaOverrideChecker get() = overrideChecker as JavaOverrideChecker + private val syntheticPropertyCache = session.originalSyntheticPropertiesStorage.cacheByOwner.getValue(klass.symbol, null) + private fun generateSyntheticPropertySymbol( getterSymbol: FirNamedFunctionSymbol, setterSymbol: FirNamedFunctionSymbol?, property: FirProperty, takeModalityFromGetter: Boolean, ): FirSyntheticPropertySymbol { - return syntheticPropertyByNameMap.getOrPut(property.name) { + return syntheticPropertyCache.getValue( + property.name, buildSyntheticProperty { moduleData = session.moduleData name = property.name @@ -90,7 +93,7 @@ class JavaClassUseSiteMemberScope( ) deprecationsProvider = getDeprecationsProviderFromAccessors(session, delegateGetter, delegateSetter) }.symbol - } + ) } private fun chooseModalityForAccessor(property: FirProperty, getter: FirSimpleFunction): Modality? {