From 78d80181e253c08032162a6ed8b3e73485b1cfc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven=20Sch=C3=A4fer?= Date: Thu, 27 Jan 2022 14:08:43 +0100 Subject: [PATCH] inlineClassUtils: Fix handling of inline classes without constructors Fixes KT-50992 DeclarationDescriptor.isInlineClass misidentifies inline classes without constructors. This can happen for the ABI of inline classes with private constructors. --- .../src/org/jetbrains/kotlin/resolve/inlineClassesUtils.kt | 2 +- .../descriptors/DeserializedClassDescriptor.kt | 2 +- .../kotlin/jvm/abi/CompileAgainstJvmAbiTestGenerated.java | 5 +++++ .../jvm/abi/IrCompileAgainstJvmAbiTestGenerated.java | 5 +++++ .../jvm/abi/LegacyCompileAgainstJvmAbiTestGenerated.java | 5 +++++ .../compile/privateValueClassConstructor/app/app.kt | 7 +++++++ .../compile/privateValueClassConstructor/lib/lib.kt | 7 +++++++ 7 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 plugins/jvm-abi-gen/testData/compile/privateValueClassConstructor/app/app.kt create mode 100644 plugins/jvm-abi-gen/testData/compile/privateValueClassConstructor/lib/lib.kt diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/inlineClassesUtils.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/inlineClassesUtils.kt index ee31e138f95..7f8812f935d 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/inlineClassesUtils.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/inlineClassesUtils.kt @@ -22,7 +22,7 @@ val JVM_INLINE_ANNOTATION_CLASS_ID = ClassId.topLevel(JVM_INLINE_ANNOTATION_FQ_N fun DeclarationDescriptor.isInlineClass(): Boolean = when { this !is ClassDescriptor -> false isInline -> true - else -> isValue && unsubstitutedPrimaryConstructor?.valueParameters?.size == 1 + else -> isValue && unsubstitutedPrimaryConstructor?.valueParameters?.size?.let { it == 1 } ?: true } fun DeclarationDescriptor.isValueClass(): Boolean = diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt index 59f1567b447..f1f3756ef1f 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt @@ -177,7 +177,7 @@ class DeserializedClassDescriptor( override fun getInlineClassRepresentation(): InlineClassRepresentation? = inlineClassRepresentation() private fun computeInlineClassRepresentation(): InlineClassRepresentation? { - if (!isInlineClass()) return null + if (!isInlineOrValueClass()) return null val propertyName = when { classProto.hasInlineClassUnderlyingPropertyName() -> diff --git a/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/CompileAgainstJvmAbiTestGenerated.java b/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/CompileAgainstJvmAbiTestGenerated.java index 768ce22a846..e55f5e28b2c 100644 --- a/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/CompileAgainstJvmAbiTestGenerated.java +++ b/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/CompileAgainstJvmAbiTestGenerated.java @@ -115,6 +115,11 @@ public class CompileAgainstJvmAbiTestGenerated extends AbstractCompileAgainstJvm runTest("plugins/jvm-abi-gen/testData/compile/privateOnlyConstructors/"); } + @TestMetadata("privateValueClassConstructor") + public void testPrivateValueClassConstructor() throws Exception { + runTest("plugins/jvm-abi-gen/testData/compile/privateValueClassConstructor/"); + } + @TestMetadata("topLevel") public void testTopLevel() throws Exception { runTest("plugins/jvm-abi-gen/testData/compile/topLevel/"); diff --git a/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/IrCompileAgainstJvmAbiTestGenerated.java b/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/IrCompileAgainstJvmAbiTestGenerated.java index 10018498a0d..4718178e27f 100644 --- a/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/IrCompileAgainstJvmAbiTestGenerated.java +++ b/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/IrCompileAgainstJvmAbiTestGenerated.java @@ -115,6 +115,11 @@ public class IrCompileAgainstJvmAbiTestGenerated extends AbstractIrCompileAgains runTest("plugins/jvm-abi-gen/testData/compile/privateOnlyConstructors/"); } + @TestMetadata("privateValueClassConstructor") + public void testPrivateValueClassConstructor() throws Exception { + runTest("plugins/jvm-abi-gen/testData/compile/privateValueClassConstructor/"); + } + @TestMetadata("topLevel") public void testTopLevel() throws Exception { runTest("plugins/jvm-abi-gen/testData/compile/topLevel/"); diff --git a/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/LegacyCompileAgainstJvmAbiTestGenerated.java b/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/LegacyCompileAgainstJvmAbiTestGenerated.java index 8a75e923de8..be199a7374a 100644 --- a/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/LegacyCompileAgainstJvmAbiTestGenerated.java +++ b/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/LegacyCompileAgainstJvmAbiTestGenerated.java @@ -115,6 +115,11 @@ public class LegacyCompileAgainstJvmAbiTestGenerated extends AbstractLegacyCompi runTest("plugins/jvm-abi-gen/testData/compile/privateOnlyConstructors/"); } + @TestMetadata("privateValueClassConstructor") + public void testPrivateValueClassConstructor() throws Exception { + runTest("plugins/jvm-abi-gen/testData/compile/privateValueClassConstructor/"); + } + @TestMetadata("topLevel") public void testTopLevel() throws Exception { runTest("plugins/jvm-abi-gen/testData/compile/topLevel/"); diff --git a/plugins/jvm-abi-gen/testData/compile/privateValueClassConstructor/app/app.kt b/plugins/jvm-abi-gen/testData/compile/privateValueClassConstructor/app/app.kt new file mode 100644 index 00000000000..40ec9322929 --- /dev/null +++ b/plugins/jvm-abi-gen/testData/compile/privateValueClassConstructor/app/app.kt @@ -0,0 +1,7 @@ +package app + +import lib.* + +fun runAppAndReturnOk(): String { + return A.a().b() +} diff --git a/plugins/jvm-abi-gen/testData/compile/privateValueClassConstructor/lib/lib.kt b/plugins/jvm-abi-gen/testData/compile/privateValueClassConstructor/lib/lib.kt new file mode 100644 index 00000000000..fbfd8a29dee --- /dev/null +++ b/plugins/jvm-abi-gen/testData/compile/privateValueClassConstructor/lib/lib.kt @@ -0,0 +1,7 @@ +package lib + +@JvmInline +value class A private constructor(val value: String) { + companion object { fun a() = A("OK") } + inline fun b() = value +}