From 763cb6dd6fc70a7a9c8555d73156913d24340988 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 5 Feb 2020 16:02:52 +0100 Subject: [PATCH] JVM IR: keep original KotlinType in eraseTypeParameters Otherwise EnhancedNullability annotation instance is lost (for some reason it's not translated to IR elements), and in the newly added test, the wrapper type in Java is confused with primitive, and this causes a platform declaration clash error. Also make IrTypeArgument.eraseTypeParameters private, since it's not used outside. --- .../jetbrains/kotlin/backend/jvm/ir/IrUtils.kt | 4 +++- .../typeMapping/enhancedPrimitiveInReturnType.kt | 16 ++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 5 +++++ .../codegen/LightAnalysisModeTestGenerated.java | 5 +++++ .../ir/FirBlackBoxCodegenTestGenerated.java | 5 +++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 +++++ 6 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/typeMapping/enhancedPrimitiveInReturnType.kt diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrUtils.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrUtils.kt index 1c585a9f21d..3c976bba8cf 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrUtils.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrUtils.kt @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl import org.jetbrains.kotlin.ir.types.impl.IrStarProjectionImpl import org.jetbrains.kotlin.ir.types.impl.makeTypeProjection +import org.jetbrains.kotlin.ir.types.impl.originalKotlinType import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.load.java.JavaVisibilities @@ -53,6 +54,7 @@ fun IrType.eraseTypeParameters() = when (this) { is IrSimpleType -> when (val owner = classifier.owner) { is IrClass -> IrSimpleTypeImpl( + originalKotlinType, classifier, hasQuestionMark, arguments.map { it.eraseTypeParameters() }, @@ -72,7 +74,7 @@ fun IrType.eraseTypeParameters() = when (this) { else -> error("Unknown IrType kind: $this") } -fun IrTypeArgument.eraseTypeParameters(): IrTypeArgument = when (this) { +private fun IrTypeArgument.eraseTypeParameters(): IrTypeArgument = when (this) { is IrStarProjection -> this is IrTypeProjection -> makeTypeProjection(type.eraseTypeParameters(), variance) else -> error("Unknown IrTypeArgument kind: $this") diff --git a/compiler/testData/codegen/box/typeMapping/enhancedPrimitiveInReturnType.kt b/compiler/testData/codegen/box/typeMapping/enhancedPrimitiveInReturnType.kt new file mode 100644 index 00000000000..0ce9af256f8 --- /dev/null +++ b/compiler/testData/codegen/box/typeMapping/enhancedPrimitiveInReturnType.kt @@ -0,0 +1,16 @@ +// TARGET_BACKEND: JVM + +// FILE: E.java + +public interface E { + @org.jetbrains.annotations.NotNull + Integer getId(); +} + +// FILE: box.kt + +class EImpl : E { + override fun getId(): Int = 314 +} + +fun box(): String = if (EImpl().getId() == 314) "OK" else "Fail" diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 188e5653a44..6f0b2a88269 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -28169,6 +28169,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/typeMapping"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM, true); } + @TestMetadata("enhancedPrimitiveInReturnType.kt") + public void testEnhancedPrimitiveInReturnType() throws Exception { + runTest("compiler/testData/codegen/box/typeMapping/enhancedPrimitiveInReturnType.kt"); + } + @TestMetadata("enhancedPrimitives.kt") public void testEnhancedPrimitives() throws Exception { runTest("compiler/testData/codegen/box/typeMapping/enhancedPrimitives.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 75f7460941b..492dea0484d 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -26986,6 +26986,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/typeMapping"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM, true); } + @TestMetadata("enhancedPrimitiveInReturnType.kt") + public void testEnhancedPrimitiveInReturnType() throws Exception { + runTest("compiler/testData/codegen/box/typeMapping/enhancedPrimitiveInReturnType.kt"); + } + @TestMetadata("enhancedPrimitives.kt") public void testEnhancedPrimitives() throws Exception { runTest("compiler/testData/codegen/box/typeMapping/enhancedPrimitives.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index 29868a5a78c..8416da69d99 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -26678,6 +26678,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/typeMapping"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); } + @TestMetadata("enhancedPrimitiveInReturnType.kt") + public void testEnhancedPrimitiveInReturnType() throws Exception { + runTest("compiler/testData/codegen/box/typeMapping/enhancedPrimitiveInReturnType.kt"); + } + @TestMetadata("enhancedPrimitives.kt") public void testEnhancedPrimitives() throws Exception { runTest("compiler/testData/codegen/box/typeMapping/enhancedPrimitives.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 42063f0bfb9..6988fbcaa11 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -26678,6 +26678,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/typeMapping"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); } + @TestMetadata("enhancedPrimitiveInReturnType.kt") + public void testEnhancedPrimitiveInReturnType() throws Exception { + runTest("compiler/testData/codegen/box/typeMapping/enhancedPrimitiveInReturnType.kt"); + } + @TestMetadata("enhancedPrimitives.kt") public void testEnhancedPrimitives() throws Exception { runTest("compiler/testData/codegen/box/typeMapping/enhancedPrimitives.kt");