From 6dc69adcc9cbc0f107153e91a630b94d6cb63cbc Mon Sep 17 00:00:00 2001 From: Sergej Jaskiewicz Date: Thu, 9 Dec 2021 15:16:03 +0300 Subject: [PATCH] [JS IR] Don't mark Char as a value class Char will still be treated as a value class (see JsInlineClassesUtils.kt) --- js/js.translator/testData/box/char/charEquals.kt | 8 +++++--- libraries/stdlib/api/js-v1/kotlin.kt | 4 ++-- libraries/stdlib/api/js/kotlin.kt | 4 ++-- libraries/stdlib/js-ir/builtins/Char.kt | 15 +++++++++++++-- 4 files changed, 22 insertions(+), 9 deletions(-) diff --git a/js/js.translator/testData/box/char/charEquals.kt b/js/js.translator/testData/box/char/charEquals.kt index 35a63e31396..1cf431b9ec1 100644 --- a/js/js.translator/testData/box/char/charEquals.kt +++ b/js/js.translator/testData/box/char/charEquals.kt @@ -1,14 +1,16 @@ // EXPECTED_REACHABLE_NODES: 1372 package foo -class A - fun box(): String { assertEquals(true, 'A' == 'A') - assertEquals(false, 'A'== 'B') + assertEquals(false, 'A' == 'B') assertEquals(false, ('A' as Any) == (65 as Any)) + // FIXME(KT-50157): assertEquals(true, 'A' === 'A') + assertEquals(false, 'A' === 'B') + assertEquals(false, ('A' as Any) === (65 as Any)) + assertTrue(bar('Q')) assertFalse(bar('W')) diff --git a/libraries/stdlib/api/js-v1/kotlin.kt b/libraries/stdlib/api/js-v1/kotlin.kt index 1cc096ef7c5..dd238f99f1e 100644 --- a/libraries/stdlib/api/js-v1/kotlin.kt +++ b/libraries/stdlib/api/js-v1/kotlin.kt @@ -1064,7 +1064,7 @@ public final class ByteArray { public final operator fun set(index: kotlin.Int, value: kotlin.Byte): kotlin.Unit } -/*∆*/ public final class Char : kotlin.Comparable { +public final class Char : kotlin.Comparable { public open override operator fun compareTo(other: kotlin.Char): kotlin.Int public final operator fun dec(): kotlin.Char @@ -3231,4 +3231,4 @@ public final annotation class UseExperimental : kotlin.Annotation { public constructor UseExperimental(vararg markerClass: kotlin.reflect.KClass) public final val markerClass: kotlin.Array> { get; } -} \ No newline at end of file +} diff --git a/libraries/stdlib/api/js/kotlin.kt b/libraries/stdlib/api/js/kotlin.kt index 9e763ccbe94..9e37dffe0db 100644 --- a/libraries/stdlib/api/js/kotlin.kt +++ b/libraries/stdlib/api/js/kotlin.kt @@ -1032,7 +1032,7 @@ public final class ByteArray { public final operator fun set(index: kotlin.Int, value: kotlin.Byte): kotlin.Unit } -/*∆*/ public final inline class Char : kotlin.Comparable { +public final class Char : kotlin.Comparable { /*∆*/ @kotlin.SinceKotlin(version = "1.5") /*∆*/ @kotlin.WasExperimental(markerClass = {kotlin.ExperimentalStdlibApi::class}) /*∆*/ public constructor Char(code: kotlin.UShort) @@ -3231,4 +3231,4 @@ public final annotation class UseExperimental : kotlin.Annotation { public constructor UseExperimental(vararg markerClass: kotlin.reflect.KClass) public final val markerClass: kotlin.Array> { get; } -} \ No newline at end of file +} diff --git a/libraries/stdlib/js-ir/builtins/Char.kt b/libraries/stdlib/js-ir/builtins/Char.kt index 8b6534810fe..74bfb1d7762 100644 --- a/libraries/stdlib/js-ir/builtins/Char.kt +++ b/libraries/stdlib/js-ir/builtins/Char.kt @@ -5,11 +5,15 @@ package kotlin +// Char is a magic class. +// Char is defined as a regular class, but we lower it as a value class. +// See [org.jetbrains.kotlin.ir.backend.js.utils.JsInlineClassesUtils.isClassInlineLike] for explanation. + /** * Represents a 16-bit Unicode character. * On the JVM, non-nullable values of this type are represented as values of the primitive type `char`. */ -public value class Char +public /*value*/ class Char @kotlin.internal.LowPriorityInOverloadResolution internal constructor(private val value: Int) : Comparable { @@ -76,6 +80,13 @@ internal constructor(private val value: Int) : Comparable { @DeprecatedSinceKotlin(warningSince = "1.5") public fun toDouble(): Double = value.toDouble() + override fun equals(other: Any?): Boolean { + if (other !is Char) return false + return this.value == other.value + } + + override fun hashCode(): Int = value + // TODO implicit usages of toString and valueOf must be covered in DCE @Suppress("JS_NAME_PROHIBITED_FOR_OVERRIDE") @JsName("toString") @@ -139,4 +150,4 @@ internal constructor(private val value: Int) : Comparable { public const val SIZE_BITS: Int = 16 } -} \ No newline at end of file +}