blob: ff96ee7cacce4417fbca7ae626e9b39aaa4acdde [file]
// LANGUAGE: +CompanionBlocks +CompanionExtensions
// WITH_REFLECT
// FILE: J.java
class J {
public int field;
public static int sField;
public void foo() {}
public static void sFoo() {}
}
// FILE: test.kt
import kotlin.test.*
import kotlin.reflect.*
class DelegateExposeContainer {
operator fun getValue(thisRef: Any?, property: KProperty<*>): KDeclarationContainer? = property.container
}
class C {
fun memberFun() {}
fun String.memberExtFun() {}
val memberVal = ""
val String.memberExtVal get() = ""
var memberVar = 0
val delegated by DelegateExposeContainer()
fun testDelegatedLocalVal() {
val prop by DelegateExposeContainer()
assertEquals(null, prop)
}
companion {
fun blockFun() {}
val blockVal = ""
var blockVar = 0
val blockDelegated by DelegateExposeContainer()
}
companion object {
fun companionObjectFun() {}
fun String.companionObjectExtFun() {}
val companionObjectVal = ""
val String.companionObjectExtVal get() = ""
var companionObjectVar = 0
val companionObjectDelegated by DelegateExposeContainer()
}
}
interface I {
fun memberFun() {}
fun String.memberExtFun() {}
val memberVal: String
val String.memberExtVal: String
var memberVar: String
companion {
fun blockFun() {}
val blockVal = ""
var blockVar = 0
val blockDelegated by DelegateExposeContainer()
}
companion object {
fun companionObjectFun() {}
fun String.companionObjectExtFun() {}
val companionObjectVal = ""
val String.companionObjectExtVal get() = ""
var companionObjectVar = 0
val companionObjectDelegated by DelegateExposeContainer()
}
}
fun toplevelFun() {}
fun String.toplevelExtFun() {}
val toplevelVal = ""
val String.toplevelExtVal get() = ""
var toplevelVar = 0
val toplevelDelegated by DelegateExposeContainer()
class E
companion fun E.compExtFun() {}
companion val E.compExtVal get() = ""
companion var E.compExtVar get() = ""; set(value) {}
companion val E.compExtDelegated by DelegateExposeContainer()
fun box(): String {
J::class.members.forEach { assertEquals(J::class, it.container) }
C::class.members.forEach { assertEquals(C::class, it.container) }
I::class.members.forEach { assertEquals(I::class, it.container) }
assertEquals(J::class, J::field.container)
assertEquals(J::class, J::sField.container)
assertEquals(J::class, J::foo.container)
assertEquals(J::class, J::sFoo.container)
assertEquals(C::class, C::memberFun.container)
assertEquals(C::class, C::memberVal.container)
assertEquals(C::class, C::memberVar.container)
assertEquals(C::class, C::delegated.container)
assertEquals(C::class, C().delegated)
assertEquals(C::class, C::blockFun.container)
assertEquals(C::class, C::blockVal.container)
assertEquals(C::class, C::blockVar.container)
assertEquals(C::class, C::blockDelegated.container)
assertEquals(C::class, C.blockDelegated)
assertEquals(C.Companion::class, C::companionObjectFun.container)
assertEquals(C.Companion::class, C::companionObjectVal.container)
assertEquals(C.Companion::class, C::companionObjectVar.container)
assertEquals(C.Companion::class, C::companionObjectDelegated.container)
assertEquals(C.Companion::class, C.companionObjectDelegated)
assertEquals(I::class, I::memberFun.container)
assertEquals(I::class, I::memberVal.container)
assertEquals(I::class, I::memberVar.container)
assertEquals(I::class, I::blockFun.container)
assertEquals(I::class, I::blockVal.container)
assertEquals(I::class, I::blockVar.container)
assertEquals(I::class, I::blockDelegated.container)
assertEquals(I::class, I.blockDelegated)
assertEquals(I.Companion::class, I::companionObjectFun.container)
assertEquals(I.Companion::class, I::companionObjectVal.container)
assertEquals(I.Companion::class, I::companionObjectVar.container)
assertEquals(I.Companion::class, I::companionObjectDelegated.container)
assertEquals(I.Companion::class, I.companionObjectDelegated)
val fileClass = ::box.container
assertEquals("file class TestKt", fileClass.toString())
assertEquals(fileClass, ::toplevelFun.container)
assertEquals(fileClass, String::toplevelExtFun.container)
assertEquals(fileClass, ::toplevelVal.container)
assertEquals(fileClass, String::toplevelExtVal.container)
assertEquals(fileClass, ::toplevelVar.container)
assertEquals(fileClass, ::toplevelDelegated.container)
assertEquals(fileClass, toplevelDelegated)
assertEquals(fileClass, E::compExtFun.container)
assertEquals(fileClass, E::compExtVal.container)
assertEquals(fileClass, E::compExtVar.container)
assertEquals(fileClass, E::compExtDelegated.container)
assertEquals(fileClass, E.compExtDelegated)
fun local() {}
assertEquals(null, ::local.container)
val delegatedLocal by DelegateExposeContainer()
assertEquals(null, delegatedLocal)
C().testDelegatedLocalVal()
val obj = object {
fun memberFun() {}
fun String.memberExtFun() {}
val memberVal: String = ""
val String.memberExtVal: String get() = ""
var memberVar: String = ""
val delegated by DelegateExposeContainer()
}
assertEquals(obj::class, obj::memberFun.container)
assertEquals(obj::class, obj::memberVal.container)
assertEquals(obj::class, obj::memberVar.container)
assertEquals(obj::class, obj::delegated.container)
assertEquals(obj::class, obj.delegated)
class LocalClass {
fun memberFun() {}
fun String.memberExtFun() {}
val memberVal: String = ""
val String.memberExtVal: String get() = ""
var memberVar: String = ""
val delegated by DelegateExposeContainer()
// Companion blocks in local classes are prohibitted (KT-90617)
// companion {
// fun blockFun() {}
// val blockVal = ""
// var blockVar = 0
// val blockDelegated by DelegateExposeContainer()
// }
}
assertEquals(LocalClass::class, LocalClass::memberFun.container)
assertEquals(LocalClass::class, LocalClass::memberVal.container)
assertEquals(LocalClass::class, LocalClass::memberVar.container)
assertEquals(LocalClass::class, LocalClass::delegated.container)
assertEquals(LocalClass::class, LocalClass().delegated)
// assertEquals(LocalClass::class, LocalClass::blockFun.container)
// assertEquals(LocalClass::class, LocalClass::blockVal.container)
// assertEquals(LocalClass::class, LocalClass::blockVar.container)
// assertEquals(LocalClass::class, LocalClass::blockDelegated.container)
// assertEquals(LocalClass::class, LocalClass.blockDelegated)
return "OK"
}