From e1233beddc5029da12c3d4566a2c74815d444f8f Mon Sep 17 00:00:00 2001 From: Anton Bannykh Date: Wed, 21 Mar 2018 12:55:17 +0300 Subject: [PATCH] Convert BinaryOperationIntrinsic to Java @FunctionInterface Also some minor renamings and visibility changes --- .../operation/BinaryOperationIntrinsic.java | 22 +++++++++++++++++++ .../intrinsic/operation/CompareToBOIF.kt | 4 ++-- .../intrinsic/operation/EqualsBOIF.kt | 6 ++--- .../operation/binaryOperationIntrinsics.kt | 9 +++----- .../operation/BinaryOperationTranslator.java | 4 ++-- .../IntrinsicAssignmentTranslator.java | 2 -- .../js/translate/utils/TranslationUtils.java | 2 +- 7 files changed, 33 insertions(+), 16 deletions(-) create mode 100644 js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/operation/BinaryOperationIntrinsic.java diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/operation/BinaryOperationIntrinsic.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/operation/BinaryOperationIntrinsic.java new file mode 100644 index 00000000000..07c4b5adab6 --- /dev/null +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/operation/BinaryOperationIntrinsic.java @@ -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 + ); +} diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/operation/CompareToBOIF.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/operation/CompareToBOIF.kt index 02b7c3b5cea..58f3e794318 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/operation/CompareToBOIF.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/operation/CompareToBOIF.kt @@ -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) }) } } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/operation/EqualsBOIF.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/operation/EqualsBOIF.kt index 4de7d7e8265..8e0451ddbf9 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/operation/EqualsBOIF.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/operation/EqualsBOIF.kt @@ -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) diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/operation/binaryOperationIntrinsics.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/operation/binaryOperationIntrinsics.kt index 2a07da818b9..09fce1933a6 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/operation/binaryOperationIntrinsics.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/operation/binaryOperationIntrinsics.kt @@ -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 = diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/BinaryOperationTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/BinaryOperationTranslator.java index d16ef6b9591..644541e9ed6 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/BinaryOperationTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/BinaryOperationTranslator.java @@ -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 intrinsic = + BinaryOperationIntrinsic intrinsic = context().intrinsics().getBinaryOperationIntrinsic(expression, context()); if (intrinsic == null) return null; diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/IntrinsicAssignmentTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/IntrinsicAssignmentTranslator.java index deda273fb6e..41718b774dd 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/IntrinsicAssignmentTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/IntrinsicAssignmentTranslator.java @@ -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); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TranslationUtils.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TranslationUtils.java index 12380331e5a..f8be78fa7fd 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TranslationUtils.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TranslationUtils.java @@ -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));