KT-2752: declare properties as a pair of functions when accessors are marked with @JsName

This commit is contained in:
Alexey Andreev
2016-06-02 15:01:47 +03:00
parent 6e1a0901ac
commit be0013d9f2
17 changed files with 322 additions and 39 deletions
@@ -0,0 +1,21 @@
package foo
import kotlin.reflect.KProperty
class A {
@JsName("xx") val x: Int by B()
}
class B {
operator fun getValue(thisRef: Any?, property: KProperty<*>): Int = 23
}
fun box(): String {
val a = A()
assertEquals(23, a.x)
val d: dynamic = a
assertEquals(23, d.xx)
return "OK"
}
@@ -0,0 +1,29 @@
package foo
@native class A {
val xx: Int
@JsName("getX") get
var yy: Int
@JsName("getY") get
@JsName("setY") set
}
@native var zz: Int
@JsName("getZ") get
@JsName("setZ") set
fun box(): String {
val a = A()
assertEquals(23, a.xx)
assertEquals(0, a.yy)
a.yy = 42
assertEquals(42, a.yy)
assertEquals(32, zz)
zz = 232
assertEquals(232, zz)
return "OK"
}
@@ -0,0 +1,20 @@
function A() {
this.y_ = 0;
}
A.prototype.getX = function() {
return 23;
};
A.prototype.getY = function() {
return this.y_;
};
A.prototype.setY = function(y) {
return this.y_ = y;
};
var z_ = 32;
function getZ() {
return z_;
}
function setZ(z) {
z_ = z;
}
@@ -0,0 +1,37 @@
package foo
class A {
val x: Int
@JsName("getX_") get() = 23
var y: Int = 0
@JsName("getY_") get() = field + 10
@JsName("setY_") set(value) {
field = value
}
}
val A.z: Int
@JsName("getZ_") get() = 42
fun getPackage() = js("return Kotlin.modules.JS_TESTS.foo")
fun box(): String {
val a = A()
assertEquals(23, a.x)
assertEquals(10, a.y)
a.y = 13
assertEquals(23, a.y)
assertEquals(42, a.z)
val d: dynamic = A()
assertEquals(23, d.getX_())
assertEquals(10, d.getY_())
d.setY_(13)
assertEquals(23, d.getY_())
assertEquals(42, getPackage().getZ_(d))
return "OK"
}
@@ -0,0 +1,30 @@
package foo
val x: Int
@JsName("getX_") get() = 23
var y: Int = 0
@JsName("getY_") get() = field + 10
@JsName("setY_") set(value) {
field = value
}
fun getPackage() = js("return Kotlin.modules.JS_TESTS.foo")
fun box(): String {
assertEquals(23, x)
assertEquals(10, y)
y = 13
assertEquals(23, y)
y = 0
val d = getPackage()
assertEquals(23, d.getX_())
assertEquals(10, d.getY_())
d.setY_(13)
assertEquals(23, d.getY_())
return "OK"
}
@@ -0,0 +1,43 @@
package foo
open class A {
open val x: Int
@JsName("getX_") get() = 23
open var y: Int = 0
@JsName("getY_") get() = field + 10
@JsName("setY_") set(value) {
field = value
}
}
class B : A() {
override val x: Int
get() = 42
override var y: Int
get() = super.y + 5
set(value) {
super.y = value + 2
}
}
fun getPackage() = js("return Kotlin.modules.JS_TESTS.foo")
fun box(): String {
val a = B()
assertEquals(42, a.x)
assertEquals(15, a.y)
a.y = 13
assertEquals(30, a.y)
val d: dynamic = B()
assertEquals(42, d.getX_())
assertEquals(15, d.getY_())
d.setY_(13)
assertEquals(30, d.getY_())
return "OK"
}