diff --git a/compiler/testData/codegen/box/reflection/modifiers/classes.kt b/compiler/testData/codegen/box/reflection/modifiers/classes.kt index 1fbc26de0da..1494391f2e5 100644 --- a/compiler/testData/codegen/box/reflection/modifiers/classes.kt +++ b/compiler/testData/codegen/box/reflection/modifiers/classes.kt @@ -1,4 +1,5 @@ // TARGET_BACKEND: JVM +// IGNORE_BACKEND_FIR: JVM_IR // WITH_REFLECT // FILE: box.kt @@ -13,6 +14,9 @@ sealed class S { fun interface FunInterface { fun invoke() } } +@JvmInline +value class V(val value: String) + fun box(): String { assertTrue(S::class.isSealed) assertFalse(S::class.isFinal) @@ -22,42 +26,56 @@ fun box(): String { assertFalse(S::class.isInner) assertFalse(S::class.isCompanion) assertFalse(S::class.isFun) + assertFalse(S::class.isValue) assertFalse(S.DataClass::class.isSealed) assertTrue(S.DataClass::class.isData) assertFalse(S.DataClass::class.isInner) assertFalse(S.DataClass::class.isCompanion) assertFalse(S.DataClass::class.isFun) + assertFalse(S.DataClass::class.isValue) assertFalse(S.InnerClass::class.isSealed) assertFalse(S.InnerClass::class.isData) assertTrue(S.InnerClass::class.isInner) assertFalse(S.InnerClass::class.isCompanion) assertFalse(S.InnerClass::class.isFun) + assertFalse(S.InnerClass::class.isValue) assertFalse(S.Companion::class.isSealed) assertFalse(S.Companion::class.isData) assertFalse(S.Companion::class.isInner) assertTrue(S.Companion::class.isCompanion) assertFalse(S.Companion::class.isFun) + assertFalse(S.Companion::class.isValue) assertFalse(S.NonCompanionObject::class.isSealed) assertFalse(S.NonCompanionObject::class.isData) assertFalse(S.NonCompanionObject::class.isInner) assertFalse(S.NonCompanionObject::class.isCompanion) assertFalse(S.NonCompanionObject::class.isFun) + assertFalse(S.NonCompanionObject::class.isValue) assertFalse(S.FunInterface::class.isSealed) assertFalse(S.FunInterface::class.isData) assertFalse(S.FunInterface::class.isInner) assertFalse(S.FunInterface::class.isCompanion) assertTrue(S.FunInterface::class.isFun) + assertFalse(S.FunInterface::class.isValue) assertFalse(JavaInterface::class.isSealed) assertFalse(JavaInterface::class.isData) assertFalse(JavaInterface::class.isInner) assertFalse(JavaInterface::class.isCompanion) assertFalse(JavaInterface::class.isFun) + assertFalse(JavaInterface::class.isValue) + + assertFalse(V::class.isSealed) + assertFalse(V::class.isData) + assertFalse(V::class.isInner) + assertFalse(V::class.isCompanion) + assertFalse(V::class.isFun) + assertTrue(V::class.isValue) return "OK" } diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt index 151db381d6e..8def6fe6f34 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt @@ -285,6 +285,10 @@ internal class KClassImpl( override val isFun: Boolean get() = descriptor.isFun + @Suppress("NOTHING_TO_OVERRIDE") // Temporary workaround for the JPS build until bootstrap + override val isValue: Boolean + get() = descriptor.isValue + override fun equals(other: Any?): Boolean = other is KClassImpl<*> && javaObjectType == other.javaObjectType diff --git a/libraries/stdlib/jvm/runtime/kotlin/jvm/internal/ClassReference.kt b/libraries/stdlib/jvm/runtime/kotlin/jvm/internal/ClassReference.kt index 9861ff33c2c..530aefa3e36 100644 --- a/libraries/stdlib/jvm/runtime/kotlin/jvm/internal/ClassReference.kt +++ b/libraries/stdlib/jvm/runtime/kotlin/jvm/internal/ClassReference.kt @@ -81,6 +81,10 @@ public class ClassReference(override val jClass: Class<*>) : KClass, ClassB override val isFun: Boolean get() = error() + @SinceKotlin("1.5") + override val isValue: Boolean + get() = error() + private fun error(): Nothing = throw KotlinReflectionNotSupportedError() override fun equals(other: Any?) = diff --git a/libraries/stdlib/jvm/src/kotlin/reflect/KClass.kt b/libraries/stdlib/jvm/src/kotlin/reflect/KClass.kt index 950d01b0737..aaa47fd8525 100644 --- a/libraries/stdlib/jvm/src/kotlin/reflect/KClass.kt +++ b/libraries/stdlib/jvm/src/kotlin/reflect/KClass.kt @@ -133,6 +133,12 @@ public actual interface KClass : KDeclarationContainer, KAnnotatedEleme @SinceKotlin("1.4") public val isFun: Boolean + /** + * `true` if this class is a value class. + */ + @SinceKotlin("1.5") + public val isValue: Boolean + /** * Returns `true` if this [KClass] instance represents the same Kotlin class as the class represented by [other]. * On JVM this means that all of the following conditions are satisfied: diff --git a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt index 36eeea72649..105462948e2 100644 --- a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt +++ b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt @@ -3521,6 +3521,7 @@ public final class kotlin/jvm/internal/ClassReference : kotlin/jvm/internal/Clas public fun isInstance (Ljava/lang/Object;)Z public fun isOpen ()Z public fun isSealed ()Z + public fun isValue ()Z public fun toString ()Ljava/lang/String; } @@ -4663,6 +4664,7 @@ public abstract interface class kotlin/reflect/KClass : kotlin/reflect/KAnnotate public abstract fun isInstance (Ljava/lang/Object;)Z public abstract fun isOpen ()Z public abstract fun isSealed ()Z + public abstract fun isValue ()Z } public final class kotlin/reflect/KClasses {