JVM: support enumEntries intrinsic for Java & old Kotlin enums
#KT-59710 Fixed
This commit is contained in:
committed by
Space Team
parent
874d1c514a
commit
971b4e63e7
@@ -0,0 +1,29 @@
|
||||
// TARGET_BACKEND: JVM_IR
|
||||
// !OPT_IN: kotlin.ExperimentalStdlibApi
|
||||
// WITH_STDLIB
|
||||
// FILE: Z.java
|
||||
|
||||
public enum Z {
|
||||
O, K
|
||||
}
|
||||
|
||||
// FILE: box.kt
|
||||
|
||||
@file:Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") // TODO: remove once KT-53154 is fixed.
|
||||
|
||||
import kotlin.enums.*
|
||||
|
||||
fun callFromOtherFunctionInTheSameFile(): EnumEntries<Z> = enumEntries<Z>()
|
||||
|
||||
fun box(): String {
|
||||
val z = enumEntries<Z>()
|
||||
if (z.toString() != "[O, K]") return "Fail 1: $z"
|
||||
|
||||
val z2 = enumEntries<Z>()
|
||||
if (z2 !== z) return "Fail 2: another instance of EnumEntries is created"
|
||||
|
||||
val z3 = callFromOtherFunctionInTheSameFile()
|
||||
if (z3 !== z) return "Fail 3: another instance of EnumEntries is created"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
// TARGET_BACKEND: JVM_IR
|
||||
// WITH_STDLIB
|
||||
|
||||
// CHECK_BYTECODE_LISTING
|
||||
// ^ Check that there's only one $EntriesIntrinsicMappings class, with three fields (entries$0, entries$1, entries$2).
|
||||
|
||||
// MODULE: lib
|
||||
// !LANGUAGE: +EnumEntries
|
||||
// FILE: X.kt
|
||||
|
||||
enum class X {
|
||||
X1, X2
|
||||
}
|
||||
|
||||
// FILE: Y.java
|
||||
|
||||
public enum Y {
|
||||
Y1, Y2
|
||||
}
|
||||
|
||||
// FILE: Z.java
|
||||
|
||||
public enum Z {
|
||||
Z1, Z2
|
||||
}
|
||||
|
||||
// MODULE: box(lib)
|
||||
// !LANGUAGE: +EnumEntries
|
||||
// !OPT_IN: kotlin.ExperimentalStdlibApi
|
||||
// FILE: box.kt
|
||||
|
||||
@file:Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") // TODO: remove once KT-53154 is fixed.
|
||||
|
||||
import kotlin.enums.enumEntries
|
||||
|
||||
fun box(): String {
|
||||
val x = enumEntries<X>()
|
||||
if (x.toString() != "[X1, X2]") return "Fail X: $x"
|
||||
|
||||
val y = enumEntries<Y>()
|
||||
if (y.toString() != "[Y1, Y2]") return "Fail Y: $y"
|
||||
|
||||
val z = enumEntries<Z>()
|
||||
if (z.toString() != "[Z1, Z2]") return "Fail Z: $z"
|
||||
|
||||
val xx = enumEntries<X>()
|
||||
if (xx.toString() != "[X1, X2]") return "Fail X #2: $xx"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
Module: lib
|
||||
@kotlin.Metadata
|
||||
public final enum class X {
|
||||
// source: 'X.kt'
|
||||
private synthetic final static field $ENTRIES: kotlin.enums.EnumEntries
|
||||
private synthetic final static field $VALUES: X[]
|
||||
public final enum static field X1: X
|
||||
public final enum static field X2: X
|
||||
private synthetic final static method $values(): X[]
|
||||
static method <clinit>(): void
|
||||
private method <init>(p0: java.lang.String, p1: int): void
|
||||
public static @org.jetbrains.annotations.NotNull method getEntries(): kotlin.enums.EnumEntries
|
||||
public static method valueOf(p0: java.lang.String): X
|
||||
public static method values(): X[]
|
||||
}
|
||||
Module: box
|
||||
@kotlin.Metadata
|
||||
public synthetic final class BoxKt$EntriesIntrinsicMappings {
|
||||
// source: 'box.kt'
|
||||
public synthetic final static field entries$0: kotlin.enums.EnumEntries
|
||||
public synthetic final static field entries$1: kotlin.enums.EnumEntries
|
||||
public synthetic final static field entries$2: kotlin.enums.EnumEntries
|
||||
static method <clinit>(): void
|
||||
public synthetic inner class BoxKt$EntriesIntrinsicMappings
|
||||
}
|
||||
|
||||
@kotlin.Metadata
|
||||
public final class BoxKt {
|
||||
// source: 'box.kt'
|
||||
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
|
||||
public synthetic inner class BoxKt$EntriesIntrinsicMappings
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
|
||||
// TARGET_BACKEND: JVM_IR
|
||||
// NO_CHECK_LAMBDA_INLINING
|
||||
// !OPT_IN: kotlin.ExperimentalStdlibApi
|
||||
// WITH_STDLIB
|
||||
// FILE: test/Z.java
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
|
||||
// TARGET_BACKEND: JVM_IR
|
||||
// WITH_STDLIB
|
||||
// !OPT_IN: kotlin.ExperimentalStdlibApi
|
||||
|
||||
@@ -19,4 +19,6 @@ fun foo() {
|
||||
enumEntries2<MyEnum>()
|
||||
}
|
||||
|
||||
// 0 INVOKESTATIC kotlin/enums/EnumEntriesKt.enumEntries
|
||||
// There should be one call to enumEntries in _1Kt$EntriesIntrinsicMappings.<clinit>.
|
||||
// 2 GETSTATIC _1Kt\$EntriesIntrinsicMappings.entries\$0
|
||||
// 1 INVOKESTATIC kotlin/enums/EnumEntriesKt.enumEntries
|
||||
|
||||
Reference in New Issue
Block a user