KT-5673: always write val property to backing field
This commit is contained in:
+28
-1
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+1
-3
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user