diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/DelegationTest.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/DelegationTest.java index 7c00cea0972..824e300c962 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/DelegationTest.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/DelegationTest.java @@ -99,4 +99,8 @@ public class DelegationTest extends SingleFileTranslationTest { public void testOnObject() throws Exception { checkFooBoxIsOk(); } + + public void testComplexDelegation() throws Exception { + checkFooBoxIsOk(); + } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/DelegationTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/DelegationTranslator.kt index 22fc9b97c06..2b18e368b02 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/DelegationTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/DelegationTranslator.kt @@ -73,8 +73,10 @@ class DelegationTranslator( val field = fields[specifier]!! if (field.generateField) { val expression = specifier.delegateExpression!! - val delegateInitExpr = Translation.translateAsExpression(expression, context()) - statements.add(JsAstUtils.defineSimpleProperty(field.name, delegateInitExpr)) + val context = context().innerBlock() + val delegateInitExpr = Translation.translateAsExpression(expression, context) + statements += context.dynamicContext().jsBlock().statements + statements += JsAstUtils.defineSimpleProperty(field.name, delegateInitExpr) } } } diff --git a/js/js.translator/testData/delegation/cases/complexDelegation.kt b/js/js.translator/testData/delegation/cases/complexDelegation.kt new file mode 100644 index 00000000000..d30e553117c --- /dev/null +++ b/js/js.translator/testData/delegation/cases/complexDelegation.kt @@ -0,0 +1,29 @@ +package foo + +interface C { + fun f(): String +} + +class B(val value: String) : C { + override fun f() = value +} + +val b: Any = B("O") + +val x = B("failure1") +val y = B("K") +val z = B("failure2") + +fun selector() = 2 + +class A : C by (b as C) + +class D : C by when (selector()) { + 1 -> x + 2 -> y + else -> z +} + +fun box(): String { + return A().f() + D().f() +} \ No newline at end of file