From e6476c39ca2a4f46acae653c2a6e917e70bfcb91 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 19 Feb 2021 22:38:55 +0100 Subject: [PATCH] JVM IR: fix isMarkedNullable for nullability-flexible types Since nullability-flexible types in IR are represented by an annotation on an IrSimpleType, not a special instance, the common implementation of `KotlinTypeMarker.isMarkedNullable` in `TypeSystemContext` doesn't work. This method is used for example to generate `typeOf` in JVM IR, in `TypeSystemCommonBackendContext.generateTypeOf`, and this issue led to a difference in behavior of `typeOf` for nullability-flexible types. #KT-44726 Fixed --- .../FirBlackBoxCodegenTestGenerated.java | 6 +++++ .../kotlin/ir/types/IrTypeSystemContext.kt | 3 +++ .../box/reflection/typeOf/flexibleType.kt | 27 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 +++++ .../IrBlackBoxCodegenTestGenerated.java | 6 +++++ .../LightAnalysisModeTestGenerated.java | 5 ++++ 6 files changed, 53 insertions(+) create mode 100644 compiler/testData/codegen/box/reflection/typeOf/flexibleType.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 334731fb4da..d5d9d6903a5 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -35417,6 +35417,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/reflection/typeOf/classes.kt"); } + @Test + @TestMetadata("flexibleType.kt") + public void testFlexibleType() throws Exception { + runTest("compiler/testData/codegen/box/reflection/typeOf/flexibleType.kt"); + } + @Test @TestMetadata("inlineClasses.kt") public void testInlineClasses() throws Exception { diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSystemContext.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSystemContext.kt index 900ae060e46..b572a619ecc 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSystemContext.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSystemContext.kt @@ -77,6 +77,9 @@ interface IrTypeSystemContext : TypeSystemContext, TypeSystemCommonSuperTypesCon override fun SimpleTypeMarker.isMarkedNullable(): Boolean = (this as IrSimpleType).hasQuestionMark + override fun KotlinTypeMarker.isMarkedNullable(): Boolean = + this is IrSimpleType && !isWithFlexibleNullability() && hasQuestionMark + override fun SimpleTypeMarker.withNullability(nullable: Boolean): SimpleTypeMarker { val simpleType = this as IrSimpleType return if (simpleType.hasQuestionMark == nullable) simpleType diff --git a/compiler/testData/codegen/box/reflection/typeOf/flexibleType.kt b/compiler/testData/codegen/box/reflection/typeOf/flexibleType.kt new file mode 100644 index 00000000000..0c5831aee52 --- /dev/null +++ b/compiler/testData/codegen/box/reflection/typeOf/flexibleType.kt @@ -0,0 +1,27 @@ +// !USE_EXPERIMENTAL: kotlin.ExperimentalStdlibApi +// TARGET_BACKEND: JVM +// IGNORE_BACKEND_FIR: JVM_IR +// WITH_REFLECT +// FILE: box.kt + +package test + +import kotlin.reflect.* + +fun box(): String { + val v = returnTypeOf { J.get() }.toString() + if (v != "J") return "Fail: $v" + + return "OK" +} + +inline fun returnTypeOf(block: () -> T) = + typeOf() + +// FILE: J.java + +public class J { + public static J get() { + return null; + } +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index c33a85383c9..a63e361300f 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -35417,6 +35417,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/reflection/typeOf/classes.kt"); } + @Test + @TestMetadata("flexibleType.kt") + public void testFlexibleType() throws Exception { + runTest("compiler/testData/codegen/box/reflection/typeOf/flexibleType.kt"); + } + @Test @TestMetadata("inlineClasses.kt") public void testInlineClasses() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 5868bc5ebc8..ed7f37b9f4f 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -35417,6 +35417,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/reflection/typeOf/classes.kt"); } + @Test + @TestMetadata("flexibleType.kt") + public void testFlexibleType() throws Exception { + runTest("compiler/testData/codegen/box/reflection/typeOf/flexibleType.kt"); + } + @Test @TestMetadata("inlineClasses.kt") public void testInlineClasses() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index cdaebd624d9..be628907911 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -28146,6 +28146,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/reflection/typeOf/classes.kt"); } + @TestMetadata("flexibleType.kt") + public void testFlexibleType() throws Exception { + runTest("compiler/testData/codegen/box/reflection/typeOf/flexibleType.kt"); + } + @TestMetadata("inlineClasses.kt") public void testInlineClasses() throws Exception { runTest("compiler/testData/codegen/box/reflection/typeOf/inlineClasses.kt");