From 20ff74a726bba83773c211adbba447e4451a19fc Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Fri, 9 Nov 2018 13:04:29 +0300 Subject: [PATCH] Fix mapping for inline classes when JvmSuppressWildcards mode is using #KT-28097 Fixed --- .../kotlin/codegen/state/typeMappingUtil.kt | 17 +++++++-- ...pInlineClassesWithSuppressWildcardsMode.kt | 36 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 5 +++ .../LightAnalysisModeTestGenerated.java | 5 +++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 +++ .../kotlin/load/kotlin/TypeMappingMode.kt | 4 ++- .../IrJsCodegenBoxTestGenerated.java | 5 +++ .../semantics/JsCodegenBoxTestGenerated.java | 5 +++ 8 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/codegen/box/inlineClasses/mapInlineClassesWithSuppressWildcardsMode.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/typeMappingUtil.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/typeMappingUtil.kt index 8b422e980d8..32a52f2fb9a 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/typeMappingUtil.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/typeMappingUtil.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.firstOverridden import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull import org.jetbrains.kotlin.resolve.descriptorUtil.parentsWithSelf import org.jetbrains.kotlin.resolve.descriptorUtil.propertyIfAccessor +import org.jetbrains.kotlin.resolve.isInlineClassType import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.getEffectiveVariance @@ -78,12 +79,19 @@ private val METHODS_WITH_DECLARATION_SITE_WILDCARDS = setOf( fun TypeMappingMode.updateArgumentModeFromAnnotations(type: KotlinType): TypeMappingMode { type.suppressWildcardsMode()?.let { return TypeMappingMode.createWithConstantDeclarationSiteWildcardsMode( - skipDeclarationSiteWildcards = it, isForAnnotationParameter = isForAnnotationParameter) + skipDeclarationSiteWildcards = it, + isForAnnotationParameter = isForAnnotationParameter, + needInlineClassWrapping = needInlineClassWrapping + ) } if (type.annotations.hasAnnotation(JVM_WILDCARD_ANNOTATION_FQ_NAME)) { return TypeMappingMode.createWithConstantDeclarationSiteWildcardsMode( - skipDeclarationSiteWildcards = false, isForAnnotationParameter = isForAnnotationParameter, fallbackMode = this) + skipDeclarationSiteWildcards = false, + isForAnnotationParameter = isForAnnotationParameter, + fallbackMode = this, + needInlineClassWrapping = needInlineClassWrapping + ) } return this @@ -97,7 +105,10 @@ internal fun extractTypeMappingModeFromAnnotation( (outerType.suppressWildcardsMode() ?: callableDescriptor?.suppressWildcardsMode())?.let { if (outerType.arguments.isNotEmpty()) TypeMappingMode.createWithConstantDeclarationSiteWildcardsMode( - skipDeclarationSiteWildcards = it, isForAnnotationParameter = isForAnnotationParameter) + skipDeclarationSiteWildcards = it, + isForAnnotationParameter = isForAnnotationParameter, + needInlineClassWrapping = !outerType.isInlineClassType() + ) else TypeMappingMode.DEFAULT } diff --git a/compiler/testData/codegen/box/inlineClasses/mapInlineClassesWithSuppressWildcardsMode.kt b/compiler/testData/codegen/box/inlineClasses/mapInlineClassesWithSuppressWildcardsMode.kt new file mode 100644 index 00000000000..6d1fa6cdea7 --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/mapInlineClassesWithSuppressWildcardsMode.kt @@ -0,0 +1,36 @@ +// WITH_RUNTIME +// IGNORE_BACKEND: JS, JS_IR + +class Foo(val x: Int) + +@JvmSuppressWildcards +class Bar { + fun run(f: (Foo) -> Foo): Foo { + return f(Foo(42)) + } + + fun invokeFun(): Foo { + return run { f -> + Foo(f.x + 1) + } + } + + fun nullableFoo(f: Foo?): Foo = f!! + + fun listOfFoo(f: List>): Foo = f[0] +} + +fun box(): String { + val b = Bar() + if(b.invokeFun().x != 43) return "Fail 1" + + if (b.nullableFoo(Foo(1)).x != 1) return "Fail 2" + + val f: Foo? = Foo(2) + if (b.nullableFoo(f).x != 2) return "Fail 3" + + val ls = listOf(Foo(3)) + if (b.listOfFoo(ls).x != 3) return "Fail 4" + + return "OK" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 82adc7ac1fe..093f21148f5 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -12070,6 +12070,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/inlineClasses/kt27706.kt"); } + @TestMetadata("mapInlineClassesWithSuppressWildcardsMode.kt") + public void testMapInlineClassesWithSuppressWildcardsMode() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/mapInlineClassesWithSuppressWildcardsMode.kt"); + } + @TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt") public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 7aa2b93a4f4..819998ffe72 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -12070,6 +12070,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/inlineClasses/kt27706.kt"); } + @TestMetadata("mapInlineClassesWithSuppressWildcardsMode.kt") + public void testMapInlineClassesWithSuppressWildcardsMode() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/mapInlineClassesWithSuppressWildcardsMode.kt"); + } + @TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt") public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 156b2e707f6..ca1641cbce4 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -12075,6 +12075,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inlineClasses/kt27706.kt"); } + @TestMetadata("mapInlineClassesWithSuppressWildcardsMode.kt") + public void testMapInlineClassesWithSuppressWildcardsMode() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/mapInlineClassesWithSuppressWildcardsMode.kt"); + } + @TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt") public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt"); diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/TypeMappingMode.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/TypeMappingMode.kt index 01509afdc68..ad958569902 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/TypeMappingMode.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/TypeMappingMode.kt @@ -143,11 +143,13 @@ class TypeMappingMode private constructor( fun createWithConstantDeclarationSiteWildcardsMode( skipDeclarationSiteWildcards: Boolean, isForAnnotationParameter: Boolean, + needInlineClassWrapping: Boolean, fallbackMode: TypeMappingMode? = null ) = TypeMappingMode( isForAnnotationParameter = isForAnnotationParameter, skipDeclarationSiteWildcards = skipDeclarationSiteWildcards, - genericArgumentMode = fallbackMode + genericArgumentMode = fallbackMode, + needInlineClassWrapping = needInlineClassWrapping ) } diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java index 99953b86e81..0e90434655b 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java @@ -10470,6 +10470,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/kt27706.kt"); } + @TestMetadata("mapInlineClassesWithSuppressWildcardsMode.kt") + public void testMapInlineClassesWithSuppressWildcardsMode() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/mapInlineClassesWithSuppressWildcardsMode.kt"); + } + @TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt") public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 378e0a035dd..d20b261f81a 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -11515,6 +11515,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/kt27706.kt"); } + @TestMetadata("mapInlineClassesWithSuppressWildcardsMode.kt") + public void testMapInlineClassesWithSuppressWildcardsMode() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/mapInlineClassesWithSuppressWildcardsMode.kt"); + } + @TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt") public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt");