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
@@ -8,13 +8,125 @@ object O {
fun bar() {}
}
object S {
val prop: String = ""
fun o(<!UNUSED_PARAMETER!>s<!>: String) = Unit
fun o(<!UNUSED_PARAMETER!>i<!>: Int) = Unit
fun Int.ext() = Unit
var String.ext: Int
get() = 3
set(i) {
}
fun A(<!UNUSED_PARAMETER!>c<!>: Int) = A()
class A()
fun <T> genericFun(t: T, <!UNUSED_PARAMETER!>t2<!>: T): T = t
}
open class Base {
fun f() {
}
fun <T> g(<!UNUSED_PARAMETER!>t<!>: T) {
}
val p = 1
val Int.ext: Int
get() = 4
}
interface BaseI<T> {
fun fromI(): Int = 3
fun genericFromI(t: T) = t
}
object K: Base(), BaseI<Int> {
val own: String = ""
}
// FILE: b.kt
package b
import a.<!CANNOT_IMPORT_MEMBERS_FROM_SINGLETON!>O<!>.*
import a.<!CANNOT_ALL_UNDER_IMPORT_FROM_SINGLETON!>O<!>.*
fun test() {
fun testErroneusAllUnderImportFromObject() {
A()
B
<!UNRESOLVED_REFERENCE!>bar<!>()
}
// FILE: c.kt
package c
import a.S.prop
import a.S.o
import a.S.ext
import a.S.A
import a.S.genericFun
import a.S.ext as extRenamed
fun testImportFromObjectByName() {
prop
o("a")
o(3)
3.ext()
"".ext = 3
val <!UNUSED_VARIABLE!>c<!>: Int = "".ext
3.extRenamed()
"".extRenamed = 3
val <!UNUSED_VARIABLE!>c2<!>: Int = "".extRenamed
A()
A(3)
val <!UNUSED_VARIABLE!>a<!>: Int = genericFun(3, 3)
val <!UNUSED_VARIABLE!>s<!>: String = genericFun("A", "b")
val <!UNUSED_VARIABLE!>b<!>: Boolean = genericFun(true, false)
}
fun <T> t(t: T): T {
return genericFun(t, t)
}
// FILE: d.kt
package d
import a.S.prop as renamed
fun testFunImportedFromObjectHasNoDispatchReceiver(l: a.S) {
l.<!UNRESOLVED_REFERENCE!>renamed<!>
l.prop
renamed
}
// FILE: e.kt
package e
import a.K.f
import a.K.g
import a.K.p
import a.K.own
import a.K.fromI
import a.K.genericFromI
import a.K.ext
fun testMembersFromSupertypes() {
f()
g("")
p
fromI()
genericFromI(3)
genericFromI(<!TYPE_MISMATCH!>"a"<!>)
own
}