FIR: Extract ConeKotlinType::scopeForSupertype

This commit is contained in:
Denis.Zharkov
2021-02-03 20:22:57 +03:00
parent 1a0be3ee40
commit 31b9be2d01
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.symbols.CallableId
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
@@ -40,21 +41,7 @@ class KotlinScopeProvider(
val delegateFields = klass.declarations.filterIsInstance<FirField>().filter { it.isSynthetic }
val scopes = lookupSuperTypes(klass, lookupInterfaces = true, deep = false, useSiteSession = useSiteSession)
.mapNotNull { useSiteSuperType ->
if (useSiteSuperType is ConeClassErrorType) return@mapNotNull null
val symbol = useSiteSuperType.lookupTag.toSymbol(useSiteSession)
if (symbol is FirRegularClassSymbol) {
val delegateField = delegateFields.find { it.returnTypeRef.coneType == useSiteSuperType }
symbol.fir.scopeForSupertype(
substitutor(symbol, useSiteSuperType, useSiteSession),
useSiteSession, scopeSession, delegateField,
subClass = klass,
decoratedDeclaredMemberScope
).let {
it as? FirTypeScope ?: error("$it is expected to be FirOverrideAwareScope")
}
} else {
null
}
useSiteSuperType.scopeForSupertype(useSiteSession, scopeSession, klass, decoratedDeclaredMemberScope, delegateFields)
}
FirClassUseSiteMemberScope(
useSiteSession,
@@ -67,12 +54,6 @@ class KotlinScopeProvider(
}
}
private fun substitutor(symbol: FirRegularClassSymbol, type: ConeClassLikeType, useSiteSession: FirSession): ConeSubstitutor {
if (type.typeArguments.isEmpty()) return ConeSubstitutor.Empty
val originalSubstitution = createSubstitution(symbol.fir.typeParameters, type, useSiteSession)
return substitutorByMap(originalSubstitution)
}
override fun getStaticMemberScopeForCallables(
klass: FirClass<*>,
useSiteSession: FirSession,
@@ -118,7 +99,38 @@ fun FirClass<*>.scopeForClass(
isFromExpectClass = false
)
private fun FirClass<*>.scopeForSupertype(
fun ConeKotlinType.scopeForSupertype(
useSiteSession: FirSession,
scopeSession: ScopeSession,
subClass: FirClass<*>,
declaredMemberScope: FirScope,
delegateFields: List<FirField>?,
): FirTypeScope? {
if (this !is ConeClassLikeType) return null
if (this is ConeClassErrorType) return null
val symbol = lookupTag.toSymbol(useSiteSession)
return if (symbol is FirRegularClassSymbol) {
val delegateField = delegateFields?.find { it.returnTypeRef.coneType == this }
symbol.fir.scopeForSupertype(
substitutor(symbol, this, useSiteSession),
useSiteSession, scopeSession, delegateField,
subClass = subClass,
declaredMemberScope
).let {
it as? FirTypeScope ?: error("$it is expected to be FirOverrideAwareScope")
}
} else {
null
}
}
private fun substitutor(symbol: FirRegularClassSymbol, type: ConeClassLikeType, useSiteSession: FirSession): ConeSubstitutor {
if (type.typeArguments.isEmpty()) return ConeSubstitutor.Empty
val originalSubstitution = createSubstitution(symbol.fir.typeParameters, type, useSiteSession)
return substitutorByMap(originalSubstitution)
}
fun FirClass<*>.scopeForSupertype(
substitutor: ConeSubstitutor,
useSiteSession: FirSession,
scopeSession: ScopeSession,