Support property getters/setters in reflection

This commit is contained in:
Alexander Udalov
2015-07-01 19:08:31 +03:00
parent 749d0c4a52
commit 4f1247f03f
18 changed files with 297 additions and 4 deletions
@@ -0,0 +1,30 @@
import kotlin.reflect.*
import kotlin.test.assertEquals
var foo = ""
var String.bar: String
get() = this
set(value) {}
class A(var baz: Int) {
var String.quux: String
get() = this
set(value) {}
}
fun box(): String {
assertEquals("<get-foo>", ::foo.getter.name)
assertEquals("<set-foo>", ::foo.setter.name)
assertEquals("<get-bar>", String::bar.getter.name)
assertEquals("<set-bar>", String::bar.setter.name)
assertEquals("<get-baz>", A::baz.getter.name)
assertEquals("<set-baz>", A::baz.setter.name)
val me = A::class.extensionProperties.single() as KMutableProperty2<A, String, String>
assertEquals("<get-quux>", me.getter.name)
assertEquals("<set-quux>", me.setter.name)
return "OK"
}
@@ -0,0 +1,18 @@
import kotlin.test.assertEquals
var state: String = ""
var String.prop: String
get() = length().toString()
set(value) { state = this + value }
fun box(): String {
val prop = String::prop
assertEquals("3", prop.getter.invoke("abc"))
assertEquals("5", prop.getter("defgh"))
prop.setter("O", "K")
return state
}
@@ -0,0 +1,20 @@
import kotlin.reflect.KMutableProperty2
import kotlin.test.assertEquals
class C(var state: String) {
var String.prop: String
get() = length().toString()
set(value) { state = this + value }
}
fun box(): String {
val prop = C::class.extensionProperties.single() as KMutableProperty2<C, String, String>
val c = C("")
assertEquals("3", prop.getter.invoke(c, "abc"))
assertEquals("1", prop.getter(c, "d"))
prop.setter(c, "O", "K")
return c.state
}
@@ -0,0 +1,15 @@
import kotlin.test.assertEquals
class C(var state: String)
fun box(): String {
val prop = C::state
val c = C("1")
assertEquals("1", prop.getter.invoke(c))
assertEquals("1", prop.getter(c))
prop.setter(c, "OK")
return prop.get(c)
}
@@ -0,0 +1,14 @@
import kotlin.test.assertEquals
var state: String = ""
fun box(): String {
val prop = ::state
assertEquals("", prop.getter.invoke())
assertEquals("", prop.getter())
prop.setter("OK")
return prop.get()
}