From d6a2c6d95aa50dfddd894a2b34b4c1b59efd70ae Mon Sep 17 00:00:00 2001 From: Erokhin Stanislav Date: Fri, 4 Oct 2013 16:31:35 +0400 Subject: [PATCH] JS backend: fix init val in constructor --- .../test/semantics/PropertyAccessTest.java | 11 ++-- .../KotlinPropertyAccessTranslator.java | 8 ++- .../cases/initValInConstructor.kt | 52 +++++++++++++++++++ 3 files changed, 66 insertions(+), 5 deletions(-) create mode 100644 js/js.translator/testFiles/propertyAccess/cases/initValInConstructor.kt diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/PropertyAccessTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/PropertyAccessTest.java index ac63248aefa..63b336fcc20 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/PropertyAccessTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/PropertyAccessTest.java @@ -20,7 +20,6 @@ import com.google.common.collect.Lists; import org.jetbrains.annotations.NotNull; import org.jetbrains.k2js.config.EcmaVersion; import org.jetbrains.k2js.test.SingleFileTranslationTest; -import org.jetbrains.k2js.test.utils.JsTestUtils; import java.util.List; @@ -80,15 +79,19 @@ public final class PropertyAccessTest extends SingleFileTranslationTest { } public void testInitInstanceProperties() throws Exception { - fooBoxTest(JsTestUtils.successOnEcmaV5()); + fooBoxTest(); + } + + public void testInitValInConstructor() throws Exception { + checkFooBoxIsOk(); } public void testEnumerable() throws Exception { - fooBoxTest(JsTestUtils.successOnEcmaV5()); + fooBoxTest(); } public void testOverloadedOverriddenFunctionPropertyName() throws Exception { - fooBoxTest(JsTestUtils.successOnEcmaV5()); + fooBoxTest(); } @Override diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/KotlinPropertyAccessTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/KotlinPropertyAccessTranslator.java index c5da3f4a90a..18916fc4d5e 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/reference/KotlinPropertyAccessTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/reference/KotlinPropertyAccessTranslator.java @@ -28,6 +28,8 @@ import org.jetbrains.jet.lang.resolve.DescriptorFactory; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; import org.jetbrains.k2js.translate.context.TranslationContext; +import static org.jetbrains.k2js.translate.utils.TranslationUtils.assignmentToBackingField; + /** * For properies /w accessors. */ @@ -78,7 +80,11 @@ public final class KotlinPropertyAccessTranslator extends PropertyAccessTranslat @NotNull @Override public JsExpression translateAsSet(@NotNull JsExpression toSetTo) { - return translateAsSet(receiver, toSetTo); + if (propertyDescriptor.isVar()) { + return translateAsSet(receiver, toSetTo); + } else { + return assignmentToBackingField(context(), propertyDescriptor, toSetTo); + } } @Override diff --git a/js/js.translator/testFiles/propertyAccess/cases/initValInConstructor.kt b/js/js.translator/testFiles/propertyAccess/cases/initValInConstructor.kt new file mode 100644 index 00000000000..ac76b00c72f --- /dev/null +++ b/js/js.translator/testFiles/propertyAccess/cases/initValInConstructor.kt @@ -0,0 +1,52 @@ +package foo + +class A { + val a: Int + val aa: Int + get() { + return $aa + } + + var aR = 0 + var aaR = 0 + { + a = 1 + $aa = 2 + + aR = a + aaR = aa + } +} + +class B { + private val a: Int + private val aa: Int + get() { + return $aa + } + + var aR = 0 + var aaR = 0 + { + a = 3 + $aa = 4 + + aR = a + aaR = aa + } +} + +fun box(): String { + val a = A() + + if (a.a != 1) return "a.a != 1, it: ${a.a}" + if (a.aa != 2) return "a.aa != 2, it: ${a.aa}" + if (a.aR != 1) return "a.aR != 1, it: ${a.aR}" + if (a.aaR != 2) return "a.aaR != 2, it: ${a.aaR}" + + val b = B() + if (b.aR != 3) return "b.aR != 3, it: ${b.aR}" + if (b.aaR != 4) return "b.aaR != 4, it: ${b.aaR}" + + return "OK" +} \ No newline at end of file