From 028e0ec59ad8aec0023bddb75d1ed9fc9602fa4c Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 16 Sep 2015 18:34:46 +0300 Subject: [PATCH] "field": JS translation --- .../js/test/semantics/PropertyAccessTest.java | 4 ++++ .../reference/BackingFieldAccessTranslator.java | 4 ++++ .../translate/reference/ReferenceTranslator.java | 4 +++- .../testData/propertyAccess/cases/field.kt | 16 ++++++++++++++++ 4 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 js/js.translator/testData/propertyAccess/cases/field.kt diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/PropertyAccessTest.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/PropertyAccessTest.java index 4fca9c12afb..ec34c4b5602 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/PropertyAccessTest.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/PropertyAccessTest.java @@ -98,6 +98,10 @@ public final class PropertyAccessTest extends SingleFileTranslationTest { checkFooBoxIsOk(); } + public void testField() throws Exception { + checkFooBoxIsOk(); + } + @Override @NotNull protected List additionalJsFiles(@NotNull EcmaVersion ecmaVersion) { diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/BackingFieldAccessTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/BackingFieldAccessTranslator.java index 4d619e0b84b..c3a49318d4e 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/BackingFieldAccessTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/BackingFieldAccessTranslator.java @@ -20,6 +20,7 @@ import com.google.dart.compiler.backend.js.ast.JsExpression; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; import org.jetbrains.kotlin.descriptors.PropertyDescriptor; +import org.jetbrains.kotlin.descriptors.impl.SyntheticFieldDescriptor; import org.jetbrains.kotlin.js.translate.context.TemporaryVariable; import org.jetbrains.kotlin.js.translate.context.TranslationContext; import org.jetbrains.kotlin.js.translate.general.AbstractTranslator; @@ -41,6 +42,9 @@ public final class BackingFieldAccessTranslator extends AbstractTranslator imple public static BackingFieldAccessTranslator newInstance(@NotNull JetSimpleNameExpression expression, @NotNull TranslationContext context) { DeclarationDescriptor referencedProperty = getDescriptorForReferenceExpression(context.bindingContext(), expression); + if (referencedProperty instanceof SyntheticFieldDescriptor) { + referencedProperty = ((SyntheticFieldDescriptor) referencedProperty).getPropertyDescriptor(); + } assert referencedProperty instanceof PropertyDescriptor; return new BackingFieldAccessTranslator((PropertyDescriptor) referencedProperty, context); } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/ReferenceTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/ReferenceTranslator.java index 520b287ba71..51658d05c79 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/ReferenceTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/ReferenceTranslator.java @@ -20,6 +20,7 @@ import com.google.dart.compiler.backend.js.ast.JsExpression; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.descriptors.*; +import org.jetbrains.kotlin.descriptors.impl.SyntheticFieldDescriptor; import org.jetbrains.kotlin.js.translate.context.Namer; import org.jetbrains.kotlin.js.translate.context.TranslationContext; import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils; @@ -103,7 +104,8 @@ public final class ReferenceTranslator { public static AccessTranslator getAccessTranslator(@NotNull JetSimpleNameExpression referenceExpression, @Nullable JsExpression receiver, @NotNull TranslationContext context) { - if (isBackingFieldReference(referenceExpression)) { + if (getDescriptorForReferenceExpression(context.bindingContext(), referenceExpression) instanceof SyntheticFieldDescriptor + || isBackingFieldReference(referenceExpression)) { return BackingFieldAccessTranslator.newInstance(referenceExpression, context); } if (canBePropertyAccess(referenceExpression, context)) { diff --git a/js/js.translator/testData/propertyAccess/cases/field.kt b/js/js.translator/testData/propertyAccess/cases/field.kt new file mode 100644 index 00000000000..f61000dffe8 --- /dev/null +++ b/js/js.translator/testData/propertyAccess/cases/field.kt @@ -0,0 +1,16 @@ +package foo + +class A { + var a: Int = 0 + get() = field + 1 + set(arg) { + field = arg + } +} + +fun box(): String { + val a = A() + a.a = 1 + if (a.a != 2) return "A().a != 2, it: ${a.a}" + return "OK" +} \ No newline at end of file