Add KClass.isValue to kotlin-reflect
#KT-44782 Fixed
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
|
// IGNORE_BACKEND_FIR: JVM_IR
|
||||||
// WITH_REFLECT
|
// WITH_REFLECT
|
||||||
// FILE: box.kt
|
// FILE: box.kt
|
||||||
|
|
||||||
@@ -13,6 +14,9 @@ sealed class S {
|
|||||||
fun interface FunInterface { fun invoke() }
|
fun interface FunInterface { fun invoke() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@JvmInline
|
||||||
|
value class V(val value: String)
|
||||||
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
assertTrue(S::class.isSealed)
|
assertTrue(S::class.isSealed)
|
||||||
assertFalse(S::class.isFinal)
|
assertFalse(S::class.isFinal)
|
||||||
@@ -22,42 +26,56 @@ fun box(): String {
|
|||||||
assertFalse(S::class.isInner)
|
assertFalse(S::class.isInner)
|
||||||
assertFalse(S::class.isCompanion)
|
assertFalse(S::class.isCompanion)
|
||||||
assertFalse(S::class.isFun)
|
assertFalse(S::class.isFun)
|
||||||
|
assertFalse(S::class.isValue)
|
||||||
|
|
||||||
assertFalse(S.DataClass::class.isSealed)
|
assertFalse(S.DataClass::class.isSealed)
|
||||||
assertTrue(S.DataClass::class.isData)
|
assertTrue(S.DataClass::class.isData)
|
||||||
assertFalse(S.DataClass::class.isInner)
|
assertFalse(S.DataClass::class.isInner)
|
||||||
assertFalse(S.DataClass::class.isCompanion)
|
assertFalse(S.DataClass::class.isCompanion)
|
||||||
assertFalse(S.DataClass::class.isFun)
|
assertFalse(S.DataClass::class.isFun)
|
||||||
|
assertFalse(S.DataClass::class.isValue)
|
||||||
|
|
||||||
assertFalse(S.InnerClass::class.isSealed)
|
assertFalse(S.InnerClass::class.isSealed)
|
||||||
assertFalse(S.InnerClass::class.isData)
|
assertFalse(S.InnerClass::class.isData)
|
||||||
assertTrue(S.InnerClass::class.isInner)
|
assertTrue(S.InnerClass::class.isInner)
|
||||||
assertFalse(S.InnerClass::class.isCompanion)
|
assertFalse(S.InnerClass::class.isCompanion)
|
||||||
assertFalse(S.InnerClass::class.isFun)
|
assertFalse(S.InnerClass::class.isFun)
|
||||||
|
assertFalse(S.InnerClass::class.isValue)
|
||||||
|
|
||||||
assertFalse(S.Companion::class.isSealed)
|
assertFalse(S.Companion::class.isSealed)
|
||||||
assertFalse(S.Companion::class.isData)
|
assertFalse(S.Companion::class.isData)
|
||||||
assertFalse(S.Companion::class.isInner)
|
assertFalse(S.Companion::class.isInner)
|
||||||
assertTrue(S.Companion::class.isCompanion)
|
assertTrue(S.Companion::class.isCompanion)
|
||||||
assertFalse(S.Companion::class.isFun)
|
assertFalse(S.Companion::class.isFun)
|
||||||
|
assertFalse(S.Companion::class.isValue)
|
||||||
|
|
||||||
assertFalse(S.NonCompanionObject::class.isSealed)
|
assertFalse(S.NonCompanionObject::class.isSealed)
|
||||||
assertFalse(S.NonCompanionObject::class.isData)
|
assertFalse(S.NonCompanionObject::class.isData)
|
||||||
assertFalse(S.NonCompanionObject::class.isInner)
|
assertFalse(S.NonCompanionObject::class.isInner)
|
||||||
assertFalse(S.NonCompanionObject::class.isCompanion)
|
assertFalse(S.NonCompanionObject::class.isCompanion)
|
||||||
assertFalse(S.NonCompanionObject::class.isFun)
|
assertFalse(S.NonCompanionObject::class.isFun)
|
||||||
|
assertFalse(S.NonCompanionObject::class.isValue)
|
||||||
|
|
||||||
assertFalse(S.FunInterface::class.isSealed)
|
assertFalse(S.FunInterface::class.isSealed)
|
||||||
assertFalse(S.FunInterface::class.isData)
|
assertFalse(S.FunInterface::class.isData)
|
||||||
assertFalse(S.FunInterface::class.isInner)
|
assertFalse(S.FunInterface::class.isInner)
|
||||||
assertFalse(S.FunInterface::class.isCompanion)
|
assertFalse(S.FunInterface::class.isCompanion)
|
||||||
assertTrue(S.FunInterface::class.isFun)
|
assertTrue(S.FunInterface::class.isFun)
|
||||||
|
assertFalse(S.FunInterface::class.isValue)
|
||||||
|
|
||||||
assertFalse(JavaInterface::class.isSealed)
|
assertFalse(JavaInterface::class.isSealed)
|
||||||
assertFalse(JavaInterface::class.isData)
|
assertFalse(JavaInterface::class.isData)
|
||||||
assertFalse(JavaInterface::class.isInner)
|
assertFalse(JavaInterface::class.isInner)
|
||||||
assertFalse(JavaInterface::class.isCompanion)
|
assertFalse(JavaInterface::class.isCompanion)
|
||||||
assertFalse(JavaInterface::class.isFun)
|
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"
|
return "OK"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -285,6 +285,10 @@ internal class KClassImpl<T : Any>(
|
|||||||
override val isFun: Boolean
|
override val isFun: Boolean
|
||||||
get() = descriptor.isFun
|
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 =
|
override fun equals(other: Any?): Boolean =
|
||||||
other is KClassImpl<*> && javaObjectType == other.javaObjectType
|
other is KClassImpl<*> && javaObjectType == other.javaObjectType
|
||||||
|
|
||||||
|
|||||||
@@ -81,6 +81,10 @@ public class ClassReference(override val jClass: Class<*>) : KClass<Any>, ClassB
|
|||||||
override val isFun: Boolean
|
override val isFun: Boolean
|
||||||
get() = error()
|
get() = error()
|
||||||
|
|
||||||
|
@SinceKotlin("1.5")
|
||||||
|
override val isValue: Boolean
|
||||||
|
get() = error()
|
||||||
|
|
||||||
private fun error(): Nothing = throw KotlinReflectionNotSupportedError()
|
private fun error(): Nothing = throw KotlinReflectionNotSupportedError()
|
||||||
|
|
||||||
override fun equals(other: Any?) =
|
override fun equals(other: Any?) =
|
||||||
|
|||||||
@@ -133,6 +133,12 @@ public actual interface KClass<T : Any> : KDeclarationContainer, KAnnotatedEleme
|
|||||||
@SinceKotlin("1.4")
|
@SinceKotlin("1.4")
|
||||||
public val isFun: Boolean
|
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].
|
* 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:
|
* On JVM this means that all of the following conditions are satisfied:
|
||||||
|
|||||||
+2
@@ -3521,6 +3521,7 @@ public final class kotlin/jvm/internal/ClassReference : kotlin/jvm/internal/Clas
|
|||||||
public fun isInstance (Ljava/lang/Object;)Z
|
public fun isInstance (Ljava/lang/Object;)Z
|
||||||
public fun isOpen ()Z
|
public fun isOpen ()Z
|
||||||
public fun isSealed ()Z
|
public fun isSealed ()Z
|
||||||
|
public fun isValue ()Z
|
||||||
public fun toString ()Ljava/lang/String;
|
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 isInstance (Ljava/lang/Object;)Z
|
||||||
public abstract fun isOpen ()Z
|
public abstract fun isOpen ()Z
|
||||||
public abstract fun isSealed ()Z
|
public abstract fun isSealed ()Z
|
||||||
|
public abstract fun isValue ()Z
|
||||||
}
|
}
|
||||||
|
|
||||||
public final class kotlin/reflect/KClasses {
|
public final class kotlin/reflect/KClasses {
|
||||||
|
|||||||
Reference in New Issue
Block a user