KT-5673: always write val property to backing field

This commit is contained in:
Alexey Tsvetkov
2014-09-22 16:40:30 +04:00
parent b70466f9f3
commit 0af291091e
3 changed files with 42 additions and 4 deletions
@@ -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;
}
}
@@ -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);
@@ -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);