Add KClass.isFun modifier to reflection

#KT-38881 Fixed
This commit is contained in:
Alexander Udalov
2020-05-12 20:50:01 +02:00
parent 86b5c63891
commit 82551e91a4
7 changed files with 43 additions and 14 deletions
@@ -1,8 +1,7 @@
// IGNORE_BACKEND: JS_IR // TARGET_BACKEND: JVM
// TODO: muted automatically, investigate should it be ran for JS or not // IGNORE_BACKEND_FIR: JVM_IR
// IGNORE_BACKEND: JS, NATIVE
// WITH_REFLECT // WITH_REFLECT
// FILE: box.kt
import kotlin.test.assertTrue import kotlin.test.assertTrue
import kotlin.test.assertFalse import kotlin.test.assertFalse
@@ -12,6 +11,7 @@ sealed class S {
inner class InnerClass inner class InnerClass
companion object companion object
object NonCompanionObject object NonCompanionObject
fun interface FunInterface { fun invoke() }
} }
fun box(): String { fun box(): String {
@@ -22,26 +22,49 @@ fun box(): String {
assertFalse(S::class.isData) assertFalse(S::class.isData)
assertFalse(S::class.isInner) assertFalse(S::class.isInner)
assertFalse(S::class.isCompanion) assertFalse(S::class.isCompanion)
assertFalse(S::class.isFun)
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.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.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.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.FunInterface::class.isSealed)
assertFalse(S.FunInterface::class.isData)
assertFalse(S.FunInterface::class.isInner)
assertFalse(S.FunInterface::class.isCompanion)
assertTrue(S.FunInterface::class.isFun)
assertFalse(JavaInterface::class.isSealed)
assertFalse(JavaInterface::class.isData)
assertFalse(JavaInterface::class.isInner)
assertFalse(JavaInterface::class.isCompanion)
assertFalse(JavaInterface::class.isFun)
return "OK" return "OK"
} }
// FILE: JavaInterface.java
public interface JavaInterface {
int invoke(String s);
}
@@ -279,6 +279,10 @@ internal class KClassImpl<T : Any>(override val jClass: Class<T>) : KDeclaration
override val isCompanion: Boolean override val isCompanion: Boolean
get() = descriptor.isCompanionObject get() = descriptor.isCompanionObject
@Suppress("NOTHING_TO_OVERRIDE") // Temporary workaround for the JPS build until bootstrap
override val isFun: Boolean
get() = descriptor.isFun
override fun equals(other: Any?): Boolean = override fun equals(other: Any?): Boolean =
other is KClassImpl<*> && javaObjectType == other.javaObjectType other is KClassImpl<*> && javaObjectType == other.javaObjectType
@@ -21766,11 +21766,6 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/reflection/modifiers/classVisibility.kt"); runTest("compiler/testData/codegen/box/reflection/modifiers/classVisibility.kt");
} }
@TestMetadata("classes.kt")
public void testClasses() throws Exception {
runTest("compiler/testData/codegen/box/reflection/modifiers/classes.kt");
}
@TestMetadata("functions.kt") @TestMetadata("functions.kt")
public void testFunctions() throws Exception { public void testFunctions() throws Exception {
runTest("compiler/testData/codegen/box/reflection/modifiers/functions.kt"); runTest("compiler/testData/codegen/box/reflection/modifiers/functions.kt");
@@ -21781,11 +21781,6 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/reflection/modifiers/classVisibility.kt"); runTest("compiler/testData/codegen/box/reflection/modifiers/classVisibility.kt");
} }
@TestMetadata("classes.kt")
public void testClasses() throws Exception {
runTest("compiler/testData/codegen/box/reflection/modifiers/classes.kt");
}
@TestMetadata("functions.kt") @TestMetadata("functions.kt")
public void testFunctions() throws Exception { public void testFunctions() throws Exception {
runTest("compiler/testData/codegen/box/reflection/modifiers/functions.kt"); runTest("compiler/testData/codegen/box/reflection/modifiers/functions.kt");
@@ -77,6 +77,10 @@ public class ClassReference(override val jClass: Class<*>) : KClass<Any>, ClassB
override val isCompanion: Boolean override val isCompanion: Boolean
get() = error() get() = error()
@SinceKotlin("1.4")
override val isFun: 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?) =
@@ -127,6 +127,12 @@ public actual interface KClass<T : Any> : KDeclarationContainer, KAnnotatedEleme
@SinceKotlin("1.1") @SinceKotlin("1.1")
public val isCompanion: Boolean public val isCompanion: Boolean
/**
* `true` if this class is a Kotlin functional interface.
*/
@SinceKotlin("1.4")
public val isFun: 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:
@@ -3450,6 +3450,7 @@ public final class kotlin/jvm/internal/ClassReference : kotlin/jvm/internal/Clas
public fun isCompanion ()Z public fun isCompanion ()Z
public fun isData ()Z public fun isData ()Z
public fun isFinal ()Z public fun isFinal ()Z
public fun isFun ()Z
public fun isInner ()Z public fun isInner ()Z
public fun isInstance (Ljava/lang/Object;)Z public fun isInstance (Ljava/lang/Object;)Z
public fun isOpen ()Z public fun isOpen ()Z
@@ -4593,6 +4594,7 @@ public abstract interface class kotlin/reflect/KClass : kotlin/reflect/KAnnotate
public abstract fun isCompanion ()Z public abstract fun isCompanion ()Z
public abstract fun isData ()Z public abstract fun isData ()Z
public abstract fun isFinal ()Z public abstract fun isFinal ()Z
public abstract fun isFun ()Z
public abstract fun isInner ()Z public abstract fun isInner ()Z
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