Enhanced logic in EqualsIntrinsic.
Adapted from https://github.com/develar/kotlin/commit/a9e0a42fb1347fa8e21c86b5a073ef8a7c873da0.
This commit is contained in:
+18
@@ -16,16 +16,22 @@
|
|||||||
|
|
||||||
package org.jetbrains.k2js.translate.intrinsic.operation;
|
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.JsExpression;
|
||||||
|
import com.google.dart.compiler.backend.js.ast.JsLiteral;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
|
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
|
||||||
import org.jetbrains.jet.lang.psi.JetBinaryExpression;
|
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.lang.types.expressions.OperatorConventions;
|
||||||
import org.jetbrains.jet.lexer.JetTokens;
|
import org.jetbrains.jet.lexer.JetTokens;
|
||||||
import org.jetbrains.k2js.translate.context.TranslationContext;
|
import org.jetbrains.k2js.translate.context.TranslationContext;
|
||||||
import org.jetbrains.k2js.translate.intrinsic.functions.factories.TopLevelFIF;
|
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.JsAstUtils;
|
||||||
import org.jetbrains.k2js.translate.utils.JsDescriptorUtils;
|
import org.jetbrains.k2js.translate.utils.JsDescriptorUtils;
|
||||||
|
import org.jetbrains.k2js.translate.utils.TranslationUtils;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
@@ -54,7 +60,19 @@ public final class EqualsIntrinsic implements BinaryOperationIntrinsic {
|
|||||||
@NotNull JsExpression right,
|
@NotNull JsExpression right,
|
||||||
@NotNull TranslationContext context) {
|
@NotNull TranslationContext context) {
|
||||||
boolean isNegated = getOperationToken(expression).equals(JetTokens.EXCLEQ);
|
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);
|
JsExpression result = TopLevelFIF.EQUALS.apply(left, Arrays.asList(right), context);
|
||||||
return isNegated ? JsAstUtils.negated(result) : result;
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user