FIR: extract "toTypeProjection"
This commit is contained in:
+3
-7
@@ -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("!")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user