JS backend: add leftJetExpression and rightJetExpression fields into BinaryOperationTranslator

This commit is contained in:
Michael Nedzelsky
2014-08-28 12:55:57 +04:00
parent 24bd6ec7de
commit 2296eeef84
@@ -42,9 +42,6 @@ import static org.jetbrains.k2js.translate.operation.CompareToTranslator.isCompa
import static org.jetbrains.k2js.translate.utils.BindingUtils.getCallableDescriptorForOperationExpression; import static org.jetbrains.k2js.translate.utils.BindingUtils.getCallableDescriptorForOperationExpression;
import static org.jetbrains.k2js.translate.utils.JsAstUtils.not; import static org.jetbrains.k2js.translate.utils.JsAstUtils.not;
import static org.jetbrains.k2js.translate.utils.PsiUtils.*; import static org.jetbrains.k2js.translate.utils.PsiUtils.*;
import static org.jetbrains.k2js.translate.utils.TranslationUtils.translateLeftExpression;
import static org.jetbrains.k2js.translate.utils.TranslationUtils.translateRightExpression;
public final class BinaryOperationTranslator extends AbstractTranslator { public final class BinaryOperationTranslator extends AbstractTranslator {
@@ -65,6 +62,12 @@ public final class BinaryOperationTranslator extends AbstractTranslator {
@NotNull @NotNull
private final JetBinaryExpression expression; private final JetBinaryExpression expression;
@NotNull
private final JetExpression leftJetExpression;
@NotNull
private final JetExpression rightJetExpression;
@Nullable @Nullable
private final CallableDescriptor operationDescriptor; private final CallableDescriptor operationDescriptor;
@@ -72,6 +75,13 @@ public final class BinaryOperationTranslator extends AbstractTranslator {
@NotNull TranslationContext context) { @NotNull TranslationContext context) {
super(context); super(context);
this.expression = expression; this.expression = expression;
assert expression.getLeft() != null : "Binary expression should have a left expression: " + expression.getText();
leftJetExpression = expression.getLeft();
assert expression.getRight() != null : "Binary expression should have a right expression: " + expression.getText();
rightJetExpression = expression.getRight();
this.operationDescriptor = getCallableDescriptorForOperationExpression(bindingContext(), expression); this.operationDescriptor = getCallableDescriptorForOperationExpression(bindingContext(), expression);
} }
@@ -100,10 +110,8 @@ public final class BinaryOperationTranslator extends AbstractTranslator {
@NotNull @NotNull
private JsExpression translateElvis() { private JsExpression translateElvis() {
JsExpression leftExpression = translateLeftExpression(context(), expression); JsExpression leftExpression = Translation.translateAsExpression(leftJetExpression, context());
JetExpression rightJetExpression = expression.getRight();
assert rightJetExpression != null : "Binary expression should have a right expression";
JsBlock rightBlock = new JsBlock(); JsBlock rightBlock = new JsBlock();
JsNode rightNode = Translation.translateExpression(rightJetExpression, context(), rightBlock); JsNode rightNode = Translation.translateExpression(rightJetExpression, context(), rightBlock);
@@ -131,9 +139,10 @@ public final class BinaryOperationTranslator extends AbstractTranslator {
@NotNull @NotNull
private JsExpression applyIntrinsic(@NotNull BinaryOperationIntrinsic intrinsic) { private JsExpression applyIntrinsic(@NotNull BinaryOperationIntrinsic intrinsic) {
JsExpression leftExpression = translateLeftExpression(context(), expression); JsExpression leftExpression = Translation.translateAsExpression(leftJetExpression, context());
JsBlock rightBlock = new JsBlock(); JsBlock rightBlock = new JsBlock();
JsExpression rightExpression = translateRightExpression(context(), expression, rightBlock); JsExpression rightExpression = Translation.translateAsExpression(rightJetExpression, context(), rightBlock);
if (rightBlock.isEmpty()) { if (rightBlock.isEmpty()) {
return intrinsic.apply(expression, leftExpression, rightExpression, context()); return intrinsic.apply(expression, leftExpression, rightExpression, context());
@@ -158,9 +167,9 @@ public final class BinaryOperationTranslator extends AbstractTranslator {
JetToken token = getOperationToken(expression); JetToken token = getOperationToken(expression);
assert OperatorConventions.NOT_OVERLOADABLE.contains(token); assert OperatorConventions.NOT_OVERLOADABLE.contains(token);
JsBinaryOperator operator = OperatorTable.getBinaryOperator(token); JsBinaryOperator operator = OperatorTable.getBinaryOperator(token);
JsExpression leftExpression = translateLeftExpression(context(), expression); JsExpression leftExpression = Translation.translateAsExpression(leftJetExpression, context());
JsBlock rightBlock = new JsBlock(); JsBlock rightBlock = new JsBlock();
JsExpression rightExpression = translateRightExpression(context(), expression, rightBlock); JsExpression rightExpression = Translation.translateAsExpression(rightJetExpression, context(), rightBlock);
if (rightBlock.isEmpty()) { if (rightBlock.isEmpty()) {
return new JsBinaryOperation(operator, leftExpression, rightExpression); return new JsBinaryOperation(operator, leftExpression, rightExpression);
@@ -201,9 +210,9 @@ public final class BinaryOperationTranslator extends AbstractTranslator {
@NotNull @NotNull
private JsExpression getReceiver() { private JsExpression getReceiver() {
if (isInOrNotInOperation(expression)) { if (isInOrNotInOperation(expression)) {
return translateRightExpression(context(), expression); return Translation.translateAsExpression(rightJetExpression, context());
} else { } else {
return translateLeftExpression(context(), expression); return Translation.translateAsExpression(leftJetExpression, context());
} }
} }