JS backend: elvis operator must compare value with undefined.
(cherry picked from commit 3978a8e)
This commit is contained in:
+4
-16
@@ -30,7 +30,7 @@ import org.jetbrains.k2js.translate.general.AbstractTranslator;
|
|||||||
import org.jetbrains.k2js.translate.intrinsic.operation.BinaryOperationIntrinsic;
|
import org.jetbrains.k2js.translate.intrinsic.operation.BinaryOperationIntrinsic;
|
||||||
import org.jetbrains.k2js.translate.reference.CallBuilder;
|
import org.jetbrains.k2js.translate.reference.CallBuilder;
|
||||||
import org.jetbrains.k2js.translate.reference.CallType;
|
import org.jetbrains.k2js.translate.reference.CallType;
|
||||||
import org.jetbrains.k2js.translate.utils.JsAstUtils;
|
import org.jetbrains.k2js.translate.utils.TranslationUtils;
|
||||||
|
|
||||||
import static org.jetbrains.k2js.translate.operation.AssignmentTranslator.isAssignmentOperator;
|
import static org.jetbrains.k2js.translate.operation.AssignmentTranslator.isAssignmentOperator;
|
||||||
import static org.jetbrains.k2js.translate.operation.CompareToTranslator.isCompareToCall;
|
import static org.jetbrains.k2js.translate.operation.CompareToTranslator.isCompareToCall;
|
||||||
@@ -76,8 +76,9 @@ public final class BinaryOperationTranslator extends AbstractTranslator {
|
|||||||
if (intrinsic != null) {
|
if (intrinsic != null) {
|
||||||
return applyIntrinsic(intrinsic);
|
return applyIntrinsic(intrinsic);
|
||||||
}
|
}
|
||||||
if (isElvisOperator(expression)) {
|
if (getOperationToken(expression).equals(JetTokens.ELVIS)) {
|
||||||
return translateAsElvisOperator(expression);
|
return TranslationUtils.notNullConditional(translateLeftExpression(context(), expression),
|
||||||
|
translateRightExpression(context(), expression), context());
|
||||||
}
|
}
|
||||||
if (isAssignmentOperator(expression)) {
|
if (isAssignmentOperator(expression)) {
|
||||||
return AssignmentTranslator.translate(expression, context());
|
return AssignmentTranslator.translate(expression, context());
|
||||||
@@ -106,19 +107,6 @@ public final class BinaryOperationTranslator extends AbstractTranslator {
|
|||||||
context());
|
context());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isElvisOperator(@NotNull JetBinaryExpression expression) {
|
|
||||||
return getOperationToken(expression).equals(JetTokens.ELVIS);
|
|
||||||
}
|
|
||||||
|
|
||||||
//TODO: use some generic mechanism
|
|
||||||
@NotNull
|
|
||||||
private JsExpression translateAsElvisOperator(@NotNull JetBinaryExpression expression) {
|
|
||||||
JsExpression translatedLeft = translateLeftExpression(context(), expression);
|
|
||||||
JsExpression translatedRight = translateRightExpression(context(), expression);
|
|
||||||
JsBinaryOperation leftIsNotNull = JsAstUtils.inequality(translatedLeft, JsLiteral.NULL);
|
|
||||||
return new JsConditional(leftIsNotNull, translatedLeft, translatedRight);
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isNotOverloadable() {
|
private boolean isNotOverloadable() {
|
||||||
return operationDescriptor == null;
|
return operationDescriptor == null;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user