import java.awt.Rectangle import kotlin.reflect.* class Reflection { fun fn() { val ref: KFunction2 = Ccc::m println(ref.name) val x0: KProperty1 = C::p0 val x1: Int = x0.get(C()) val x2: String = x0.name val x3: KProperty1.Getter = x0.getter val x4: KFunction1 = x0::get val x5: KProperty0 = C()::p0 val y0: KMutableProperty1 = C::p1 val y1: Unit = y0.set(C(), 5) val y2: String = y0.name val y3: KMutableProperty1.Setter = y0.setter val y4: KFunction2 = y0::set val y5: KMutableProperty0 = C()::p1 val prop = (C::class).members.single { it.name == "p3" } as KProperty2 val z0 = prop.get(C(), 5) } class Ccc { fun m(i:Int):Double = 5.0 } class C { val p0: Int = 1 var p1: Int = 2 var p2: Int get() = 1 set(value) = Unit var Int.p3: Int // this can't be referenced through a property reference get() = 1 set(value) = Unit } } val String.lastChar: Char get() = this[length - 1] fun fn2() { println(String::lastChar.get("abc")) println("abcd"::lastChar.get()) } fun Class1.Generic.ext1() = this.toString() fun Class1.Generic.ext2() = this.toString() class Class1 { fun fn() { println(Generic::m1) println(Generic()::m1) println(Generic::ext1) println(Generic()::ext1) println(Generic::ext2) println(Generic()::ext2) println(Generic::p2) println(Generic()::p2) println(Int::MAX_VALUE) // Companion object and property getter println(Integer::MAX_VALUE) // Static field access, no getter println(Rectangle()::height) // Field access, no getter, with dispatch receiver } class Generic { fun m1(i:T1) = this.toString() var p2: T1? get() = null set(value) = Unit } } class Class2(val value: T) { inner class Inner { constructor(t: T1) { } } fun test() { fn11("", ::Inner) } } fun fn(value: T) { } fun test() { fn11("", ::Class2) fn11("", ::fn) fn12("", Class2(5)::Inner) } fun fn11(l: T, transform: (T) -> R) { } fun fn12(l: T1, l2: (T1) -> R) { } open class Base1(var prop1: Int) {} class Derived1(prop1: Int) : Base1(prop1) { fun fn() { println(this::prop1) } } class LocalFn { fun fn() { fun fn1(i: Int) { } val x: KFunction1 = ::fn1 } } fun fn1() = 5 fun fn2(f: () -> Unit) = f() fun adapted() { fn2(::fn1) } fun expectsOneParam(f: (Int) -> Int) = f(0) fun takesOptionalParam(x: Int, y: Int = 0) = x + y fun adaptedParams() { expectsOneParam(::takesOptionalParam) } fun expectsOneParamAndReceiver(f: (MemberOptionalsTest, Int) -> Int) { } class MemberOptionalsTest { fun takesOptionalParam(x: Int, y: Int = 0) = x + y } fun memberAdaptedParams(m: MemberOptionalsTest) { expectsOneParam(m::takesOptionalParam) expectsOneParamAndReceiver(MemberOptionalsTest::takesOptionalParam) } fun expectsOneParamAndExtension(f: (String, Int) -> Int) { } fun String.extTakesOptionalParam(x: Int, y: Int = 0) = x + y fun extensionAdaptedParams(s: String) { expectsOneParam(s::extTakesOptionalParam) expectsOneParamAndExtension(String::extTakesOptionalParam) } class ConstructorOptional(x: Int, y: Int = 0) { } fun expectsOneParamCons(f: (Int) -> ConstructorOptional) = f(0) fun constructorAdaptedParams() { expectsOneParamCons(::ConstructorOptional) }