diff --git a/libraries/stdlib/jvm/runtime/kotlin/jvm/JvmClassMapping.kt b/libraries/stdlib/jvm/runtime/kotlin/jvm/JvmClassMapping.kt index f0534505b5a..e5a9da0c3ed 100644 --- a/libraries/stdlib/jvm/runtime/kotlin/jvm/JvmClassMapping.kt +++ b/libraries/stdlib/jvm/runtime/kotlin/jvm/JvmClassMapping.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @file:JvmName("JvmClassMappingKt") @@ -7,6 +7,7 @@ package kotlin.jvm +import kotlin.internal.InlineOnly import kotlin.jvm.internal.ClassBasedDeclarationContainer import kotlin.jvm.internal.Reflection import kotlin.reflect.KClass @@ -105,3 +106,13 @@ public fun Array<*>.isArrayOf(): Boolean = */ public val T.annotationClass: KClass get() = (this as java.lang.annotation.Annotation).annotationType().kotlin as KClass + +/** + * Returns a Java [Class] instance of the enum the given constant belongs to. + * + * @see java.lang.Enum.getDeclaringClass + */ +@SinceKotlin("1.7") +@InlineOnly +public inline val > E.declaringJavaClass: Class + get() = (this as java.lang.Enum).declaringClass diff --git a/libraries/stdlib/jvm/test/enums/EnumDeclaringJavaClassTest.kt b/libraries/stdlib/jvm/test/enums/EnumDeclaringJavaClassTest.kt new file mode 100644 index 00000000000..05935988f43 --- /dev/null +++ b/libraries/stdlib/jvm/test/enums/EnumDeclaringJavaClassTest.kt @@ -0,0 +1,46 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package test.enums + +import java.util.* +import java.util.concurrent.TimeUnit +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.time.DurationUnit + +class EnumDeclaringJavaClassTest { + + private enum class TestEnum { + E + } + + @Test + fun testDeclaringClass() { + // This file + assertEquals(TestEnum::class.java, TestEnum.E.declaringJavaClass) + // From Java + assertEquals(TimeUnit::class.java, TimeUnit.MILLISECONDS.declaringJavaClass) + // From Kotlin + assertEquals(DurationUnit::class.java, DurationUnit.MILLISECONDS.declaringJavaClass) + } + + private inline fun > E.declaring() = declaringJavaClass + + @Test + fun testReified() { + // This file + assertEquals(TestEnum::class.java, TestEnum.E.declaring()) + // From Java + assertEquals(TimeUnit::class.java, TimeUnit.MILLISECONDS.declaring()) + } + + @Test + fun testEnumSet() { + val set = EnumSet.noneOf(TestEnum.E.declaringJavaClass) + set.addAll(TestEnum.E.declaringJavaClass.enumConstants.toList()) + assertEquals(EnumSet.of(TestEnum.E), set) + } +}