From 3f0c1b26458bd0f6f31fb1fd90c3fe63071b2393 Mon Sep 17 00:00:00 2001 From: develar Date: Tue, 20 Aug 2013 15:47:56 +0400 Subject: [PATCH] JS backend: elvis operator must compare value with undefined. (cherry picked from commit 3978a8e) --- .../operation/BinaryOperationTranslator.java | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java index 2d3595a748b..c240882a5db 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java @@ -30,7 +30,7 @@ import org.jetbrains.k2js.translate.general.AbstractTranslator; import org.jetbrains.k2js.translate.intrinsic.operation.BinaryOperationIntrinsic; import org.jetbrains.k2js.translate.reference.CallBuilder; 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.CompareToTranslator.isCompareToCall; @@ -76,8 +76,9 @@ public final class BinaryOperationTranslator extends AbstractTranslator { if (intrinsic != null) { return applyIntrinsic(intrinsic); } - if (isElvisOperator(expression)) { - return translateAsElvisOperator(expression); + if (getOperationToken(expression).equals(JetTokens.ELVIS)) { + return TranslationUtils.notNullConditional(translateLeftExpression(context(), expression), + translateRightExpression(context(), expression), context()); } if (isAssignmentOperator(expression)) { return AssignmentTranslator.translate(expression, context()); @@ -106,19 +107,6 @@ public final class BinaryOperationTranslator extends AbstractTranslator { 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() { return operationDescriptor == null; }