Reflection: add API for declaration modifiers

#KT-10447 Fixed
This commit is contained in:
Alexander Udalov
2016-07-12 19:06:00 +03:00
parent ada81923dc
commit 7e317f7a7c
24 changed files with 681 additions and 1 deletions
@@ -0,0 +1,51 @@
// WITH_REFLECT
import kotlin.test.assertTrue
import kotlin.test.assertFalse
interface Interface {
open fun openFun() {}
abstract fun abstractFun()
}
abstract class AbstractClass {
final val finalVal = Unit
open val openVal = Unit
abstract var abstractVar: Unit
}
fun box(): String {
assertFalse(Interface::openFun.isFinal)
assertTrue(Interface::openFun.isOpen)
assertFalse(Interface::openFun.isAbstract)
assertFalse(Interface::abstractFun.isFinal)
assertFalse(Interface::abstractFun.isOpen)
assertTrue(Interface::abstractFun.isAbstract)
assertTrue(AbstractClass::finalVal.isFinal)
assertFalse(AbstractClass::finalVal.isOpen)
assertFalse(AbstractClass::finalVal.isAbstract)
assertTrue(AbstractClass::finalVal.getter.isFinal)
assertFalse(AbstractClass::finalVal.getter.isOpen)
assertFalse(AbstractClass::finalVal.getter.isAbstract)
assertFalse(AbstractClass::openVal.isFinal)
assertTrue(AbstractClass::openVal.isOpen)
assertFalse(AbstractClass::openVal.isAbstract)
assertFalse(AbstractClass::openVal.getter.isFinal)
assertTrue(AbstractClass::openVal.getter.isOpen)
assertFalse(AbstractClass::openVal.getter.isAbstract)
assertFalse(AbstractClass::abstractVar.isFinal)
assertFalse(AbstractClass::abstractVar.isOpen)
assertTrue(AbstractClass::abstractVar.isAbstract)
assertFalse(AbstractClass::abstractVar.getter.isFinal)
assertFalse(AbstractClass::abstractVar.getter.isOpen)
assertTrue(AbstractClass::abstractVar.getter.isAbstract)
assertFalse(AbstractClass::abstractVar.setter.isFinal)
assertFalse(AbstractClass::abstractVar.setter.isOpen)
assertTrue(AbstractClass::abstractVar.setter.isAbstract)
return "OK"
}
@@ -0,0 +1,56 @@
// WITH_REFLECT
import kotlin.test.assertTrue
import kotlin.test.assertFalse
class FinalClass {
companion object Companion
}
open class OpenClass
abstract class AbstractClass
interface Interface
enum class EnumClass
enum class EnumClassWithAbstractMember { ; abstract fun foo() }
annotation class AnnotationClass
object Object
fun box(): String {
assertTrue(FinalClass::class.isFinal)
assertFalse(FinalClass::class.isOpen)
assertFalse(FinalClass::class.isAbstract)
assertTrue(FinalClass.Companion::class.isFinal)
assertFalse(FinalClass.Companion::class.isOpen)
assertFalse(FinalClass.Companion::class.isAbstract)
assertFalse(OpenClass::class.isFinal)
assertTrue(OpenClass::class.isOpen)
assertFalse(OpenClass::class.isAbstract)
assertFalse(AbstractClass::class.isFinal)
assertFalse(AbstractClass::class.isOpen)
assertTrue(AbstractClass::class.isAbstract)
assertFalse(Interface::class.isFinal)
assertFalse(Interface::class.isOpen)
assertTrue(Interface::class.isAbstract)
assertTrue(EnumClass::class.isFinal)
assertFalse(EnumClass::class.isOpen)
assertFalse(EnumClass::class.isAbstract)
assertTrue(EnumClassWithAbstractMember::class.isFinal)
assertFalse(EnumClassWithAbstractMember::class.isOpen)
assertFalse(EnumClassWithAbstractMember::class.isAbstract)
// Note that unlike in JVM, annotation classes are final in Kotlin
assertTrue(AnnotationClass::class.isFinal)
assertFalse(AnnotationClass::class.isOpen)
assertFalse(AnnotationClass::class.isAbstract)
assertTrue(Object::class.isFinal)
assertFalse(Object::class.isOpen)
assertFalse(Object::class.isAbstract)
return "OK"
}
@@ -0,0 +1,43 @@
// WITH_REFLECT
import kotlin.test.assertTrue
import kotlin.test.assertFalse
sealed class S {
data class DataClass(val x: Int) : S()
inner class InnerClass
companion object
object NonCompanionObject
}
fun box(): String {
assertTrue(S::class.isSealed)
assertFalse(S::class.isFinal)
assertFalse(S::class.isOpen)
assertFalse(S::class.isAbstract)
assertFalse(S::class.isData)
assertFalse(S::class.isInner)
assertFalse(S::class.isCompanion)
assertFalse(S.DataClass::class.isSealed)
assertTrue(S.DataClass::class.isData)
assertFalse(S.DataClass::class.isInner)
assertFalse(S.DataClass::class.isCompanion)
assertFalse(S.InnerClass::class.isSealed)
assertFalse(S.InnerClass::class.isData)
assertTrue(S.InnerClass::class.isInner)
assertFalse(S.InnerClass::class.isCompanion)
assertFalse(S.Companion::class.isSealed)
assertFalse(S.Companion::class.isData)
assertFalse(S.Companion::class.isInner)
assertTrue(S.Companion::class.isCompanion)
assertFalse(S.NonCompanionObject::class.isSealed)
assertFalse(S.NonCompanionObject::class.isData)
assertFalse(S.NonCompanionObject::class.isInner)
assertFalse(S.NonCompanionObject::class.isCompanion)
return "OK"
}
@@ -0,0 +1,71 @@
// WITH_REFLECT
import kotlin.test.assertTrue
import kotlin.test.assertFalse
inline fun inline() {}
class External { external fun external() }
operator fun Unit.invoke() {}
infix fun Unit.infix(unit: Unit) {}
tailrec fun tailrec() { tailrec() }
class Suspend { suspend fun suspend(c: Continuation<Unit>) {} }
val externalGetter = Unit
external get
inline var inlineProperty: Unit
get() = Unit
set(value) {}
fun box(): String {
assertTrue(::inline.isInline)
assertFalse(::inline.isExternal)
assertFalse(::inline.isOperator)
assertFalse(::inline.isInfix)
assertFalse(::inline.isTailrec)
assertFalse(::inline.isSuspend)
assertFalse(External::external.isInline)
assertTrue(External::external.isExternal)
assertFalse(External::external.isOperator)
assertFalse(External::external.isInfix)
assertFalse(External::external.isTailrec)
assertFalse(External::external.isSuspend)
assertFalse(Unit::invoke.isInline)
assertFalse(Unit::invoke.isExternal)
assertTrue(Unit::invoke.isOperator)
assertFalse(Unit::invoke.isInfix)
assertFalse(Unit::invoke.isTailrec)
assertFalse(Unit::invoke.isSuspend)
assertFalse(Unit::infix.isInline)
assertFalse(Unit::infix.isExternal)
assertFalse(Unit::infix.isOperator)
assertTrue(Unit::infix.isInfix)
assertFalse(Unit::infix.isTailrec)
assertFalse(Unit::infix.isSuspend)
assertFalse(::tailrec.isInline)
assertFalse(::tailrec.isExternal)
assertFalse(::tailrec.isOperator)
assertFalse(::tailrec.isInfix)
assertTrue(::tailrec.isTailrec)
assertFalse(::tailrec.isSuspend)
assertFalse(Suspend::suspend.isInline)
assertFalse(Suspend::suspend.isExternal)
assertFalse(Suspend::suspend.isOperator)
assertFalse(Suspend::suspend.isInfix)
assertFalse(Suspend::suspend.isTailrec)
assertTrue(Suspend::suspend.isSuspend)
assertTrue(::externalGetter.getter.isExternal)
assertFalse(::externalGetter.getter.isInline)
assertFalse(::inlineProperty.getter.isExternal)
assertTrue(::inlineProperty.getter.isInline)
assertTrue(::inlineProperty.setter.isInline)
return "OK"
}
@@ -0,0 +1,36 @@
// WITH_REFLECT
import kotlin.test.assertTrue
import kotlin.test.assertFalse
inline fun Unit.foo(
crossinline crossinline: () -> Unit,
noinline coroutine x: Unit.() -> Continuation<Unit>,
vararg vararg: Unit
) {}
fun box(): String {
val p = Unit::foo.parameters
assertFalse(p[0].isNoinline)
assertFalse(p[0].isCrossinline)
assertFalse(p[0].isVararg)
assertFalse(p[0].isCoroutine)
assertFalse(p[1].isNoinline)
assertTrue(p[1].isCrossinline)
assertFalse(p[1].isVararg)
assertFalse(p[1].isCoroutine)
assertTrue(p[2].isNoinline)
assertFalse(p[2].isCrossinline)
assertFalse(p[2].isVararg)
assertTrue(p[2].isCoroutine)
assertFalse(p[3].isNoinline)
assertFalse(p[3].isCrossinline)
assertTrue(p[3].isVararg)
assertFalse(p[3].isCoroutine)
return "OK"
}
@@ -0,0 +1,22 @@
// WITH_REFLECT
import kotlin.test.assertTrue
import kotlin.test.assertFalse
const val const = "const"
val nonConst = "nonConst"
class A {
lateinit var lateinit: Unit
var nonLateinit = Unit
}
fun box(): String {
assertTrue(::const.isConst)
assertFalse(::nonConst.isConst)
assertTrue(A::lateinit.isLateinit)
assertFalse(A::nonLateinit.isLateinit)
return "OK"
}
@@ -0,0 +1,15 @@
// WITH_REFLECT
import kotlin.test.assertTrue
import kotlin.test.assertFalse
class A {
fun <T> nonReified(): T = null!!
inline fun <reified U> reified(): U = null!!
}
fun box(): String {
assertFalse(A::class.members.single { it.name == "nonReified" }.typeParameters.single().isReified)
assertTrue(A::class.members.single { it.name == "reified" }.typeParameters.single().isReified)
return "OK"
}