Skip to content

Commit dde50a3

Browse files
Alexey AndreevAlexey Andreev
Alexey Andreev
authored and
Alexey Andreev
committed
Fix comparison of boolean values in JS BE
See KT-16984
1 parent f5510b8 commit dde50a3

File tree

8 files changed

+42
-18
lines changed

8 files changed

+42
-18
lines changed

compiler/testData/codegen/box/operatorConventions/compareTo/boolean.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
// TODO: muted automatically, investigate should it be ran for JS or not
2-
// IGNORE_BACKEND: JS
3-
41
fun checkLess(x: Boolean, y: Boolean) = when {
52
x >= y -> "Fail $x >= $y"
63
!(x < y) -> "Fail !($x < $y)"

core/descriptors/src/org/jetbrains/kotlin/util/OperatorNameConventions.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ object OperatorNameConventions {
6969
internal val SIMPLE_UNARY_OPERATION_NAMES = setOf(UNARY_PLUS, UNARY_MINUS, NOT)
7070

7171
@JvmField
72-
internal val BINARY_OPERATION_NAMES = setOf(TIMES, PLUS, MINUS, DIV, MOD, REM, RANGE_TO)
72+
val BINARY_OPERATION_NAMES = setOf(TIMES, PLUS, MINUS, DIV, MOD, REM, RANGE_TO)
7373

7474
@JvmField
7575
internal val ASSIGNMENT_OPERATIONS = setOf(TIMES_ASSIGN, DIV_ASSIGN, MOD_ASSIGN, REM_ASSIGN, PLUS_ASSIGN, MINUS_ASSIGN)

js/js.libraries/src/js/misc.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@
1717
Kotlin.compareTo = function (a, b) {
1818
var typeA = typeof a;
1919
var typeB = typeof a;
20-
if (Kotlin.isChar(a) && typeB == "number") {
20+
if (Kotlin.isChar(a) && typeB === "number") {
2121
return Kotlin.primitiveCompareTo(a.charCodeAt(0), b);
2222
}
23-
if (typeA == "number" && Kotlin.isChar(b)) {
23+
if (typeA === "number" && Kotlin.isChar(b)) {
2424
return Kotlin.primitiveCompareTo(a, b.charCodeAt(0));
2525
}
26-
if (typeA == "number" || typeA == "string") {
27-
return a < b ? -1 : a > b ? 1 : 0;
26+
if (typeA === "number" || typeA === "string" || typeA === "boolean") {
27+
return Kotlin.primitiveCompareTo(a, b);
2828
}
2929
return a.compareTo_11rb$(b);
3030
};

js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1882,6 +1882,12 @@ public void testAllFilesPresentInCompareTo() throws Exception {
18821882
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("js/js.translator/testData/box/expression/compareTo"), Pattern.compile("^([^_](.+))\\.kt$"), TargetBackend.JS, true);
18831883
}
18841884

1885+
@TestMetadata("booleanCompareTo.kt")
1886+
public void testBooleanCompareTo() throws Exception {
1887+
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/expression/compareTo/booleanCompareTo.kt");
1888+
doTest(fileName);
1889+
}
1890+
18851891
@TestMetadata("customCompareToMethod.kt")
18861892
public void testCustomCompareToMethod() throws Exception {
18871893
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/expression/compareTo/customCompareToMethod.kt");

js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13222,13 +13222,7 @@ public void testAllFilesPresentInCompareTo() throws Exception {
1322213222
@TestMetadata("boolean.kt")
1322313223
public void testBoolean() throws Exception {
1322413224
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/compareTo/boolean.kt");
13225-
try {
13226-
doTest(fileName);
13227-
}
13228-
catch (Throwable ignore) {
13229-
return;
13230-
}
13231-
throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that.");
13225+
doTest(fileName);
1323213226
}
1323313227

1323413228
@TestMetadata("comparable.kt")

js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/operation/CompareToBOIF.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.js.translate.context.TranslationContext
2626
import org.jetbrains.kotlin.js.translate.operation.OperatorTable
2727
import org.jetbrains.kotlin.js.translate.utils.JsAstUtils
2828
import org.jetbrains.kotlin.js.translate.utils.PsiUtils.getOperationToken
29+
import org.jetbrains.kotlin.lexer.KtSingleValueToken
2930
import org.jetbrains.kotlin.psi.KtBinaryExpression
3031
import org.jetbrains.kotlin.resolve.calls.tasks.isDynamic
3132
import org.jetbrains.kotlin.types.KotlinType
@@ -34,7 +35,7 @@ import org.jetbrains.kotlin.types.expressions.OperatorConventions
3435
object CompareToBOIF : BinaryOperationIntrinsicFactory {
3536
val COMPARE_TO_CHAR = pattern("Int|Short|Byte|Double|Float.compareTo(Char)")
3637
val CHAR_COMPARE_TO = pattern("Char.compareTo(Int|Short|Byte|Double|Float)")
37-
val PRIMITIVE_COMPARE_TO = pattern("Int|Short|Byte|Double|Float|Char|String.compareTo")
38+
val PRIMITIVE_COMPARE_TO = pattern("Int|Short|Byte|Double|Float|Char|String|Boolean.compareTo")
3839

3940
private object CompareToIntrinsic : AbstractBinaryOperationIntrinsic() {
4041
override fun apply(expression: KtBinaryExpression, left: JsExpression, right: JsExpression, context: TranslationContext): JsExpression {
@@ -65,7 +66,7 @@ object CompareToBOIF : BinaryOperationIntrinsicFactory {
6566
}
6667
}
6768

68-
override fun getSupportTokens() = OperatorConventions.COMPARISON_OPERATIONS
69+
override fun getSupportTokens(): Set<KtSingleValueToken> = OperatorConventions.COMPARISON_OPERATIONS
6970

7071
override fun getIntrinsic(descriptor: FunctionDescriptor, leftType: KotlinType?, rightType: KotlinType?): BinaryOperationIntrinsic? {
7172
if (descriptor.isDynamic()) return CompareToIntrinsic

js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/operation/binaryOperationIntrinsics.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ private data class IntrinsicKey(
7676

7777
interface BinaryOperationIntrinsicFactory {
7878

79-
fun getSupportTokens(): ImmutableSet<out KtToken>
79+
fun getSupportTokens(): Set<KtToken>
8080

8181
fun getIntrinsic(descriptor: FunctionDescriptor, leftType: KotlinType?, rightType: KotlinType?): BinaryOperationIntrinsic?
8282
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// EXPECTED_REACHABLE_NODES: 489
2+
fun box(): String {
3+
val r1 = trueFun() > falseFun()
4+
if (!r1) return "fail1"
5+
6+
if (falseFun() > trueFun()) return "fail2"
7+
8+
if (trueFun() > trueFun()) return "fail3"
9+
10+
if (trueFun() < falseFun()) return "fail4"
11+
12+
val x: Comparable<Boolean> = trueFun()
13+
val y: Comparable<Boolean> = falseFun()
14+
15+
if (x.compareTo(false) <= 0) return "fail5"
16+
if (y.compareTo(true) >= 0) return "fail6"
17+
if (y.compareTo(false) != 0) return "fail7"
18+
19+
if ((true).compareTo(false) <= 0) return "fail8"
20+
21+
return "OK"
22+
}
23+
24+
fun trueFun() = true
25+
26+
fun falseFun() = false

0 commit comments

Comments
 (0)