From 0af291091ea31d7493ceb961f4a7f87c4bd5f65f Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Mon, 22 Sep 2014 16:40:30 +0400 Subject: [PATCH] KT-5673: always write val property to backing field --- .../operation/AssignmentTranslator.java | 29 ++++++++++++++++++- .../BackingFieldAccessTranslator.java | 4 +-- .../k2js/translate/utils/PsiUtils.java | 13 +++++++++ 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/operation/AssignmentTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/operation/AssignmentTranslator.java index 6139320cfd1..8335546e0c5 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/operation/AssignmentTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/operation/AssignmentTranslator.java @@ -19,17 +19,23 @@ package org.jetbrains.k2js.translate.operation; import com.google.dart.compiler.backend.js.ast.JsBlock; import com.google.dart.compiler.backend.js.ast.JsExpression; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; +import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; import org.jetbrains.jet.lang.psi.JetBinaryExpression; import org.jetbrains.jet.lang.psi.JetExpression; +import org.jetbrains.jet.lang.psi.JetSimpleNameExpression; import org.jetbrains.jet.lang.types.expressions.OperatorConventions; import org.jetbrains.jet.lexer.JetToken; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.general.AbstractTranslator; import org.jetbrains.k2js.translate.reference.AccessTranslationUtils; import org.jetbrains.k2js.translate.reference.AccessTranslator; +import org.jetbrains.k2js.translate.reference.BackingFieldAccessTranslator; +import static org.jetbrains.k2js.translate.utils.BindingUtils.getDescriptorForReferenceExpression; import static org.jetbrains.k2js.translate.utils.BindingUtils.isVariableReassignment; import static org.jetbrains.k2js.translate.utils.PsiUtils.getOperationToken; +import static org.jetbrains.k2js.translate.utils.PsiUtils.getSimpleName; import static org.jetbrains.k2js.translate.utils.PsiUtils.isAssignment; import static org.jetbrains.k2js.translate.utils.TranslationUtils.hasCorrespondingFunctionIntrinsic; import static org.jetbrains.k2js.translate.utils.TranslationUtils.translateRightExpression; @@ -69,7 +75,28 @@ public abstract class AssignmentTranslator extends AbstractTranslator { JsBlock rightBlock = new JsBlock(); this.right = translateRightExpression(context, expression, rightBlock); - this.accessTranslator = AccessTranslationUtils.getAccessTranslator(left, context(), !rightBlock.isEmpty()); + if (isValProperty(left, context)) { + JetSimpleNameExpression simpleName = getSimpleName(left); + assert simpleName != null; + this.accessTranslator = BackingFieldAccessTranslator.newInstance(simpleName, context); + } else { + this.accessTranslator = AccessTranslationUtils.getAccessTranslator(left, context(), !rightBlock.isEmpty()); + } + context.addStatementsToCurrentBlockFrom(rightBlock); } + + private static boolean isValProperty( + @NotNull JetExpression expression, + @NotNull TranslationContext context + ) { + JetSimpleNameExpression simpleNameExpression = getSimpleName(expression); + + if (simpleNameExpression != null) { + DeclarationDescriptor descriptor = getDescriptorForReferenceExpression(context.bindingContext(), simpleNameExpression); + return descriptor instanceof PropertyDescriptor && !((PropertyDescriptor) descriptor).isVar(); + } + + return false; + } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/BackingFieldAccessTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/BackingFieldAccessTranslator.java index 561f3753480..628a8818ae0 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/reference/BackingFieldAccessTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/reference/BackingFieldAccessTranslator.java @@ -20,7 +20,6 @@ import com.google.dart.compiler.backend.js.ast.JsExpression; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; -import org.jetbrains.jet.lang.psi.JetPsiUtil; import org.jetbrains.jet.lang.psi.JetSimpleNameExpression; import org.jetbrains.k2js.translate.context.TemporaryVariable; import org.jetbrains.k2js.translate.context.TranslationContext; @@ -39,9 +38,8 @@ public final class BackingFieldAccessTranslator extends AbstractTranslator imple private final PropertyDescriptor descriptor; /*package*/ - static BackingFieldAccessTranslator newInstance(@NotNull JetSimpleNameExpression expression, + public static BackingFieldAccessTranslator newInstance(@NotNull JetSimpleNameExpression expression, @NotNull TranslationContext context) { - assert JetPsiUtil.isBackingFieldReference(expression); DeclarationDescriptor referencedProperty = getDescriptorForReferenceExpression(context.bindingContext(), expression); assert referencedProperty instanceof PropertyDescriptor; return new BackingFieldAccessTranslator((PropertyDescriptor) referencedProperty, context); diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/PsiUtils.java b/js/js.translator/src/org/jetbrains/k2js/translate/utils/PsiUtils.java index 7db083379db..9cd77a57547 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/utils/PsiUtils.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/PsiUtils.java @@ -31,6 +31,19 @@ public final class PsiUtils { private PsiUtils() { } + @Nullable + public static JetSimpleNameExpression getSimpleName(@NotNull JetExpression expression) { + if (expression instanceof JetSimpleNameExpression) { + return (JetSimpleNameExpression) expression; + } + + if (expression instanceof JetQualifiedExpression) { + return getSelectorAsSimpleName((JetQualifiedExpression) expression); + } + + return null; + } + @Nullable public static JetSimpleNameExpression getSelectorAsSimpleName(@NotNull JetQualifiedExpression expression) { JetExpression selectorExpression = getSelector(expression);