[FIR] Split fake override storage to three different components
This commit is contained in:
committed by
TeamCityServer
parent
9a8ad059d5
commit
4f99140c2d
+5
-2
@@ -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.resolve.transformers.FirPhaseCheckingPhaseManager
|
||||||
import org.jetbrains.kotlin.fir.symbols.FirPhaseManager
|
import org.jetbrains.kotlin.fir.symbols.FirPhaseManager
|
||||||
import org.jetbrains.kotlin.fir.resolve.transformers.plugin.GeneratedClassIndex
|
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.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.fir.types.FirCorrespondingSupertypesCache
|
||||||
import org.jetbrains.kotlin.incremental.components.LookupTracker
|
import org.jetbrains.kotlin.incremental.components.LookupTracker
|
||||||
import org.jetbrains.kotlin.resolve.jvm.modules.JavaModuleResolver
|
import org.jetbrains.kotlin.resolve.jvm.modules.JavaModuleResolver
|
||||||
@@ -54,7 +55,9 @@ fun FirSession.registerCommonComponents(languageVersionSettings: LanguageVersion
|
|||||||
register(FirPredicateBasedProvider::class, FirPredicateBasedProvider.create(this))
|
register(FirPredicateBasedProvider::class, FirPredicateBasedProvider.create(this))
|
||||||
register(GeneratedClassIndex::class, GeneratedClassIndex.create())
|
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)
|
@OptIn(SessionConfiguration::class)
|
||||||
|
|||||||
@@ -8,10 +8,11 @@ package org.jetbrains.kotlin.fir.resolve
|
|||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.descriptors.EffectiveVisibility
|
import org.jetbrains.kotlin.descriptors.EffectiveVisibility
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
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.NullableMap
|
||||||
|
import org.jetbrains.kotlin.fir.caches.firCachesFactory
|
||||||
import org.jetbrains.kotlin.fir.caches.getOrPut
|
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.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.builder.FirTypeParameterBuilder
|
import org.jetbrains.kotlin.fir.declarations.builder.FirTypeParameterBuilder
|
||||||
import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunction
|
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.impl.FirResolvedDeclarationStatusImpl
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.*
|
import org.jetbrains.kotlin.fir.declarations.utils.*
|
||||||
import org.jetbrains.kotlin.fir.diagnostics.ConeIntermediateDiagnostic
|
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.calls.FirSyntheticFunctionSymbol
|
||||||
import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap
|
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.impl.hasTypeOf
|
||||||
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
|
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
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.*
|
||||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||||
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
|
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
|
||||||
@@ -42,7 +40,7 @@ abstract class FirSamResolver {
|
|||||||
abstract fun getSamConstructor(firRegularClass: FirRegularClass): FirSimpleFunction?
|
abstract fun getSamConstructor(firRegularClass: FirRegularClass): FirSimpleFunction?
|
||||||
}
|
}
|
||||||
|
|
||||||
val SAM_PARAMETER_NAME = Name.identifier("block")
|
private val SAM_PARAMETER_NAME = Name.identifier("block")
|
||||||
|
|
||||||
class FirSamResolverImpl(
|
class FirSamResolverImpl(
|
||||||
private val session: FirSession,
|
private val session: FirSession,
|
||||||
@@ -50,7 +48,7 @@ class FirSamResolverImpl(
|
|||||||
private val outerClassManager: FirOuterClassManager? = null,
|
private val outerClassManager: FirOuterClassManager? = null,
|
||||||
) : FirSamResolver() {
|
) : FirSamResolver() {
|
||||||
private val resolvedFunctionType: NullableMap<FirRegularClass, ConeLookupTagBasedType?> = NullableMap()
|
private val resolvedFunctionType: NullableMap<FirRegularClass, ConeLookupTagBasedType?> = NullableMap()
|
||||||
private val samConstructorsCache = session.fakeOverrideStorage.samConstructorCache
|
private val samConstructorsCache = session.samConstructorStorage.samConstructors
|
||||||
|
|
||||||
override fun getFunctionTypeForPossibleSamType(type: ConeKotlinType): ConeKotlinType? {
|
override fun getFunctionTypeForPossibleSamType(type: ConeKotlinType): ConeKotlinType? {
|
||||||
return when (type) {
|
return when (type) {
|
||||||
@@ -361,3 +359,10 @@ private fun FirSimpleFunction.getFunctionTypeForAbstractMethod(): ConeLookupTagB
|
|||||||
isSuspend = this.isSuspend
|
isSuspend = this.isSuspend
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class FirSamConstructorStorage(session: FirSession) : FirSessionComponent {
|
||||||
|
val samConstructors: FirCache<FirRegularClassSymbol, FirNamedFunctionSymbol?, FirSamResolverImpl> =
|
||||||
|
session.firCachesFactory.createCache { classSymbol, samResolver -> samResolver.buildSamConstructor(classSymbol) }
|
||||||
|
}
|
||||||
|
|
||||||
|
private val FirSession.samConstructorStorage: FirSamConstructorStorage by FirSession.sessionComponentAccessor()
|
||||||
|
|||||||
@@ -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<ScopeSessionKey<*, *>, SubstitutionOverrideCache, Nothing?> =
|
|
||||||
cachesFactory.createCache { _ -> SubstitutionOverrideCache(session.firCachesFactory) }
|
|
||||||
|
|
||||||
class SubstitutionOverrideCache(cachesFactory: FirCachesFactory) {
|
|
||||||
val overridesForFunctions: FirCache<FirNamedFunctionSymbol, FirNamedFunctionSymbol, FirClassSubstitutionScope> =
|
|
||||||
cachesFactory.createCache { original, scope -> scope.createSubstitutionOverrideFunction(original) }
|
|
||||||
val overridesForConstructors: FirCache<FirConstructorSymbol, FirConstructorSymbol, FirClassSubstitutionScope> =
|
|
||||||
cachesFactory.createCache { original, scope -> scope.createSubstitutionOverrideConstructor(original) }
|
|
||||||
val overridesForVariables: FirCache<FirVariableSymbol<*>, 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<FirCallableSymbol<*>, MemberWithBaseScope<FirCallableSymbol<*>>, ContextForIntersectionOverrideConstruction<*>> =
|
|
||||||
cachesFactory.createCache { mostSpecific, context ->
|
|
||||||
val (intersectionScope, extractedOverrides, scopeForMostSpecific) = context
|
|
||||||
intersectionScope.createIntersectionOverride(extractedOverrides, mostSpecific, scopeForMostSpecific)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
data class ContextForIntersectionOverrideConstruction<D : FirCallableSymbol<*>>(
|
|
||||||
val intersectionScope: FirTypeIntersectionScope,
|
|
||||||
val extractedOverrides: List<MemberWithBaseScope<D>>,
|
|
||||||
val scopeForMostSpecific: FirTypeScope
|
|
||||||
)
|
|
||||||
|
|
||||||
val intersectionOverrideCacheByScope: FirCache<ConeKotlinType, IntersectionOverrideCache, Nothing?> =
|
|
||||||
cachesFactory.createCache { _ -> IntersectionOverrideCache(cachesFactory) }
|
|
||||||
|
|
||||||
val samConstructorCache: FirCache<FirRegularClassSymbol, FirNamedFunctionSymbol?, FirSamResolverImpl> =
|
|
||||||
cachesFactory.createCache { classSymbol, samResolver -> samResolver.buildSamConstructor(classSymbol) }
|
|
||||||
}
|
|
||||||
|
|
||||||
val FirSession.fakeOverrideStorage: FirFakeOverrideStorage by FirSession.sessionComponentAccessor()
|
|
||||||
+28
-2
@@ -7,7 +7,8 @@ package org.jetbrains.kotlin.fir.scopes.impl
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
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.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.visibility
|
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
|
private val newOwnerClassId = dispatchReceiverTypeForSubstitutedMembers.lookupTag.classId
|
||||||
|
|
||||||
override fun processFunctionsByName(name: Name, processor: (FirNamedFunctionSymbol) -> Unit) {
|
override fun processFunctionsByName(name: Name, processor: (FirNamedFunctionSymbol) -> Unit) {
|
||||||
@@ -288,3 +289,28 @@ class FirClassSubstitutionScope(
|
|||||||
return useSiteMemberScope.getClassifierNames()
|
return useSiteMemberScope.getClassifierNames()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class FirSubstitutionOverrideStorage(val session: FirSession) : FirSessionComponent {
|
||||||
|
private val cachesFactory = session.firCachesFactory
|
||||||
|
|
||||||
|
val substitutionOverrideCacheByScope: FirCache<ScopeSessionKey<*, *>, SubstitutionOverrideCache, Nothing?> =
|
||||||
|
cachesFactory.createCache { _ -> SubstitutionOverrideCache(session.firCachesFactory) }
|
||||||
|
|
||||||
|
class SubstitutionOverrideCache(cachesFactory: FirCachesFactory) {
|
||||||
|
val overridesForFunctions: FirCache<FirNamedFunctionSymbol, FirNamedFunctionSymbol, FirClassSubstitutionScope> =
|
||||||
|
cachesFactory.createCache { original, scope -> scope.createSubstitutionOverrideFunction(original) }
|
||||||
|
val overridesForConstructors: FirCache<FirConstructorSymbol, FirConstructorSymbol, FirClassSubstitutionScope> =
|
||||||
|
cachesFactory.createCache { original, scope -> scope.createSubstitutionOverrideConstructor(original) }
|
||||||
|
val overridesForVariables: FirCache<FirVariableSymbol<*>, 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()
|
||||||
|
|||||||
+26
-3
@@ -9,7 +9,7 @@ import org.jetbrains.kotlin.descriptors.Modality
|
|||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
import org.jetbrains.kotlin.descriptors.Visibility
|
import org.jetbrains.kotlin.descriptors.Visibility
|
||||||
import org.jetbrains.kotlin.fir.*
|
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.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.isExpect
|
import org.jetbrains.kotlin.fir.declarations.utils.isExpect
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.modality
|
import org.jetbrains.kotlin.fir.declarations.utils.modality
|
||||||
@@ -43,7 +43,7 @@ class FirTypeIntersectionScope private constructor(
|
|||||||
private val overriddenSymbols: MutableMap<FirCallableSymbol<*>, Collection<MemberWithBaseScope<FirCallableSymbol<*>>>> = mutableMapOf()
|
private val overriddenSymbols: MutableMap<FirCallableSymbol<*>, Collection<MemberWithBaseScope<FirCallableSymbol<*>>>> = mutableMapOf()
|
||||||
|
|
||||||
private val intersectionOverrides =
|
private val intersectionOverrides =
|
||||||
session.fakeOverrideStorage.intersectionOverrideCacheByScope.getValue(dispatchReceiverType).intersectionOverrides
|
session.intersectionOverrideStorage.cacheByScope.getValue(dispatchReceiverType).intersectionOverrides
|
||||||
|
|
||||||
private val callableNamesCached by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
private val callableNamesCached by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
||||||
scopes.flatMapTo(mutableSetOf()) { it.getCallableNames() }
|
scopes.flatMapTo(mutableSetOf()) { it.getCallableNames() }
|
||||||
@@ -113,7 +113,7 @@ class FirTypeIntersectionScope private constructor(
|
|||||||
val (mostSpecific, scopeForMostSpecific) = selectMostSpecificMember(baseMembersForIntersection)
|
val (mostSpecific, scopeForMostSpecific) = selectMostSpecificMember(baseMembersForIntersection)
|
||||||
val intersectionOverride = intersectionOverrides.getValue(
|
val intersectionOverride = intersectionOverrides.getValue(
|
||||||
mostSpecific,
|
mostSpecific,
|
||||||
FirFakeOverrideStorage.ContextForIntersectionOverrideConstruction(this, extractedOverrides, scopeForMostSpecific)
|
FirIntersectionOverrideStorage.ContextForIntersectionOverrideConstruction(this, extractedOverrides, scopeForMostSpecific)
|
||||||
)
|
)
|
||||||
overriddenSymbols[intersectionOverride.member] = extractedOverrides
|
overriddenSymbols[intersectionOverride.member] = extractedOverrides
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
@@ -585,3 +585,26 @@ class MemberWithBaseScope<out D : FirCallableSymbol<*>>(val member: D, val baseS
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun <D : FirCallableSymbol<*>> D.withScope(baseScope: FirTypeScope) = MemberWithBaseScope(this, baseScope)
|
private fun <D : FirCallableSymbol<*>> 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<FirCallableSymbol<*>, MemberWithBaseScope<FirCallableSymbol<*>>, ContextForIntersectionOverrideConstruction<*>> =
|
||||||
|
cachesFactory.createCache { mostSpecific, context ->
|
||||||
|
val (intersectionScope, extractedOverrides, scopeForMostSpecific) = context
|
||||||
|
intersectionScope.createIntersectionOverride(extractedOverrides, mostSpecific, scopeForMostSpecific)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data class ContextForIntersectionOverrideConstruction<D : FirCallableSymbol<*>>(
|
||||||
|
val intersectionScope: FirTypeIntersectionScope,
|
||||||
|
val extractedOverrides: List<MemberWithBaseScope<D>>,
|
||||||
|
val scopeForMostSpecific: FirTypeScope
|
||||||
|
)
|
||||||
|
|
||||||
|
val cacheByScope: FirCache<ConeKotlinType, CacheForScope, Nothing?> =
|
||||||
|
cachesFactory.createCache { _ -> CacheForScope(cachesFactory) }
|
||||||
|
}
|
||||||
|
|
||||||
|
private val FirSession.intersectionOverrideStorage: FirIntersectionOverrideStorage by FirSession.sessionComponentAccessor()
|
||||||
|
|||||||
Reference in New Issue
Block a user