FIR: extract "toTypeProjection"
This commit is contained in:
+3
-7
@@ -6,6 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.fir.deserialization
|
package org.jetbrains.kotlin.fir.deserialization
|
||||||
|
|
||||||
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
|
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.ConeClassLikeSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
|
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterSymbol
|
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.ProtoEnumFlags
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.getClassId
|
import org.jetbrains.kotlin.serialization.deserialization.getClassId
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.getName
|
import org.jetbrains.kotlin.serialization.deserialization.getName
|
||||||
import org.jetbrains.kotlin.types.Variance
|
|
||||||
import java.lang.RuntimeException
|
import java.lang.RuntimeException
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
@@ -129,15 +129,11 @@ class FirTypeDeserializer(
|
|||||||
return StarProjection
|
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 type = typeArgumentProto.type(typeTable) ?: return ConeKotlinErrorType("No type recorded")
|
||||||
|
|
||||||
val coneType = type(type)
|
val coneType = type(type)
|
||||||
return when (projection) {
|
return coneType.toTypeProjection(variance)
|
||||||
Variance.INVARIANT -> coneType
|
|
||||||
Variance.IN_VARIANCE -> ConeKotlinTypeProjectionIn(coneType)
|
|
||||||
Variance.OUT_VARIANCE -> ConeKotlinTypeProjectionOut(coneType)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -52,17 +52,20 @@ fun ConeSymbol.constructType(typeArguments: Array<ConeKotlinTypeProjection>, isN
|
|||||||
fun ConeSymbol.constructType(parts: List<FirQualifierPart>, isNullable: Boolean): ConeKotlinType =
|
fun ConeSymbol.constructType(parts: List<FirQualifierPart>, isNullable: Boolean): ConeKotlinType =
|
||||||
constructType(parts.toTypeProjections(), isNullable)
|
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 {
|
private fun List<FirQualifierPart>.toTypeProjections(): Array<ConeKotlinTypeProjection> = flatMap {
|
||||||
it.typeArguments.map {
|
it.typeArguments.map { typeArgument ->
|
||||||
when (it) {
|
when (typeArgument) {
|
||||||
is FirStarProjection -> StarProjection
|
is FirStarProjection -> StarProjection
|
||||||
is FirTypeProjectionWithVariance -> {
|
is FirTypeProjectionWithVariance -> {
|
||||||
val type = (it.typeRef as FirResolvedTypeRef).type
|
val type = (typeArgument.typeRef as FirResolvedTypeRef).type
|
||||||
when (it.variance) {
|
type.toTypeProjection(typeArgument.variance)
|
||||||
Variance.INVARIANT -> type
|
|
||||||
Variance.IN_VARIANCE -> ConeKotlinTypeProjectionIn(type)
|
|
||||||
Variance.OUT_VARIANCE -> ConeKotlinTypeProjectionOut(type)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else -> error("!")
|
else -> error("!")
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user