From fe9a2b6e5edc22d9a961b52242dcaec0f4a600af Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Mon, 13 Aug 2012 15:47:16 +0400 Subject: [PATCH] Enhanced logic in EqualsIntrinsic. Adapted from https://github.com/develar/kotlin/commit/a9e0a42fb1347fa8e21c86b5a073ef8a7c873da0. --- .../intrinsic/operation/EqualsIntrinsic.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/operation/EqualsIntrinsic.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/operation/EqualsIntrinsic.java index 5f53c13acb6..934e048dcbe 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/operation/EqualsIntrinsic.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/operation/EqualsIntrinsic.java @@ -16,16 +16,22 @@ package org.jetbrains.k2js.translate.intrinsic.operation; +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.JsExpression; +import com.google.dart.compiler.backend.js.ast.JsLiteral; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.lang.psi.JetBinaryExpression; +import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.types.expressions.OperatorConventions; import org.jetbrains.jet.lexer.JetTokens; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.intrinsic.functions.factories.TopLevelFIF; +import org.jetbrains.k2js.translate.intrinsic.functions.patterns.NamePredicate; import org.jetbrains.k2js.translate.utils.JsAstUtils; import org.jetbrains.k2js.translate.utils.JsDescriptorUtils; +import org.jetbrains.k2js.translate.utils.TranslationUtils; import java.util.Arrays; @@ -54,7 +60,19 @@ public final class EqualsIntrinsic implements BinaryOperationIntrinsic { @NotNull JsExpression right, @NotNull TranslationContext context) { boolean isNegated = getOperationToken(expression).equals(JetTokens.EXCLEQ); + if (right == JsLiteral.NULL || left == JsLiteral.NULL) { + return TranslationUtils.nullCheck(right == JsLiteral.NULL ? left : right, isNegated); + } + else if (canUseSimpleEquals(expression, context)) { + return new JsBinaryOperation(isNegated ? JsBinaryOperator.REF_NEQ : JsBinaryOperator.REF_EQ, left, right); + } + JsExpression result = TopLevelFIF.EQUALS.apply(left, Arrays.asList(right), context); return isNegated ? JsAstUtils.negated(result) : result; } + + private static boolean canUseSimpleEquals(@NotNull JetBinaryExpression expression, @NotNull TranslationContext context) { + Name typeName = JsDescriptorUtils.getNameIfStandardType(expression.getLeft(), context); + return typeName != null && NamePredicate.PRIMITIVE_NUMBERS.apply(typeName); + } }