From ee11202db5f6ffa6055794c00499ffc67deafd01 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 5 Mar 2021 20:28:33 +0100 Subject: [PATCH] Add Flag.IS_VALUE for value classes to kotlinx-metadata-jvm #KT-44783 Fixed --- libraries/kotlinx-metadata/jvm/ChangeLog.md | 4 ++- .../src/kotlinx/metadata/Flag.kt | 12 ++++++-- .../org/jetbrains/kotlin/kotlinp/printers.kt | 2 +- .../kotlinp/test/KotlinpTestGenerated.java | 5 ++++ .../tools/kotlinp/testData/ValueClass.kt | 2 ++ .../tools/kotlinp/testData/ValueClass.txt | 29 +++++++++++++++++++ .../descriptors/commonizer/metadata/flags.kt | 2 +- .../utils/MetadataDeclarationsComparator.kt | 2 +- 8 files changed, 52 insertions(+), 6 deletions(-) create mode 100644 libraries/tools/kotlinp/testData/ValueClass.kt create mode 100644 libraries/tools/kotlinp/testData/ValueClass.txt diff --git a/libraries/kotlinx-metadata/jvm/ChangeLog.md b/libraries/kotlinx-metadata/jvm/ChangeLog.md index 990c472a49e..ca13e1205c7 100644 --- a/libraries/kotlinx-metadata/jvm/ChangeLog.md +++ b/libraries/kotlinx-metadata/jvm/ChangeLog.md @@ -2,7 +2,9 @@ ## 0.2.1 -- Deprecate `KotlinClassHeader.bytecodeVersion` and `KotlinClassHeader`'s constructor that takes a bytecode version array. +- [KT-44783](https://youtrack.jetbrains.com/issue/KT-44783) Add Flag.IS_VALUE for value classes + - Breaking change: `Flag.IS_INLINE` is deprecated, use `Flag.IS_VALUE` instead +- Breaking change: deprecate `KotlinClassHeader.bytecodeVersion` and `KotlinClassHeader`'s constructor that takes a bytecode version array. Related to ['KT-41758`](https://youtrack.jetbrains.com/issue/KT-41758). ## 0.2.0 diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/Flag.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/Flag.kt index a6123e8e49f..42ebc9eea49 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/Flag.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/Flag.kt @@ -202,11 +202,19 @@ class Flag(private val offset: Int, private val bitWidth: Int, private val value @JvmField val IS_EXPECT = Flag(F.IS_EXPECT_CLASS) + @JvmField + @Deprecated( + "Use IS_VALUE instead, which returns true if the class is either a pre-1.5 inline class, or a 1.5+ value class.", + level = DeprecationLevel.ERROR + ) + @Suppress("unused") + val IS_INLINE = Flag(F.IS_INLINE_CLASS) + /** - * Signifies that the corresponding class is `inline`. + * Signifies that the corresponding class is either a pre-Kotlin-1.5 `inline` class, or a 1.5+ `value` class. */ @JvmField - val IS_INLINE = Flag(F.IS_INLINE_CLASS) + val IS_VALUE = Flag(F.IS_INLINE_CLASS) /** * Signifies that the corresponding class is a functional interface, i.e. marked with the keyword `fun`. diff --git a/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt b/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt index a4f6842585e..82d157328c1 100644 --- a/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt +++ b/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt @@ -946,7 +946,7 @@ private val CLASS_FLAGS_MAP = COMMON_FLAGS_MAP + mapOf( Flag.Class.IS_DATA to "data", Flag.Class.IS_EXTERNAL to "external", Flag.Class.IS_EXPECT to "expect", - Flag.Class.IS_INLINE to "inline", + Flag.Class.IS_VALUE to "value", Flag.Class.IS_FUN to "fun", Flag.Class.IS_CLASS to "class", diff --git a/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/KotlinpTestGenerated.java b/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/KotlinpTestGenerated.java index beb44181522..dcf407c9521 100644 --- a/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/KotlinpTestGenerated.java +++ b/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/KotlinpTestGenerated.java @@ -109,6 +109,11 @@ public class KotlinpTestGenerated extends AbstractKotlinpTest { runTest("libraries/tools/kotlinp/testData/TypeParameters.kt"); } + @TestMetadata("ValueClass.kt") + public void testValueClass() throws Exception { + runTest("libraries/tools/kotlinp/testData/ValueClass.kt"); + } + @TestMetadata("VersionRequirement.kt") public void testVersionRequirement() throws Exception { runTest("libraries/tools/kotlinp/testData/VersionRequirement.kt"); diff --git a/libraries/tools/kotlinp/testData/ValueClass.kt b/libraries/tools/kotlinp/testData/ValueClass.kt new file mode 100644 index 00000000000..6dd2cf271c6 --- /dev/null +++ b/libraries/tools/kotlinp/testData/ValueClass.kt @@ -0,0 +1,2 @@ +@JvmInline +value class Z(val s: String) diff --git a/libraries/tools/kotlinp/testData/ValueClass.txt b/libraries/tools/kotlinp/testData/ValueClass.txt new file mode 100644 index 00000000000..5e89791c085 --- /dev/null +++ b/libraries/tools/kotlinp/testData/ValueClass.txt @@ -0,0 +1,29 @@ +// Z.class +// ------------------------------------------ +// requires language version 1.3.0 (level=ERROR) +public final value class Z : kotlin/Any { + + // requires language version 1.3.0 (level=ERROR) + // signature: constructor-impl(Ljava/lang/String;)Ljava/lang/String; + public constructor(s: kotlin/String) + + // signature: equals-impl(Ljava/lang/String;Ljava/lang/Object;)Z + public open /* synthesized */ operator fun equals(other: kotlin/Any?): kotlin/Boolean + + // signature: hashCode-impl(Ljava/lang/String;)I + public open /* synthesized */ fun hashCode(): kotlin/Int + + // signature: toString-impl(Ljava/lang/String;)Ljava/lang/String; + public open /* synthesized */ fun toString(): kotlin/String + + // field: s:Ljava/lang/String; + // getter: getS()Ljava/lang/String; + public final val s: kotlin/String + public final get + + // module name: test-module +} +// META-INF/test-module.kotlin_module +// ------------------------------------------ +module { +} diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/metadata/flags.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/metadata/flags.kt index 2b97f1b2d6a..ae0c53f3ca2 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/metadata/flags.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/metadata/flags.kt @@ -90,7 +90,7 @@ internal fun CirClass.classFlags(isExpect: Boolean): Flags = Flag.Class.IS_DATA.takeIf { isData }, Flag.Class.IS_EXTERNAL.takeIf { isExternal }, Flag.Class.IS_EXPECT.takeIf { isExpect }, - Flag.Class.IS_INLINE.takeIf { isInline }, + Flag.Class.IS_VALUE.takeIf { isInline }, //Flag.Class.IS_FUN.takeIf { false } ) diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/metadata/utils/MetadataDeclarationsComparator.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/metadata/utils/MetadataDeclarationsComparator.kt index 3f02973ed4e..60a77fe731a 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/metadata/utils/MetadataDeclarationsComparator.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/metadata/utils/MetadataDeclarationsComparator.kt @@ -993,7 +993,7 @@ class MetadataDeclarationsComparator private constructor(private val config: Con Flag.Class::IS_DATA, Flag.Class::IS_EXTERNAL, Flag.Class::IS_EXPECT, - Flag.Class::IS_INLINE, + Flag.Class::IS_VALUE, Flag.Class::IS_FUN )