Introduce module 'reflection', move KFunctionN to it

Metadata for KFunction classes is now longer serialized along with built-in
classes. This effectively means that it's no longer possible to find KFunction
classes via dependency on built-ins. There should be a kotlin-runtime library
in the specified classpath for reflection types to be resolvable.

A lot of tests were moved and changed, because tests on callable references
require stdlib in classpath from now on
This commit is contained in:
Alexander Udalov
2014-05-07 18:35:45 +04:00
parent c1cd8bf069
commit c7a7f31e82
124 changed files with 619 additions and 847 deletions
@@ -0,0 +1,9 @@
abstract class A {
abstract fun foo(): String
}
class B : A() {
override fun foo() = "OK"
}
fun box(): String = B().(A::foo)()
@@ -0,0 +1,5 @@
fun box(): String {
if (true.(Boolean::not)() != false) return "Fail 1"
if (false.(Boolean::not)() != true) return "Fail 2"
return "OK"
}
@@ -0,0 +1,11 @@
class A {
fun foo(k: Int) = k
fun result() = this.(::foo)(111)
}
fun box(): String {
val result = A().result()
if (result != 111) return "Fail $result"
return "OK"
}
@@ -0,0 +1,12 @@
class A {
fun o() = 111
fun k(k: Int) = k
}
fun A.foo() = this.(::o)() + this.(A::k)(222)
fun box(): String {
val result = A().foo()
if (result != 333) return "Fail $result"
return "OK"
}
@@ -0,0 +1,8 @@
class A {
fun foo() = "OK"
}
fun box(): String {
val x = A::foo
return A().x()
}
@@ -0,0 +1,8 @@
class A {
fun foo(result: String) = result
}
fun box(): String {
val x = A::foo
return A().x("OK")
}
@@ -0,0 +1,14 @@
class A {
var result = "Fail"
fun foo() {
result = "OK"
}
}
fun box(): String {
val a = A()
val x = A::foo
a.x()
return a.result
}
@@ -0,0 +1,14 @@
class A {
var result = "Fail"
fun foo(newResult: String) {
result = newResult
}
}
fun box(): String {
val a = A()
val x = A::foo
a.x("OK")
return a.result
}
@@ -0,0 +1,5 @@
class A {
var result = "OK"
}
fun box() = (::A)().result
@@ -0,0 +1,3 @@
class A(val result: String)
fun box() = (::A)("OK").result
@@ -0,0 +1,9 @@
enum class E {
I
}
fun box(): String {
val i = E.I.(E::name)()
if (i != "I") return "Fail $i"
return "OK"
}
@@ -0,0 +1,3 @@
class A
fun box() = if (A().(A::equals)(A())) "Fail" else "OK"
@@ -0,0 +1,7 @@
class A {
fun result() = this.(::foo)("OK")
}
fun A.foo(x: String) = x
fun box() = A().result()
@@ -0,0 +1,7 @@
class A
fun A.foo() = this.(A::bar)("OK")
fun A.bar(x: String) = x
fun box() = A().foo()
@@ -0,0 +1,8 @@
class A
fun A.foo() = "OK"
fun box(): String {
val x = A::foo
return A().x()
}
@@ -0,0 +1,8 @@
class A
fun A.foo(result: String) = result
fun box(): String {
val x = A::foo
return A().x("OK")
}
@@ -0,0 +1,14 @@
class A {
var result = "Fail"
}
fun A.foo() {
result = "OK"
}
fun box(): String {
val a = A()
val x = A::foo
a.x()
return a.result
}
@@ -0,0 +1,14 @@
class A {
var result = "Fail"
}
fun A.foo(newResult: String) {
result = newResult
}
fun box(): String {
val a = A()
val x = A::foo
a.x("OK")
return a.result
}
@@ -0,0 +1,5 @@
class A<T>(val t: T) {
fun foo(): T = t
}
fun box() = A("OK").(A<String>::foo)()
@@ -0,0 +1,14 @@
class A {
inner class Inner {
val o = 111
val k = 222
}
fun result() = this.(A::Inner)().o + this.(::Inner)().k
}
fun box(): String {
val result = A().result()
if (result != 333) return "Fail $result"
return "OK"
}
@@ -0,0 +1,14 @@
class A {
inner class Inner {
val o = 111
val k = 222
}
}
fun A.foo() = this.(A::Inner)().o + this.(::Inner)().k
fun box(): String {
val result = A().foo()
if (result != 333) return "Fail $result"
return "OK"
}
@@ -0,0 +1,12 @@
class A {
inner class Inner {
val o = 111
val k = 222
}
}
fun box(): String {
val result = (::A)().(A::Inner)().o + A().(A::Inner)().k
if (result != 333) return "Fail $result"
return "OK"
}
@@ -0,0 +1,9 @@
class A {
inner class Inner(val result: Int)
}
fun box(): String {
val result = (::A)().(A::Inner)(111).result + A().(A::Inner)(222).result
if (result != 333) return "Fail $result"
return "OK"
}
@@ -0,0 +1,12 @@
class Outer {
val result = "OK"
inner class Inner {
fun foo() = result
}
}
fun box(): String {
val f = Outer.Inner::foo
return Outer().Inner().f()
}
@@ -0,0 +1,8 @@
fun box(): String {
class Local {
fun foo() = "OK"
}
val ref = Local::foo
return Local().ref()
}
@@ -0,0 +1,9 @@
fun box(): String {
var result = "Fail"
fun changeToOK() { result = "OK" }
val ok = ::changeToOK
ok()
return result
}
@@ -0,0 +1,7 @@
fun box(): String {
class A {
val result = "OK"
}
return (::A)().result
}
@@ -0,0 +1,10 @@
fun box(): String {
class A {
var result: String = "Fail";
{
result = "OK"
}
}
return (::A)().result
}
@@ -0,0 +1,11 @@
fun box(): String {
trait Named {
fun name(): String
}
enum class E : Named {
OK
}
return E.OK.(Named::name)()
}
@@ -0,0 +1,6 @@
class A
fun box(): String {
fun A.foo() = "OK"
return A().(A::foo)()
}
@@ -0,0 +1,5 @@
fun box(): String {
class A
fun A.foo() = "OK"
return (::A)().(A::foo)()
}
@@ -0,0 +1,4 @@
fun box(): String {
fun Int.is42With(that: Int) = this + 2 * that == 42
return if (16.(Int::is42With)(13)) "OK" else "Fail"
}
@@ -0,0 +1,11 @@
class A
fun box(): String {
var result = "Fail"
fun A.ext() { result = "OK" }
val f = A::ext
A().f()
return result
}
@@ -0,0 +1,8 @@
fun box(): String {
class Id<T> {
fun invoke(t: T) = t
}
val ref = Id<String>::invoke
return Id<String>().ref("OK")
}
@@ -0,0 +1,11 @@
fun box(): String {
val result = "OK"
class Local {
fun foo() = result
}
val member = Local::foo
val instance = Local()
return instance.member()
}
@@ -0,0 +1,10 @@
fun box(): String {
fun foo(): String {
fun bar() = "OK"
val ref = ::bar
return ref()
}
val ref = ::foo
return ref()
}
@@ -0,0 +1,7 @@
fun foo(until: Int): String {
fun bar(x: Int): String =
if (x == until) "OK" else bar(x + 1)
return (::bar)(0)
}
fun box() = foo(10)
@@ -0,0 +1,4 @@
fun box(): String {
fun foo() = "OK"
return (::foo)()
}
@@ -0,0 +1,7 @@
fun box(): String {
val result = "OK"
fun foo() = result
return (::foo)()
}
@@ -0,0 +1,4 @@
fun box(): String {
fun foo(s: String) = s
return (::foo)("OK")
}
@@ -0,0 +1,15 @@
var state = 23
fun box(): String {
fun incrementState(inc: Int) {
state += inc
}
val inc = ::incrementState
inc(12)
inc(-5)
inc(27)
inc(-15)
return if (state == 42) "OK" else "Fail $state"
}
@@ -0,0 +1,14 @@
class A {
class Nested {
val o = 111
val k = 222
}
fun result() = (::Nested)().o + (A::Nested)().k
}
fun box(): String {
val result = A().result()
if (result != 333) return "Fail $result"
return "OK"
}
@@ -0,0 +1,7 @@
class A {
class Nested {
val result = "OK"
}
}
fun box() = (A::Nested)().result
@@ -0,0 +1,5 @@
class A {
class Nested(val result: String)
}
fun box() = (A::Nested)("OK").result
@@ -0,0 +1,11 @@
fun box(): String {
(::ByteArray)(10)
(::IntArray)(10)
(::ShortArray)(10)
(::LongArray)(10)
(::DoubleArray)(10)
(::FloatArray)(10)
(::BooleanArray)(10)
return "OK"
}
@@ -0,0 +1,13 @@
object A {
var result = "Fail"
fun foo() {
result = "OK"
}
}
fun box(): String {
val x = A::foo
A.x()
return A.result
}
@@ -0,0 +1,13 @@
object A {
var result = "Fail"
fun foo(newResult: String) {
result = newResult
}
}
fun box(): String {
val x = A::foo
A.x("OK")
return A.result
}
@@ -0,0 +1,7 @@
class A {
private fun foo() = "OK"
fun bar() = this.(::foo)()
}
fun box() = A().bar()
@@ -0,0 +1,19 @@
import java.util.ArrayList
import java.util.Arrays
import java.util.Collections
import java.util.Comparator
fun sort(list: MutableList<String>, comparator: (String, String) -> Int) {
Collections.sort(list, object : Comparator<String> {
override fun compare(p0: String, p1: String) = comparator(p0, p1)
})
}
fun compare(s1: String, s2: String) = s1 compareTo s2
fun box(): String {
val l = ArrayList(Arrays.asList("d", "b", "c", "e", "a"))
sort(l, ::compare)
if (l != Arrays.asList("a", "b", "c", "d", "e")) return "Fail: $l"
return "OK"
}
@@ -0,0 +1,23 @@
fun foo(s: String) {}
class A {
fun bar(): String = ""
}
fun A.baz() {}
fun box(): String {
val f = "${::foo}"
if (f != "kotlin.reflect.KFunctionImpl1<java.lang.String, kotlin.Unit>") return "Fail foo: $f"
val nameOfA = (A() as java.lang.Object).getClass().getName()
val g = "${A::bar}"
if (g != "kotlin.reflect.KMemberFunctionImpl0<$nameOfA, java.lang.String>") return "Fail bar: $g"
val h = "${A::baz}"
if (h != "kotlin.reflect.KExtensionFunctionImpl0<$nameOfA, kotlin.Unit>") return "Fail baz: $h"
return "OK"
}
@@ -0,0 +1,11 @@
fun foo(o: Int, k: Int) = o + k
class A {
fun bar() = (::foo)(111, 222)
}
fun box(): String {
val result = A().bar()
if (result != 333) return "Fail $result"
return "OK"
}
@@ -0,0 +1,11 @@
fun foo(o: Int, k: Int) = o + k
class A
fun A.bar() = (::foo)(111, 222)
fun box(): String {
val result = A().bar()
if (result != 333) return "Fail $result"
return "OK"
}
@@ -0,0 +1,6 @@
fun foo() = "OK"
fun box(): String {
val x = ::foo
return x()
}
@@ -0,0 +1,6 @@
fun foo(x: String) = x
fun box(): String {
val x = ::foo
return x("OK")
}
@@ -0,0 +1,11 @@
var result = "Fail"
fun foo() {
result = "OK"
}
fun box(): String {
val x = ::foo
x()
return result
}
@@ -0,0 +1,11 @@
var result = "Fail"
fun foo(newResult: String) {
result = newResult
}
fun box(): String {
val x = ::foo
x("OK")
return result
}
@@ -0,0 +1,11 @@
trait T {
fun foo() = "OK"
}
class B : T {
inner class C {
fun bar() = this@B.(::foo)()
}
}
fun box() = B().C().bar()
@@ -0,0 +1,9 @@
trait A {
fun foo(): String
}
class B : A {
override fun foo() = "OK"
}
fun box() = B().(A::foo)()