From 075a80613b2d4b9b1e9d846aca611349f12632d9 Mon Sep 17 00:00:00 2001 From: Artem Vasilev Date: Tue, 24 Jan 2023 15:25:15 +0100 Subject: [PATCH] [FIR] Introduce cache for not-yet-enhanced synthetic properties The original synthetic properties from Java were not cached anywhere and created anew for every session. However, the enhanced properties are (along with their originals) saved inside the session's cache, causing inconsistency with newly created symbols via referential equality. --- .../fir/session/ComponentsContainers.kt | 2 ++ .../FirOriginalSyntheticPropertiesStorage.kt | 27 +++++++++++++++++++ .../scopes/JavaClassUseSiteMemberScope.kt | 9 ++++--- 3 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirOriginalSyntheticPropertiesStorage.kt 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? {