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.JsBlock;
|
||||||
import com.google.dart.compiler.backend.js.ast.JsExpression;
|
import com.google.dart.compiler.backend.js.ast.JsExpression;
|
||||||
import org.jetbrains.annotations.NotNull;
|
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.JetBinaryExpression;
|
||||||
import org.jetbrains.jet.lang.psi.JetExpression;
|
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.lang.types.expressions.OperatorConventions;
|
||||||
import org.jetbrains.jet.lexer.JetToken;
|
import org.jetbrains.jet.lexer.JetToken;
|
||||||
import org.jetbrains.k2js.translate.context.TranslationContext;
|
import org.jetbrains.k2js.translate.context.TranslationContext;
|
||||||
import org.jetbrains.k2js.translate.general.AbstractTranslator;
|
import org.jetbrains.k2js.translate.general.AbstractTranslator;
|
||||||
import org.jetbrains.k2js.translate.reference.AccessTranslationUtils;
|
import org.jetbrains.k2js.translate.reference.AccessTranslationUtils;
|
||||||
import org.jetbrains.k2js.translate.reference.AccessTranslator;
|
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.BindingUtils.isVariableReassignment;
|
||||||
import static org.jetbrains.k2js.translate.utils.PsiUtils.getOperationToken;
|
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.PsiUtils.isAssignment;
|
||||||
import static org.jetbrains.k2js.translate.utils.TranslationUtils.hasCorrespondingFunctionIntrinsic;
|
import static org.jetbrains.k2js.translate.utils.TranslationUtils.hasCorrespondingFunctionIntrinsic;
|
||||||
import static org.jetbrains.k2js.translate.utils.TranslationUtils.translateRightExpression;
|
import static org.jetbrains.k2js.translate.utils.TranslationUtils.translateRightExpression;
|
||||||
@@ -69,7 +75,28 @@ public abstract class AssignmentTranslator extends AbstractTranslator {
|
|||||||
JsBlock rightBlock = new JsBlock();
|
JsBlock rightBlock = new JsBlock();
|
||||||
this.right = translateRightExpression(context, expression, rightBlock);
|
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);
|
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.annotations.NotNull;
|
||||||
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
|
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
|
||||||
import org.jetbrains.jet.lang.psi.JetPsiUtil;
|
|
||||||
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression;
|
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression;
|
||||||
import org.jetbrains.k2js.translate.context.TemporaryVariable;
|
import org.jetbrains.k2js.translate.context.TemporaryVariable;
|
||||||
import org.jetbrains.k2js.translate.context.TranslationContext;
|
import org.jetbrains.k2js.translate.context.TranslationContext;
|
||||||
@@ -39,9 +38,8 @@ public final class BackingFieldAccessTranslator extends AbstractTranslator imple
|
|||||||
private final PropertyDescriptor descriptor;
|
private final PropertyDescriptor descriptor;
|
||||||
|
|
||||||
/*package*/
|
/*package*/
|
||||||
static BackingFieldAccessTranslator newInstance(@NotNull JetSimpleNameExpression expression,
|
public static BackingFieldAccessTranslator newInstance(@NotNull JetSimpleNameExpression expression,
|
||||||
@NotNull TranslationContext context) {
|
@NotNull TranslationContext context) {
|
||||||
assert JetPsiUtil.isBackingFieldReference(expression);
|
|
||||||
DeclarationDescriptor referencedProperty = getDescriptorForReferenceExpression(context.bindingContext(), expression);
|
DeclarationDescriptor referencedProperty = getDescriptorForReferenceExpression(context.bindingContext(), expression);
|
||||||
assert referencedProperty instanceof PropertyDescriptor;
|
assert referencedProperty instanceof PropertyDescriptor;
|
||||||
return new BackingFieldAccessTranslator((PropertyDescriptor) referencedProperty, context);
|
return new BackingFieldAccessTranslator((PropertyDescriptor) referencedProperty, context);
|
||||||
|
|||||||
@@ -31,6 +31,19 @@ public final class PsiUtils {
|
|||||||
private 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
|
@Nullable
|
||||||
public static JetSimpleNameExpression getSelectorAsSimpleName(@NotNull JetQualifiedExpression expression) {
|
public static JetSimpleNameExpression getSelectorAsSimpleName(@NotNull JetQualifiedExpression expression) {
|
||||||
JetExpression selectorExpression = getSelector(expression);
|
JetExpression selectorExpression = getSelector(expression);
|
||||||
|
|||||||
Reference in New Issue
Block a user