FIR: extract "toTypeProjection"

This commit is contained in:
Mikhail Glukhikh
2019-02-21 14:49:41 +03:00
parent f8497bc339
commit 84a3239cdf
2 changed files with 14 additions and 15 deletions
@@ -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)
}
}
@@ -52,17 +52,20 @@ fun ConeSymbol.constructType(typeArguments: Array<ConeKotlinTypeProjection>, isN
fun ConeSymbol.constructType(parts: List<FirQualifierPart>, 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<FirQualifierPart>.toTypeProjections(): Array<ConeKotlinTypeProjection> = 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("!")
}