diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/DelegatePropertyTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/DelegatePropertyTest.java index e0b713cf01e..63c7b7bba0a 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/DelegatePropertyTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/DelegatePropertyTest.java @@ -47,7 +47,7 @@ public class DelegatePropertyTest extends SingleFileTranslationTest { checkFooBoxIsOk(); } - public void testDelegateForExtProperty() throws Exception { + public void testDelegateByExtensionProperty() throws Exception { checkFooBoxIsOk(); } diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/DelegationTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/DelegationTest.java index 4b40d9af614..622c0b76326 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/DelegationTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/DelegationTest.java @@ -91,4 +91,8 @@ public class DelegationTest extends SingleFileTranslationTest { public void testDelegationExtProp() throws Exception { checkFooBoxIsOk(); } + + public void testDelegationExtensionPropertyDelegated() throws Exception { + checkFooBoxIsOk(); + } } diff --git a/js/js.translator/testData/delegateProperty/cases/delegateByExtensionProperty.kt b/js/js.translator/testData/delegateProperty/cases/delegateByExtensionProperty.kt new file mode 100644 index 00000000000..e50af058cee --- /dev/null +++ b/js/js.translator/testData/delegateProperty/cases/delegateByExtensionProperty.kt @@ -0,0 +1,39 @@ +package foo + +class State(var realValue: Int) + +fun format(event: String, property: String, value: Int): String + = "${event}: ${property} = ${value}; " + +object LoggerDelegate { + var log = "" + + fun get(state: State, desc: PropertyMetadataImpl): Int { + log += format("get", desc.name, state.realValue) + return state.realValue + } + + fun set(state: State, desc: PropertyMetadataImpl, value: Int) { + log += format("set", desc.name, value) + state.realValue = value + } +} + +var State.value by LoggerDelegate + +fun box(): String { + val state = State(1) + var expectedLog = "" + + assertEquals(1, state.value) + expectedLog += format("get", "value", 1) + + state.value = 3 + expectedLog += format("set", "value", 3) + + assertEquals(3, state.value) + expectedLog += format("get", "value", 3) + + assertEquals(expectedLog, LoggerDelegate.log) + return "OK" +} \ No newline at end of file diff --git a/js/js.translator/testData/delegateProperty/cases/delegateForExtProperty.kt b/js/js.translator/testData/delegateProperty/cases/delegateForExtProperty.kt deleted file mode 100644 index 1a79bc00d9d..00000000000 --- a/js/js.translator/testData/delegateProperty/cases/delegateForExtProperty.kt +++ /dev/null @@ -1,14 +0,0 @@ -package foo - -class Delegate { - fun get(t: A, p: PropertyMetadata): Int = 1 -} - -val A.prop: Int by Delegate() - -class A { -} - -fun box(): String { - return if (A().prop == 1) "OK" else "fail" -} diff --git a/js/js.translator/testData/delegation/cases/delegationExtensionPropertyDelegated.kt b/js/js.translator/testData/delegation/cases/delegationExtensionPropertyDelegated.kt new file mode 100644 index 00000000000..a9db7607012 --- /dev/null +++ b/js/js.translator/testData/delegation/cases/delegationExtensionPropertyDelegated.kt @@ -0,0 +1,40 @@ +package foo + +class State(var value: Int) + +trait Base { + var State.multiplied: Int +} + +class Delegate(val multiplier: Int) { + fun get(state: State, desc: PropertyMetadataImpl): Int = multiplier * state.value + + fun set(state: State, desc: PropertyMetadataImpl, value: Int) { + state.value = value / multiplier + } + +} + +open class BaseImpl() : Base { + override var State.multiplied: Int by Delegate(2) +} + +class Derived() : Base by BaseImpl() { + fun getValueMultiplied(state: State): Int = state.multiplied + + fun setValueMultiplied(state: State, value: Int) { + state.multiplied = value + } +} + +fun box(): String { + val d = Derived() + + val state = State(2) + assertEquals(4, d.getValueMultiplied(state)) + + d.setValueMultiplied(state, 10) + assertEquals(10, d.getValueMultiplied(state)) + + return "OK" +} \ No newline at end of file