Allow to import members from object by name

Wrap object members so they do not require dispatch receiver
Hack jvm backend to make it work
This commit is contained in:
Pavel V. Talanov
2015-10-02 16:01:09 +03:00
parent 507293e1ff
commit 37d5c4b223
22 changed files with 713 additions and 45 deletions
@@ -0,0 +1,50 @@
import C.f
import C.p
import C.ext
import C.g1
import C.g2
import C.fromClass
import C.fromInterface
import C.genericFromSuper
interface I<G> {
fun <T> T.fromInterface(): T = this
fun genericFromSuper(g: G) = g
}
open class BaseClass {
val <T> T.fromClass: T
get() = this
}
object C: BaseClass(), I<String> {
fun f(s: Int) = 1
fun f(s: String) = 2
fun Boolean.f() = 3
var p: Int = 4
val Int.ext: Int
get() = 6
fun <T> g1(t: T): T = t
val <T> T.g2: T
get() = this
}
fun box(): String {
if (f(1) != 1) return "1"
if (f("s") != 2) return "2"
if (true.f() != 3) return "3"
if (p != 4) return "4"
p = 5
if (p != 5) return "5"
if (5.ext != 6) return "6"
if (g1("7") != "7") return "7"
if ("8".g2 != "8") return "8"
if (9.fromInterface() != 9) return "9"
if ("10".fromClass != "10") return "10"
if (genericFromSuper("11") != "11") return "11"
return "OK"
}
@@ -0,0 +1,52 @@
import Class.C.f
import Class.C.p
import Class.C.ext
import Class.C.g1
import Class.C.g2
import Class.C.fromClass
import Class.C.fromInterface
import Class.C.genericFromSuper
interface I<G> {
fun <T> T.fromInterface(): T = this
fun genericFromSuper(g: G) = g
}
open class BaseClass {
val <T> T.fromClass: T
get() = this
}
class Class {
companion object C: BaseClass(), I<String> {
fun f(s: Int) = 1
fun f(s: String) = 2
fun Boolean.f() = 3
var p: Int = 4
val Int.ext: Int
get() = 6
fun <T> g1(t: T): T = t
val <T> T.g2: T
get() = this
}
}
fun box(): String {
if (f(1) != 1) return "1"
if (f("s") != 2) return "2"
if (true.f() != 3) return "3"
if (p != 4) return "4"
p = 5
if (p != 5) return "5"
if (5.ext != 6) return "6"
if (g1("7") != "7") return "7"
if ("8".g2 != "8") return "8"
if (9.fromInterface() != 9) return "9"
if ("10".fromClass != "10") return "10"
if (genericFromSuper("11") != "11") return "11"
return "OK"
}