psi2ir: approximate types in TypeTranslator
This commit is contained in:
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext
|
|||||||
import org.jetbrains.kotlin.psi2ir.transformations.AnnotationGenerator
|
import org.jetbrains.kotlin.psi2ir.transformations.AnnotationGenerator
|
||||||
import org.jetbrains.kotlin.psi2ir.transformations.ScopedTypeParametersResolver
|
import org.jetbrains.kotlin.psi2ir.transformations.ScopedTypeParametersResolver
|
||||||
import org.jetbrains.kotlin.types.*
|
import org.jetbrains.kotlin.types.*
|
||||||
|
import org.jetbrains.kotlin.types.typesApproximation.approximateCapturedTypes
|
||||||
|
|
||||||
class TypeTranslator(
|
class TypeTranslator(
|
||||||
moduleDescriptor: ModuleDescriptor,
|
moduleDescriptor: ModuleDescriptor,
|
||||||
@@ -53,32 +54,35 @@ class TypeTranslator(
|
|||||||
fun translateType(ktType: KotlinType): IrType =
|
fun translateType(ktType: KotlinType): IrType =
|
||||||
translateType(ktType, Variance.INVARIANT).type
|
translateType(ktType, Variance.INVARIANT).type
|
||||||
|
|
||||||
private fun translateType(ktType: KotlinType, variance: Variance): IrTypeProjection {
|
private fun translateType(ktType0: KotlinType, variance: Variance): IrTypeProjection {
|
||||||
|
// TODO "old" JVM BE does this for reified type arguments. Is it ok for arbitrary subexpressions?
|
||||||
|
val ktTypeUpper = approximateCapturedTypes(ktType0).upper
|
||||||
|
|
||||||
when {
|
when {
|
||||||
ktType.isError -> return IrErrorTypeImpl(translateTypeAnnotations(ktType.annotations), variance)
|
ktTypeUpper.isError -> return IrErrorTypeImpl(translateTypeAnnotations(ktTypeUpper.annotations), variance)
|
||||||
ktType.isFlexible() -> return translateType(ktType.upperIfFlexible(), variance)
|
ktTypeUpper.isFlexible() -> return translateType(ktTypeUpper.upperIfFlexible(), variance)
|
||||||
ktType.isDynamic() -> return IrDynamicTypeImpl(translateTypeAnnotations(ktType.annotations), variance)
|
ktTypeUpper.isDynamic() -> return IrDynamicTypeImpl(translateTypeAnnotations(ktTypeUpper.annotations), variance)
|
||||||
}
|
}
|
||||||
|
|
||||||
val ktTypeConstructor = ktType.constructor
|
val ktTypeConstructor = ktTypeUpper.constructor
|
||||||
val ktTypeDescriptor = ktTypeConstructor.declarationDescriptor ?: throw AssertionError("No descriptor for type $ktType")
|
val ktTypeDescriptor = ktTypeConstructor.declarationDescriptor ?: throw AssertionError("No descriptor for type $ktTypeUpper")
|
||||||
|
|
||||||
return when (ktTypeDescriptor) {
|
return when (ktTypeDescriptor) {
|
||||||
is TypeParameterDescriptor ->
|
is TypeParameterDescriptor ->
|
||||||
IrSimpleTypeImpl(
|
IrSimpleTypeImpl(
|
||||||
resolveTypeParameter(ktTypeDescriptor),
|
resolveTypeParameter(ktTypeDescriptor),
|
||||||
ktType.isMarkedNullable,
|
ktTypeUpper.isMarkedNullable,
|
||||||
emptyList(),
|
emptyList(),
|
||||||
translateTypeAnnotations(ktType.annotations),
|
translateTypeAnnotations(ktTypeUpper.annotations),
|
||||||
variance
|
variance
|
||||||
)
|
)
|
||||||
|
|
||||||
is ClassDescriptor ->
|
is ClassDescriptor ->
|
||||||
IrSimpleTypeImpl(
|
IrSimpleTypeImpl(
|
||||||
symbolTable.referenceClass(ktTypeDescriptor),
|
symbolTable.referenceClass(ktTypeDescriptor),
|
||||||
ktType.isMarkedNullable,
|
ktTypeUpper.isMarkedNullable,
|
||||||
translateTypeArguments(ktType.arguments),
|
translateTypeArguments(ktTypeUpper.arguments),
|
||||||
translateTypeAnnotations(ktType.annotations),
|
translateTypeAnnotations(ktTypeUpper.annotations),
|
||||||
variance
|
variance
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user