From ccc3f52acfaf017756fdbb2a2a1e731910efb9b9 Mon Sep 17 00:00:00 2001 From: Artem Vasilev Date: Thu, 26 Jan 2023 11:44:34 +0100 Subject: [PATCH] [FIR] Rename FirSyntheticPropertiesStorage, extract property creation --- .../fir/session/ComponentsContainers.kt | 4 +- .../FirOriginalSyntheticPropertiesStorage.kt | 27 -------- .../fir/java/FirSyntheticPropertiesStorage.kt | 33 ++++++++++ .../scopes/JavaClassUseSiteMemberScope.kt | 63 ++++++++++--------- 4 files changed, 67 insertions(+), 60 deletions(-) delete mode 100644 compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirOriginalSyntheticPropertiesStorage.kt create mode 100644 compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirSyntheticPropertiesStorage.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 99669e0eb81..ae2eb13af8c 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,7 +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.java.FirSyntheticPropertiesStorage import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.calls.ConeCallConflictResolverFactory import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticNamesProvider @@ -89,7 +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(FirSyntheticPropertiesStorage::class, FirSyntheticPropertiesStorage(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 deleted file mode 100644 index 960459ebed7..00000000000 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirOriginalSyntheticPropertiesStorage.kt +++ /dev/null @@ -1,27 +0,0 @@ -/* - * 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/FirSyntheticPropertiesStorage.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirSyntheticPropertiesStorage.kt new file mode 100644 index 00000000000..535aaeabe8c --- /dev/null +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirSyntheticPropertiesStorage.kt @@ -0,0 +1,33 @@ +/* + * 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.declarations.FirRegularClass +import org.jetbrains.kotlin.fir.java.scopes.JavaClassUseSiteMemberScope +import org.jetbrains.kotlin.fir.scopes.impl.FirTypeIntersectionScopeContext.ResultOfIntersection +import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirSyntheticPropertySymbol +import org.jetbrains.kotlin.name.Name + +typealias SyntheticPropertiesCache = FirCache>> + +class FirSyntheticPropertiesStorage(session: FirSession) : FirSessionComponent { + private val cachesFactory = session.firCachesFactory + + val cacheByOwner: FirCache = + cachesFactory.createCache { _ -> + cachesFactory.createCache { _, (scope, intersection) -> + scope.syntheticPropertyFromOverride(intersection) + } + } +} + +val FirSession.syntheticPropertiesStorage: FirSyntheticPropertiesStorage by FirSession.sessionComponentAccessor() \ No newline at end of file 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 06a64e51f56..26ef952c638 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 @@ -20,8 +20,8 @@ import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass 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.syntheticPropertiesStorage 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.* @@ -65,7 +65,7 @@ class JavaClassUseSiteMemberScope( private val javaOverrideChecker: JavaOverrideChecker get() = overrideChecker as JavaOverrideChecker - private val syntheticPropertyCache = session.originalSyntheticPropertiesStorage.cacheByOwner.getValue(klass.symbol, null) + private val syntheticPropertyCache = session.syntheticPropertiesStorage.cacheByOwner.getValue(klass, null) private fun generateSyntheticPropertySymbol( getterSymbol: FirNamedFunctionSymbol, @@ -73,27 +73,24 @@ class JavaClassUseSiteMemberScope( property: FirProperty, takeModalityFromGetter: Boolean, ): FirSyntheticPropertySymbol { - return syntheticPropertyCache.getValue( - property.name, - buildSyntheticProperty { - moduleData = session.moduleData - name = property.name - symbol = FirJavaOverriddenSyntheticPropertySymbol( - getterId = getterSymbol.callableId, - propertyId = CallableId(getterSymbol.callableId.packageName, getterSymbol.callableId.className, property.name) - ) - delegateGetter = getterSymbol.fir - delegateSetter = setterSymbol?.fir - status = getterSymbol.fir.status.copy( - modality = if (takeModalityFromGetter) { - delegateGetter.modality ?: property.modality - } else { - chooseModalityForAccessor(property, delegateGetter) - } - ) - deprecationsProvider = getDeprecationsProviderFromAccessors(session, delegateGetter, delegateSetter) - }.symbol - ) + return buildSyntheticProperty { + moduleData = session.moduleData + name = property.name + symbol = FirJavaOverriddenSyntheticPropertySymbol( + getterId = getterSymbol.callableId, + propertyId = CallableId(getterSymbol.callableId.packageName, getterSymbol.callableId.className, property.name) + ) + delegateGetter = getterSymbol.fir + delegateSetter = setterSymbol?.fir + status = getterSymbol.fir.status.copy( + modality = if (takeModalityFromGetter) { + delegateGetter.modality ?: property.modality + } else { + chooseModalityForAccessor(property, delegateGetter) + } + ) + deprecationsProvider = getDeprecationsProviderFromAccessors(session, delegateGetter, delegateSetter) + }.symbol } private fun chooseModalityForAccessor(property: FirProperty, getter: FirSimpleFunction): Modality? { @@ -143,13 +140,7 @@ class JavaClassUseSiteMemberScope( @Suppress("UNCHECKED_CAST") val overriddenProperty = propertiesFromSupertypes.firstOrNull() as ResultOfIntersection? ?: return result - - val overrideInClass = overriddenProperty.overriddenMembers.firstNotNullOfOrNull { (symbol, _) -> - symbol.createOverridePropertyIfExists(declaredMemberScope, takeModalityFromGetter = true) - ?: superTypeScopes.firstNotNullOfOrNull { scope -> - symbol.createOverridePropertyIfExists(scope, takeModalityFromGetter = false) - } - } + val overrideInClass = syntheticPropertyCache.getValue(name, this to overriddenProperty) val chosenSymbol = overrideInClass ?: overriddenProperty.chosenSymbol directOverriddenProperties[chosenSymbol] = listOf(overriddenProperty) @@ -158,10 +149,20 @@ class JavaClassUseSiteMemberScope( return result } + internal fun syntheticPropertyFromOverride(overriddenProperty: ResultOfIntersection): FirSyntheticPropertySymbol? { + val overrideInClass = overriddenProperty.overriddenMembers.firstNotNullOfOrNull { (symbol, _) -> + symbol.createOverridePropertyIfExists(declaredMemberScope, takeModalityFromGetter = true) + ?: superTypeScopes.firstNotNullOfOrNull { scope -> + symbol.createOverridePropertyIfExists(scope, takeModalityFromGetter = false) + } + } + return overrideInClass + } + private fun FirPropertySymbol.createOverridePropertyIfExists( scope: FirScope, takeModalityFromGetter: Boolean - ): FirPropertySymbol? { + ): FirSyntheticPropertySymbol? { val getterSymbol = this.findGetterOverride(scope) ?: return null val setterSymbol = if (this.fir.isVar)