[FE] Consider derived class tag on caching substitution scopes

This commit is contained in:
Yan Zhulanow
2022-11-18 01:16:29 +09:00
committed by Space Team
parent fe69b21aed
commit 0e050ae7f1
7 changed files with 111 additions and 5 deletions
@@ -83,7 +83,10 @@ class FirKotlinScopeProvider(
data class ConeSubstitutionScopeKey(
val lookupTag: ConeClassLikeLookupTag, val isFromExpectClass: Boolean, val substitutor: ConeSubstitutor
val lookupTag: ConeClassLikeLookupTag,
val isFromExpectClass: Boolean,
val substitutor: ConeSubstitutor,
val derivedClassLookupTag: ConeClassLikeLookupTag?
) : ScopeSessionKey<FirClass, FirClassSubstitutionScope>()
fun FirClass.unsubstitutedScope(
@@ -162,10 +165,14 @@ private fun FirClass.scopeForClassImpl(
val basicScope = unsubstitutedScope(useSiteSession, scopeSession, withForcedTypeCalculator = false)
if (substitutor == ConeSubstitutor.Empty) return basicScope
val key = ConeSubstitutionScopeKey(classFirDispatchReceiver.symbol.toLookupTag(), isFromExpectClass, substitutor)
return scopeSession.getOrBuild(
this, key
) {
val key = ConeSubstitutionScopeKey(
classFirDispatchReceiver.symbol.toLookupTag(),
isFromExpectClass,
substitutor,
derivedClassLookupTag
)
return scopeSession.getOrBuild(this, key) {
FirClassSubstitutionScope(
useSiteSession,
basicScope,