diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/FirTypeDeserializer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/FirTypeDeserializer.kt index eef28b4a9fc..2a95475e46c 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/FirTypeDeserializer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/FirTypeDeserializer.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.deserialization import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider +import org.jetbrains.kotlin.fir.resolve.toTypeProjection import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol import org.jetbrains.kotlin.fir.symbols.ConeSymbol import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterSymbol @@ -20,7 +21,6 @@ import org.jetbrains.kotlin.metadata.deserialization.* import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags import org.jetbrains.kotlin.serialization.deserialization.getClassId import org.jetbrains.kotlin.serialization.deserialization.getName -import org.jetbrains.kotlin.types.Variance import java.lang.RuntimeException import java.util.* @@ -129,15 +129,11 @@ class FirTypeDeserializer( return StarProjection } - val projection = ProtoEnumFlags.variance(typeArgumentProto.projection) + val variance = ProtoEnumFlags.variance(typeArgumentProto.projection) val type = typeArgumentProto.type(typeTable) ?: return ConeKotlinErrorType("No type recorded") val coneType = type(type) - return when (projection) { - Variance.INVARIANT -> coneType - Variance.IN_VARIANCE -> ConeKotlinTypeProjectionIn(coneType) - Variance.OUT_VARIANCE -> ConeKotlinTypeProjectionOut(coneType) - } + return coneType.toTypeProjection(variance) } } \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt index 28ce7b33591..9fe71bc9a57 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt @@ -52,17 +52,20 @@ fun ConeSymbol.constructType(typeArguments: Array, isN fun ConeSymbol.constructType(parts: List, isNullable: Boolean): ConeKotlinType = constructType(parts.toTypeProjections(), isNullable) +fun ConeKotlinType.toTypeProjection(variance: Variance): ConeKotlinTypeProjection = + when (variance) { + Variance.INVARIANT -> this + Variance.IN_VARIANCE -> ConeKotlinTypeProjectionIn(this) + Variance.OUT_VARIANCE -> ConeKotlinTypeProjectionOut(this) + } + private fun List.toTypeProjections(): Array = flatMap { - it.typeArguments.map { - when (it) { + it.typeArguments.map { typeArgument -> + when (typeArgument) { is FirStarProjection -> StarProjection is FirTypeProjectionWithVariance -> { - val type = (it.typeRef as FirResolvedTypeRef).type - when (it.variance) { - Variance.INVARIANT -> type - Variance.IN_VARIANCE -> ConeKotlinTypeProjectionIn(type) - Variance.OUT_VARIANCE -> ConeKotlinTypeProjectionOut(type) - } + val type = (typeArgument.typeRef as FirResolvedTypeRef).type + type.toTypeProjection(typeArgument.variance) } else -> error("!") }