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 d46aebc89c1..3db90bfe99c 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 @@ -32,8 +32,9 @@ import org.jetbrains.kotlin.fir.resolve.providers.impl.FirTypeResolverImpl import org.jetbrains.kotlin.fir.resolve.transformers.FirPhaseCheckingPhaseManager import org.jetbrains.kotlin.fir.symbols.FirPhaseManager import org.jetbrains.kotlin.fir.resolve.transformers.plugin.GeneratedClassIndex -import org.jetbrains.kotlin.fir.scopes.FirFakeOverrideStorage import org.jetbrains.kotlin.fir.scopes.impl.FirDeclaredMemberScopeProvider +import org.jetbrains.kotlin.fir.scopes.impl.FirIntersectionOverrideStorage +import org.jetbrains.kotlin.fir.scopes.impl.FirSubstitutionOverrideStorage import org.jetbrains.kotlin.fir.types.FirCorrespondingSupertypesCache import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.resolve.jvm.modules.JavaModuleResolver @@ -54,7 +55,9 @@ fun FirSession.registerCommonComponents(languageVersionSettings: LanguageVersion register(FirPredicateBasedProvider::class, FirPredicateBasedProvider.create(this)) register(GeneratedClassIndex::class, GeneratedClassIndex.create()) - register(FirFakeOverrideStorage::class, FirFakeOverrideStorage(this)) + register(FirSubstitutionOverrideStorage::class, FirSubstitutionOverrideStorage(this)) + register(FirIntersectionOverrideStorage::class, FirIntersectionOverrideStorage(this)) + register(FirSamConstructorStorage::class, FirSamConstructorStorage(this)) } @OptIn(SessionConfiguration::class) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt index b4a0a57c024..c26299b76f3 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt @@ -8,10 +8,11 @@ package org.jetbrains.kotlin.fir.resolve import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.EffectiveVisibility import org.jetbrains.kotlin.descriptors.Modality -import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.* +import org.jetbrains.kotlin.fir.caches.FirCache import org.jetbrains.kotlin.fir.caches.NullableMap +import org.jetbrains.kotlin.fir.caches.firCachesFactory import org.jetbrains.kotlin.fir.caches.getOrPut -import org.jetbrains.kotlin.fir.containingClassForStaticMemberAttr import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.builder.FirTypeParameterBuilder import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunction @@ -19,14 +20,11 @@ import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.diagnostics.ConeIntermediateDiagnostic -import org.jetbrains.kotlin.fir.moduleData import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticFunctionSymbol import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap -import org.jetbrains.kotlin.fir.scopes.fakeOverrideStorage import org.jetbrains.kotlin.fir.scopes.impl.hasTypeOf import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope import org.jetbrains.kotlin.fir.symbols.impl.* -import org.jetbrains.kotlin.fir.typeContext import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl @@ -42,7 +40,7 @@ abstract class FirSamResolver { abstract fun getSamConstructor(firRegularClass: FirRegularClass): FirSimpleFunction? } -val SAM_PARAMETER_NAME = Name.identifier("block") +private val SAM_PARAMETER_NAME = Name.identifier("block") class FirSamResolverImpl( private val session: FirSession, @@ -50,7 +48,7 @@ class FirSamResolverImpl( private val outerClassManager: FirOuterClassManager? = null, ) : FirSamResolver() { private val resolvedFunctionType: NullableMap = NullableMap() - private val samConstructorsCache = session.fakeOverrideStorage.samConstructorCache + private val samConstructorsCache = session.samConstructorStorage.samConstructors override fun getFunctionTypeForPossibleSamType(type: ConeKotlinType): ConeKotlinType? { return when (type) { @@ -361,3 +359,10 @@ private fun FirSimpleFunction.getFunctionTypeForAbstractMethod(): ConeLookupTagB isSuspend = this.isSuspend ) } + +class FirSamConstructorStorage(session: FirSession) : FirSessionComponent { + val samConstructors: FirCache = + session.firCachesFactory.createCache { classSymbol, samResolver -> samResolver.buildSamConstructor(classSymbol) } +} + +private val FirSession.samConstructorStorage: FirSamConstructorStorage by FirSession.sessionComponentAccessor() diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/FirFakeOverrideStorage.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/FirFakeOverrideStorage.kt deleted file mode 100644 index 5a81fe6a92d..00000000000 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/FirFakeOverrideStorage.kt +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2010-2021 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.scopes - -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.FirCachesFactory -import org.jetbrains.kotlin.fir.caches.createCache -import org.jetbrains.kotlin.fir.caches.firCachesFactory -import org.jetbrains.kotlin.fir.resolve.FirSamResolverImpl -import org.jetbrains.kotlin.fir.resolve.ScopeSessionKey -import org.jetbrains.kotlin.fir.scopes.impl.FirClassSubstitutionScope -import org.jetbrains.kotlin.fir.scopes.impl.FirTypeIntersectionScope -import org.jetbrains.kotlin.fir.scopes.impl.MemberWithBaseScope -import org.jetbrains.kotlin.fir.symbols.impl.* -import org.jetbrains.kotlin.fir.types.ConeKotlinType - -class FirFakeOverrideStorage(val session: FirSession) : FirSessionComponent { - private val cachesFactory = session.firCachesFactory - - val substitutionOverrideCacheByScope: FirCache, SubstitutionOverrideCache, Nothing?> = - cachesFactory.createCache { _ -> SubstitutionOverrideCache(session.firCachesFactory) } - - class SubstitutionOverrideCache(cachesFactory: FirCachesFactory) { - val overridesForFunctions: FirCache = - cachesFactory.createCache { original, scope -> scope.createSubstitutionOverrideFunction(original) } - val overridesForConstructors: FirCache = - cachesFactory.createCache { original, scope -> scope.createSubstitutionOverrideConstructor(original) } - val overridesForVariables: FirCache, FirVariableSymbol<*>, FirClassSubstitutionScope> = - cachesFactory.createCache { original, scope -> - when (original) { - is FirPropertySymbol -> scope.createSubstitutionOverrideProperty(original) - is FirFieldSymbol -> scope.createSubstitutionOverrideField(original) - is FirAccessorSymbol -> scope.createSubstitutionOverrideAccessor(original) - else -> error("symbol $original is not overridable") - } - } - } - - class IntersectionOverrideCache(cachesFactory: FirCachesFactory) { - val intersectionOverrides: FirCache, MemberWithBaseScope>, ContextForIntersectionOverrideConstruction<*>> = - cachesFactory.createCache { mostSpecific, context -> - val (intersectionScope, extractedOverrides, scopeForMostSpecific) = context - intersectionScope.createIntersectionOverride(extractedOverrides, mostSpecific, scopeForMostSpecific) - } - } - - data class ContextForIntersectionOverrideConstruction>( - val intersectionScope: FirTypeIntersectionScope, - val extractedOverrides: List>, - val scopeForMostSpecific: FirTypeScope - ) - - val intersectionOverrideCacheByScope: FirCache = - cachesFactory.createCache { _ -> IntersectionOverrideCache(cachesFactory) } - - val samConstructorCache: FirCache = - cachesFactory.createCache { classSymbol, samResolver -> samResolver.buildSamConstructor(classSymbol) } -} - -val FirSession.fakeOverrideStorage: FirFakeOverrideStorage by FirSession.sessionComponentAccessor() diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt index dd42b6080fc..2091afcc5d7 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt @@ -7,7 +7,8 @@ package org.jetbrains.kotlin.fir.scopes.impl import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.caches.contains +import org.jetbrains.kotlin.fir.FirSessionComponent +import org.jetbrains.kotlin.fir.caches.* import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.declarations.utils.visibility @@ -45,7 +46,7 @@ class FirClassSubstitutionScope( } } - private val substitutionOverrideCache = session.fakeOverrideStorage.substitutionOverrideCacheByScope.getValue(key, null) + private val substitutionOverrideCache = session.substitutionOverrideStorage.substitutionOverrideCacheByScope.getValue(key, null) private val newOwnerClassId = dispatchReceiverTypeForSubstitutedMembers.lookupTag.classId override fun processFunctionsByName(name: Name, processor: (FirNamedFunctionSymbol) -> Unit) { @@ -288,3 +289,28 @@ class FirClassSubstitutionScope( return useSiteMemberScope.getClassifierNames() } } + +class FirSubstitutionOverrideStorage(val session: FirSession) : FirSessionComponent { + private val cachesFactory = session.firCachesFactory + + val substitutionOverrideCacheByScope: FirCache, SubstitutionOverrideCache, Nothing?> = + cachesFactory.createCache { _ -> SubstitutionOverrideCache(session.firCachesFactory) } + + class SubstitutionOverrideCache(cachesFactory: FirCachesFactory) { + val overridesForFunctions: FirCache = + cachesFactory.createCache { original, scope -> scope.createSubstitutionOverrideFunction(original) } + val overridesForConstructors: FirCache = + cachesFactory.createCache { original, scope -> scope.createSubstitutionOverrideConstructor(original) } + val overridesForVariables: FirCache, FirVariableSymbol<*>, FirClassSubstitutionScope> = + cachesFactory.createCache { original, scope -> + when (original) { + is FirPropertySymbol -> scope.createSubstitutionOverrideProperty(original) + is FirFieldSymbol -> scope.createSubstitutionOverrideField(original) + is FirAccessorSymbol -> scope.createSubstitutionOverrideAccessor(original) + else -> error("symbol $original is not overridable") + } + } + } +} + +private val FirSession.substitutionOverrideStorage: FirSubstitutionOverrideStorage by FirSession.sessionComponentAccessor() diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScope.kt index bc044a02cbc..68dde4c5664 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScope.kt @@ -9,7 +9,7 @@ import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.* -import org.jetbrains.kotlin.fir.caches.getValue +import org.jetbrains.kotlin.fir.caches.* import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.isExpect import org.jetbrains.kotlin.fir.declarations.utils.modality @@ -43,7 +43,7 @@ class FirTypeIntersectionScope private constructor( private val overriddenSymbols: MutableMap, Collection>>> = mutableMapOf() private val intersectionOverrides = - session.fakeOverrideStorage.intersectionOverrideCacheByScope.getValue(dispatchReceiverType).intersectionOverrides + session.intersectionOverrideStorage.cacheByScope.getValue(dispatchReceiverType).intersectionOverrides private val callableNamesCached by lazy(LazyThreadSafetyMode.PUBLICATION) { scopes.flatMapTo(mutableSetOf()) { it.getCallableNames() } @@ -113,7 +113,7 @@ class FirTypeIntersectionScope private constructor( val (mostSpecific, scopeForMostSpecific) = selectMostSpecificMember(baseMembersForIntersection) val intersectionOverride = intersectionOverrides.getValue( mostSpecific, - FirFakeOverrideStorage.ContextForIntersectionOverrideConstruction(this, extractedOverrides, scopeForMostSpecific) + FirIntersectionOverrideStorage.ContextForIntersectionOverrideConstruction(this, extractedOverrides, scopeForMostSpecific) ) overriddenSymbols[intersectionOverride.member] = extractedOverrides @Suppress("UNCHECKED_CAST") @@ -585,3 +585,26 @@ class MemberWithBaseScope>(val member: D, val baseS } private fun > D.withScope(baseScope: FirTypeScope) = MemberWithBaseScope(this, baseScope) + +class FirIntersectionOverrideStorage(val session: FirSession) : FirSessionComponent { + private val cachesFactory = session.firCachesFactory + + class CacheForScope(cachesFactory: FirCachesFactory) { + val intersectionOverrides: FirCache, MemberWithBaseScope>, ContextForIntersectionOverrideConstruction<*>> = + cachesFactory.createCache { mostSpecific, context -> + val (intersectionScope, extractedOverrides, scopeForMostSpecific) = context + intersectionScope.createIntersectionOverride(extractedOverrides, mostSpecific, scopeForMostSpecific) + } + } + + data class ContextForIntersectionOverrideConstruction>( + val intersectionScope: FirTypeIntersectionScope, + val extractedOverrides: List>, + val scopeForMostSpecific: FirTypeScope + ) + + val cacheByScope: FirCache = + cachesFactory.createCache { _ -> CacheForScope(cachesFactory) } +} + +private val FirSession.intersectionOverrideStorage: FirIntersectionOverrideStorage by FirSession.sessionComponentAccessor()