From f9b19c6286a1df79f3e25f6bd4a10d7c5c818941 Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Tue, 24 Jul 2018 14:08:52 +0300 Subject: [PATCH] [NI] Approximate types during type translation for IR --- .../jetbrains/kotlin/ir/util/TypeTranslator.kt | 16 +++++++++++----- ...eTypeParameterReplacedWithIntersectionType.kt | 2 +- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/TypeTranslator.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/TypeTranslator.kt index a192173ed8b..47a339cad9e 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/TypeTranslator.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/TypeTranslator.kt @@ -27,6 +27,7 @@ class TypeTranslator( ) { private val typeParametersResolver = ScopedTypeParametersResolver() + private val typeApproximatorForNI = TypeApproximator() lateinit var constantValueGenerator: ConstantValueGenerator fun enterScope(irElement: IrTypeParametersContainer) { @@ -54,11 +55,7 @@ class TypeTranslator( 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 = - if (ktType0.constructor.isDenotable) - ktType0 - else - approximateCapturedTypes(ktType0).upper + val ktTypeUpper = ktType0.approximate(languageVersionSettings) when { ktTypeUpper.isError -> return IrErrorTypeImpl(ktTypeUpper, translateTypeAnnotations(ktTypeUpper.annotations), variance) @@ -95,6 +92,15 @@ class TypeTranslator( } } + private fun KotlinType.approximate(languageVersionSettings: LanguageVersionSettings): KotlinType { + if (this.constructor.isDenotable) return this + + return if (languageVersionSettings.supportsFeature(LanguageFeature.NewInference)) + typeApproximatorForNI.approximateDeclarationType(this, local = false, languageVersionSettings = languageVersionSettings) + else + approximateCapturedTypes(this).upper + } + private fun translateTypeAnnotations(annotations: Annotations): List = annotations.getAllAnnotations().map { // TODO filter out annotation targets diff --git a/compiler/testData/codegen/box/regressions/noAssertionsWhenNullableTypeParameterReplacedWithIntersectionType.kt b/compiler/testData/codegen/box/regressions/noAssertionsWhenNullableTypeParameterReplacedWithIntersectionType.kt index eff4eaca797..cdc8fb844eb 100644 --- a/compiler/testData/codegen/box/regressions/noAssertionsWhenNullableTypeParameterReplacedWithIntersectionType.kt +++ b/compiler/testData/codegen/box/regressions/noAssertionsWhenNullableTypeParameterReplacedWithIntersectionType.kt @@ -1,5 +1,5 @@ // !LANGUAGE: +NewInference -// IGNORE_BACKEND: JS_IR, JVM_IR +// IGNORE_BACKEND: JVM_IR class Recursive> : Generic>, MainSupertype open class Simple : Generic, MainSupertype