[FIR] Use captureFromArguments in createSubstitution

This commit breaks ~57 resolve tests because captured types
now exists at the end of FIR resolve
This commit is contained in:
Mikhail Glukhikh
2020-09-10 08:53:08 +03:00
parent e83f3bbf04
commit 7a73787680
3 changed files with 8 additions and 5 deletions
@@ -32,7 +32,7 @@ fun ConeKotlinType.scope(useSiteSession: FirSession, scopeSession: ScopeSession)
fir.symbol.ensureResolved(FirResolvePhase.STATUS, useSiteSession)
val substitution = createSubstitution(fir.typeParameters, fullyExpandedType.typeArguments, useSiteSession)
val substitution = createSubstitution(fir.typeParameters, fullyExpandedType, useSiteSession)
fir.scope(substitutorByMap(substitution), useSiteSession, scopeSession, skipPrivateMembers = false)
}
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.typeContext
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.types.model.CaptureStatus
abstract class SupertypeSupplier {
abstract fun forClass(firClass: FirClass<*>): List<ConeClassLikeType>
@@ -63,9 +64,11 @@ data class SubstitutionScopeKey(val type: ConeClassLikeType) : ScopeSessionKey<F
/* TODO REMOVE */
fun createSubstitution(
typeParameters: List<FirTypeParameterRef>, // TODO: or really declared?
typeArguments: Array<out ConeTypeProjection>,
type: ConeClassLikeType,
session: FirSession
): Map<FirTypeParameterSymbol, ConeKotlinType> {
val capturedOrType = session.typeContext.captureFromArguments(type, CaptureStatus.FOR_SUBTYPING) ?: type
val typeArguments = (capturedOrType as ConeClassLikeType).typeArguments
return typeParameters.zip(typeArguments) { typeParameter, typeArgument ->
val typeParameterSymbol = typeParameter.symbol
typeParameterSymbol to when (typeArgument) {
@@ -92,14 +95,14 @@ fun ConeClassLikeType.wrapSubstitutionScopeIfNeed(
if (this.typeArguments.isEmpty()) return useSiteMemberScope
return builder.getOrBuild(declaration.symbol, SubstitutionScopeKey(this)) {
val typeParameters = (declaration as? FirTypeParameterRefsOwner)?.typeParameters.orEmpty()
val originalSubstitution = createSubstitution(typeParameters, typeArguments, session)
val originalSubstitution = createSubstitution(typeParameters, this, session)
val platformClass = session.platformClassMapper.getCorrespondingPlatformClass(declaration)
if (platformClass != null) {
// This kind of substitution is necessary when method which is mapped from Java (e.g. Java Map.forEach)
// is called on an external type, like MyMap<String, String>,
// to determine parameter types properly (e.g. String, String instead of K, V)
val platformTypeParameters = platformClass.typeParameters
val platformSubstitution = createSubstitution(platformTypeParameters, typeArguments, session)
val platformSubstitution = createSubstitution(platformTypeParameters, this, session)
FirClassSubstitutionScope(
session, useSiteMemberScope, builder, originalSubstitution + platformSubstitution,
skipPrivateMembers = true, derivedClassId = derivedClassId
@@ -70,7 +70,7 @@ 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.typeArguments, useSiteSession)
val originalSubstitution = createSubstitution(symbol.fir.typeParameters, type, useSiteSession)
return substitutorByMap(originalSubstitution)
}