Minor in JS backend: save operation token as member of BinaryOperationTranslator.
This commit is contained in:
+2
-5
@@ -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
|
||||||
|
|||||||
+12
-9
@@ -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;
|
||||||
|
|
||||||
|
|||||||
+5
-8
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user