Convert BinaryOperationIntrinsic to Java @FunctionInterface
Also some minor renamings and visibility changes
This commit is contained in:
+22
@@ -0,0 +1,22 @@
|
||||
/*
|
||||
* Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.js.translate.intrinsic.operation;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.kotlin.js.backend.ast.JsExpression;
|
||||
import org.jetbrains.kotlin.js.translate.context.TranslationContext;
|
||||
import org.jetbrains.kotlin.psi.KtBinaryExpression;
|
||||
|
||||
@FunctionalInterface
|
||||
public interface BinaryOperationIntrinsic {
|
||||
@NotNull
|
||||
JsExpression invoke(
|
||||
@NotNull KtBinaryExpression expression,
|
||||
@NotNull JsExpression left,
|
||||
@NotNull JsExpression right,
|
||||
@NotNull TranslationContext context
|
||||
);
|
||||
}
|
||||
+2
-2
@@ -35,7 +35,7 @@ object CompareToBOIF : BinaryOperationIntrinsicFactory {
|
||||
pattern("Int|Short|Byte|Float|Double.compareTo(Long)") to binaryIntrinsic(toRight = { r, _ -> longToNumber(r) }),
|
||||
pattern("Long.compareTo(Int|Short|Byte|Float|Double)") to binaryIntrinsic(toLeft = { l, _ -> longToNumber(l) }),
|
||||
// L.compareTo(R) OP 0
|
||||
pattern("Long.compareTo(Long)") to intrinsic({ l, r, _ -> compareForObject(l, r) }, { _, _, _-> JsIntLiteral(0) })
|
||||
pattern("Long.compareTo(Long)") to complexBinaryIntrinsic({ l, r, _ -> compareForObject(l, r) }, { _, _, _-> JsIntLiteral(0) })
|
||||
)
|
||||
|
||||
override fun getIntrinsic(descriptor: FunctionDescriptor, leftType: KotlinType?, rightType: KotlinType?): BinaryOperationIntrinsic? {
|
||||
@@ -50,7 +50,7 @@ object CompareToBOIF : BinaryOperationIntrinsicFactory {
|
||||
binaryIntrinsic(coerceTo(leftType), coerceTo(rightType))
|
||||
} else {
|
||||
// Kotlin.compareTo(L, R) OP 0
|
||||
intrinsic({ l, r, _ -> compareTo(l, r) }, { _, _, _ -> JsIntLiteral(0) })
|
||||
complexBinaryIntrinsic({ l, r, _ -> compareTo(l, r) }, { _, _, _ -> JsIntLiteral(0) })
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+3
-3
@@ -36,12 +36,12 @@ import org.jetbrains.kotlin.types.isDynamic
|
||||
object EqualsBOIF : BinaryOperationIntrinsicFactory {
|
||||
override fun getSupportTokens() = OperatorConventions.EQUALS_OPERATIONS!!
|
||||
|
||||
private val equalsNullIntrinsic: BinaryOperationIntrinsic = { expression, left, right, context ->
|
||||
private val equalsNullIntrinsic = BinaryOperationIntrinsic { expression, left, right, context ->
|
||||
val (subject, ktSubject) = if (right is JsNullLiteral) Pair(left, expression.left!!) else Pair(right, expression.right!!)
|
||||
TranslationUtils.nullCheck(ktSubject, subject, context, isNegatedOperation(expression))
|
||||
}
|
||||
|
||||
private val kotlinEqualsIntrinsic: BinaryOperationIntrinsic = { expression, left, right, context ->
|
||||
private val kotlinEqualsIntrinsic = BinaryOperationIntrinsic { expression, left, right, context ->
|
||||
val coercedLeft = TranslationUtils.coerce(context, left, context.currentModule.builtIns.anyType)
|
||||
val coercedRight = TranslationUtils.coerce(context, right, context.currentModule.builtIns.anyType)
|
||||
val result = TopLevelFIF.KOTLIN_EQUALS.apply(coercedLeft, listOf(coercedRight), context)
|
||||
@@ -103,7 +103,7 @@ object EqualsBOIF : BinaryOperationIntrinsicFactory {
|
||||
|
||||
isEnumEqualsIntrinsicApplicable(descriptor, leftType, rightType) -> refEqIntrinsic
|
||||
|
||||
KotlinBuiltIns.isBuiltIn(descriptor) || TopLevelFIF.EQUALS_IN_ANY.test(descriptor) -> { expression, left, right, context ->
|
||||
KotlinBuiltIns.isBuiltIn(descriptor) || TopLevelFIF.EQUALS_IN_ANY.test(descriptor) -> BinaryOperationIntrinsic { expression, left, right, context ->
|
||||
when {
|
||||
left is JsNullLiteral || right is JsNullLiteral -> equalsNullIntrinsic
|
||||
leftType.primitive && rightType.primitive -> primitiveTypes(leftType, rightType)
|
||||
|
||||
+3
-6
@@ -32,9 +32,6 @@ import org.jetbrains.kotlin.psi.KtBinaryExpression
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult
|
||||
|
||||
typealias BinaryOperationIntrinsic
|
||||
= (expression: KtBinaryExpression, left: JsExpression, right: JsExpression, context: TranslationContext) -> JsExpression
|
||||
|
||||
class BinaryOperationIntrinsics {
|
||||
|
||||
private data class IntrinsicKey(
|
||||
@@ -95,11 +92,11 @@ typealias OperatorSelector = (KtBinaryExpression) -> JsBinaryOperator
|
||||
val defaultOperatorSelector: OperatorSelector = { OperatorTable.getBinaryOperator(getOperationToken(it)) }
|
||||
|
||||
// toLeft(L, R) OP toRight(L, R)
|
||||
fun intrinsic(
|
||||
fun complexBinaryIntrinsic(
|
||||
toLeft: (JsExpression, JsExpression, TranslationContext) -> JsExpression,
|
||||
toRight: (JsExpression, JsExpression, TranslationContext) -> JsExpression,
|
||||
operator: (KtBinaryExpression) -> JsBinaryOperator = defaultOperatorSelector
|
||||
): BinaryOperationIntrinsic = { expression, left, right, context ->
|
||||
) = BinaryOperationIntrinsic { expression, left, right, context ->
|
||||
JsBinaryOperation(operator(expression), toLeft(left, right, context), toRight(left, right, context))
|
||||
}
|
||||
|
||||
@@ -108,7 +105,7 @@ fun binaryIntrinsic(
|
||||
toLeft: (JsExpression, TranslationContext) -> JsExpression = { l, _ -> l },
|
||||
toRight: (JsExpression, TranslationContext) -> JsExpression = { r, _ -> r },
|
||||
operator: OperatorSelector = defaultOperatorSelector
|
||||
): BinaryOperationIntrinsic = intrinsic({ l, _, c -> toLeft(l, c) }, { _, r, c -> toRight(r, c) }, operator)
|
||||
) = complexBinaryIntrinsic({ l, _, c -> toLeft(l, c) }, { _, r, c -> toRight(r, c) }, operator)
|
||||
|
||||
|
||||
fun coerceTo(type: KotlinType): (JsExpression, TranslationContext) -> JsExpression =
|
||||
|
||||
+2
-2
@@ -16,7 +16,6 @@
|
||||
|
||||
package org.jetbrains.kotlin.js.translate.operation;
|
||||
|
||||
import kotlin.jvm.functions.Function4;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor;
|
||||
@@ -28,6 +27,7 @@ import org.jetbrains.kotlin.js.translate.context.TranslationContext;
|
||||
import org.jetbrains.kotlin.js.translate.general.AbstractTranslator;
|
||||
import org.jetbrains.kotlin.js.translate.general.Translation;
|
||||
import org.jetbrains.kotlin.js.translate.intrinsic.functions.factories.TopLevelFIF;
|
||||
import org.jetbrains.kotlin.js.translate.intrinsic.operation.BinaryOperationIntrinsic;
|
||||
import org.jetbrains.kotlin.js.translate.utils.JsAstUtils;
|
||||
import org.jetbrains.kotlin.js.translate.utils.TranslationUtils;
|
||||
import org.jetbrains.kotlin.lexer.KtToken;
|
||||
@@ -160,7 +160,7 @@ public final class BinaryOperationTranslator extends AbstractTranslator {
|
||||
|
||||
@Nullable
|
||||
private JsExpression tryApplyIntrinsic() {
|
||||
Function4<KtBinaryExpression, JsExpression, JsExpression, TranslationContext, JsExpression> intrinsic =
|
||||
BinaryOperationIntrinsic intrinsic =
|
||||
context().intrinsics().getBinaryOperationIntrinsic(expression, context());
|
||||
|
||||
if (intrinsic == null) return null;
|
||||
|
||||
-2
@@ -35,7 +35,6 @@ import org.jetbrains.kotlin.types.expressions.OperatorConventions;
|
||||
|
||||
import static org.jetbrains.kotlin.js.translate.utils.PsiUtils.getOperationToken;
|
||||
import static org.jetbrains.kotlin.js.translate.utils.PsiUtils.isAssignment;
|
||||
import static org.jetbrains.kotlin.js.translate.utils.TranslationUtils.coerce;
|
||||
import static org.jetbrains.kotlin.js.translate.utils.TranslationUtils.isSimpleNameExpressionNotDelegatedLocalVar;
|
||||
|
||||
public final class IntrinsicAssignmentTranslator extends AssignmentTranslator {
|
||||
@@ -63,7 +62,6 @@ public final class IntrinsicAssignmentTranslator extends AssignmentTranslator {
|
||||
JsExpression result = TranslationUtils.translateRightExpression(context, expression, rightBlock);
|
||||
KotlinType leftType = context.bindingContext().getType(expression.getLeft());
|
||||
KotlinType rightType = context.bindingContext().getType(expression.getRight());
|
||||
|
||||
if (rightType != null && KotlinBuiltIns.isCharOrNullableChar(rightType)) {
|
||||
if (leftType != null && KotlinBuiltIns.isStringOrNullableString(leftType)) {
|
||||
result = JsAstUtils.charToString(result);
|
||||
|
||||
@@ -526,7 +526,7 @@ public final class TranslationUtils {
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static JsExpression voidToUnit(@NotNull TranslationContext context, @NotNull JsExpression expression) {
|
||||
private static JsExpression voidToUnit(@NotNull TranslationContext context, @NotNull JsExpression expression) {
|
||||
ClassDescriptor unit = context.getCurrentModule().getBuiltIns().getUnit();
|
||||
JsExpression unitRef = ReferenceTranslator.translateAsValueReference(unit, context);
|
||||
return JsAstUtils.newSequence(Arrays.asList(expression, unitRef));
|
||||
|
||||
Reference in New Issue
Block a user