From 7a737876806115a63f5e65130cf2d3b016e0e1c3 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 10 Sep 2020 08:53:08 +0300 Subject: [PATCH] [FIR] Use captureFromArguments in createSubstitution This commit breaks ~57 resolve tests because captured types now exists at the end of FIR resolve --- .../src/org/jetbrains/kotlin/fir/resolve/ScopeUtils.kt | 2 +- .../org/jetbrains/kotlin/fir/resolve/SupertypeUtils.kt | 9 ++++++--- .../jetbrains/kotlin/fir/scopes/KotlinScopeProvider.kt | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ScopeUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ScopeUtils.kt index 396d10c2888..0eee965dd54 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ScopeUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ScopeUtils.kt @@ -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) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SupertypeUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SupertypeUtils.kt index a4d9a796d79..42e42baaba9 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SupertypeUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SupertypeUtils.kt @@ -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 @@ -63,9 +64,11 @@ data class SubstitutionScopeKey(val type: ConeClassLikeType) : ScopeSessionKey, // TODO: or really declared? - typeArguments: Array, + type: ConeClassLikeType, session: FirSession ): Map { + 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, // 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 diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/KotlinScopeProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/KotlinScopeProvider.kt index 845991bba98..5fdfb522c6e 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/KotlinScopeProvider.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/KotlinScopeProvider.kt @@ -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) }