Minor in JS backend: save operation token as member of BinaryOperationTranslator.

This commit is contained in:
Zalim Bashorov
2014-12-09 20:55:36 +03:00
parent e378bde43e
commit eadb2d8db5
3 changed files with 19 additions and 22 deletions
@@ -34,7 +34,6 @@ import org.jetbrains.k2js.translate.reference.BackingFieldAccessTranslator;
import static org.jetbrains.k2js.translate.utils.BindingUtils.getDescriptorForReferenceExpression; 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.getSimpleName; 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;
@@ -42,10 +41,8 @@ import static org.jetbrains.k2js.translate.utils.TranslationUtils.translateRight
public abstract class AssignmentTranslator extends AbstractTranslator { public abstract class AssignmentTranslator extends AbstractTranslator {
public static boolean isAssignmentOperator(JetBinaryExpression expression) { public static boolean isAssignmentOperator(JetToken operationToken) {
JetToken operationToken = getOperationToken(expression); return (OperatorConventions.ASSIGNMENT_OPERATIONS.keySet().contains(operationToken) || isAssignment(operationToken));
return (OperatorConventions.ASSIGNMENT_OPERATIONS.keySet().contains(operationToken)
|| isAssignment(operationToken));
} }
@NotNull @NotNull
@@ -69,6 +69,9 @@ public final class BinaryOperationTranslator extends AbstractTranslator {
@NotNull @NotNull
private final JetExpression rightJetExpression; private final JetExpression rightJetExpression;
@NotNull
private final JetToken operationToken;
@Nullable @Nullable
private final CallableDescriptor operationDescriptor; private final CallableDescriptor operationDescriptor;
@@ -83,6 +86,7 @@ public final class BinaryOperationTranslator extends AbstractTranslator {
assert expression.getRight() != null : "Binary expression should have a right expression: " + expression.getText(); assert expression.getRight() != null : "Binary expression should have a right expression: " + expression.getText();
rightJetExpression = expression.getRight(); rightJetExpression = expression.getRight();
this.operationToken = getOperationToken(expression);
this.operationDescriptor = getCallableDescriptorForOperationExpression(bindingContext(), expression); this.operationDescriptor = getCallableDescriptorForOperationExpression(bindingContext(), expression);
} }
@@ -92,16 +96,16 @@ public final class BinaryOperationTranslator extends AbstractTranslator {
if (intrinsic.exists()) { if (intrinsic.exists()) {
return applyIntrinsic(intrinsic); return applyIntrinsic(intrinsic);
} }
if (getOperationToken(expression).equals(JetTokens.ELVIS)) { if (operationToken == JetTokens.ELVIS) {
return translateElvis(); return translateElvis();
} }
if (isAssignmentOperator(expression)) { if (isAssignmentOperator(operationToken)) {
return AssignmentTranslator.translate(expression, context()); return AssignmentTranslator.translate(expression, context());
} }
if (isNotOverloadable()) { if (isNotOverloadable()) {
return translateAsUnOverloadableBinaryOperation(); return translateAsUnOverloadableBinaryOperation();
} }
if (isCompareToCall(expression, context())) { if (isCompareToCall(operationToken, operationDescriptor)) {
return CompareToTranslator.translate(expression, context()); return CompareToTranslator.translate(expression, context());
} }
assert operationDescriptor != null : assert operationDescriptor != null :
@@ -187,14 +191,13 @@ public final class BinaryOperationTranslator extends AbstractTranslator {
} }
private boolean isNotOverloadable() { private boolean isNotOverloadable() {
return operationDescriptor == null; return OperatorConventions.NOT_OVERLOADABLE.contains(operationToken);
} }
@NotNull @NotNull
private JsExpression translateAsUnOverloadableBinaryOperation() { private JsExpression translateAsUnOverloadableBinaryOperation() {
JetToken token = getOperationToken(expression); assert OperatorConventions.NOT_OVERLOADABLE.contains(operationToken);
assert OperatorConventions.NOT_OVERLOADABLE.contains(token); JsBinaryOperator operator = OperatorTable.getBinaryOperator(operationToken);
JsBinaryOperator operator = OperatorTable.getBinaryOperator(token);
JsExpression leftExpression = Translation.translateAsExpression(leftJetExpression, context()); JsExpression leftExpression = Translation.translateAsExpression(leftJetExpression, context());
if (JsAstUtils.isEmptyExpression(leftExpression)) { if (JsAstUtils.isEmptyExpression(leftExpression)) {
return leftExpression; return leftExpression;
@@ -207,8 +210,8 @@ public final class BinaryOperationTranslator extends AbstractTranslator {
return new JsBinaryOperation(operator, leftExpression, rightExpression); return new JsBinaryOperation(operator, leftExpression, rightExpression);
} }
assert token.equals(JetTokens.ANDAND) || token.equals(JetTokens.OROR) : "Unsupported binary operation: " + expression.getText(); assert operationToken.equals(JetTokens.ANDAND) || operationToken.equals(JetTokens.OROR) : "Unsupported binary operation: " + expression.getText();
boolean isOror = token.equals(JetTokens.OROR); boolean isOror = operationToken.equals(JetTokens.OROR);
JsExpression literalResult = isOror ? JsLiteral.TRUE : JsLiteral.FALSE; JsExpression literalResult = isOror ? JsLiteral.TRUE : JsLiteral.FALSE;
leftExpression = isOror ? not(leftExpression) : leftExpression; leftExpression = isOror ? not(leftExpression) : leftExpression;
@@ -20,9 +20,11 @@ import com.google.dart.compiler.backend.js.ast.JsBinaryOperation;
import com.google.dart.compiler.backend.js.ast.JsBinaryOperator; import com.google.dart.compiler.backend.js.ast.JsBinaryOperator;
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.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
import org.jetbrains.jet.lang.psi.JetBinaryExpression; import org.jetbrains.jet.lang.psi.JetBinaryExpression;
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.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;
@@ -34,15 +36,10 @@ import static org.jetbrains.k2js.translate.utils.PsiUtils.getOperationToken;
public final class CompareToTranslator extends AbstractTranslator { public final class CompareToTranslator extends AbstractTranslator {
public static boolean isCompareToCall( public static boolean isCompareToCall(
@NotNull JetBinaryExpression expression, @NotNull JetToken operationToken,
@NotNull TranslationContext context @Nullable CallableDescriptor operationDescriptor
) { ) {
if (!OperatorConventions.COMPARISON_OPERATIONS.contains(getOperationToken(expression))) return false; if (!OperatorConventions.COMPARISON_OPERATIONS.contains(operationToken) || operationDescriptor == null) return false;
CallableDescriptor operationDescriptor =
getCallableDescriptorForOperationExpression(context.bindingContext(), expression);
if (operationDescriptor == null) return false;
return isCompareTo(operationDescriptor); return isCompareTo(operationDescriptor);
} }