FIR: Fix supertype scopes for local classes

Do not use ClassId as it can't be a key for local classes
This commit is contained in:
Denis.Zharkov
2021-02-17 16:21:22 +03:00
parent 3e420ca4e3
commit 23705a269f
2 changed files with 20 additions and 5 deletions
@@ -13,12 +13,12 @@ import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap
import org.jetbrains.kotlin.fir.scopes.impl.*
import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.fir.types.ConeClassErrorType
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.coneType
import org.jetbrains.kotlin.name.ClassId
class KotlinScopeProvider(
val declaredMemberScopeDecorator: (
@@ -72,7 +72,7 @@ class KotlinScopeProvider(
data class ConeSubstitutionScopeKey(
val classId: ClassId?, val isFromExpectClass: Boolean, val substitutor: ConeSubstitutor
val lookupTag: ConeClassLikeLookupTag, val isFromExpectClass: Boolean, val substitutor: ConeSubstitutor
) : ScopeSessionKey<FirClass<*>, FirClassSubstitutionScope>()
data class DelegatedMemberScopeKey(val callableId: CallableId) : ScopeSessionKey<FirField, FirDelegatedMemberScope>()
@@ -166,7 +166,7 @@ private fun FirClass<*>.scopeForClassImpl(
if (substitutor == ConeSubstitutor.Empty) return basicScope
return scopeSession.getOrBuild(
this, ConeSubstitutionScopeKey(classFirDispatchReceiver.classId, isFromExpectClass, substitutor)
this, ConeSubstitutionScopeKey(classFirDispatchReceiver.symbol.toLookupTag(), isFromExpectClass, substitutor)
) {
FirClassSubstitutionScope(
useSiteSession, basicScope, substitutor, classFirDispatchReceiver.defaultType(),
@@ -8,7 +8,22 @@ package org.jetbrains.kotlin.fir.symbols.impl
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
import org.jetbrains.kotlin.name.ClassId
data class ConeClassLookupTagWithFixedSymbol(
class ConeClassLookupTagWithFixedSymbol(
override val classId: ClassId,
val symbol: FirClassSymbol<*>
) : ConeClassLikeLookupTag()
) : ConeClassLikeLookupTag() {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as ConeClassLookupTagWithFixedSymbol
if (symbol != other.symbol) return false
return true
}
override fun hashCode(): Int {
return symbol.hashCode()
}
}