psi2ir: approximate types in TypeTranslator

This commit is contained in:
Dmitry Petrov
2018-04-20 15:20:09 +03:00
parent 1be28d6032
commit c28877d23c
@@ -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
) )