Initial version of RangeContainsLowering, which optimizes calls to
contains() on ClosedRanges.
This commit is contained in:
committed by
Alexander Udalov
parent
ca541337d1
commit
1c1b1b4b0f
@@ -1,5 +1,6 @@
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
// WITH_RUNTIME
|
||||
import kotlin.test.*
|
||||
|
||||
var order = StringBuilder()
|
||||
|
||||
@@ -25,8 +26,32 @@ fun x(i: Int): Int {
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
expectOrder("0 in 1 .. 3", "HLX") { x(0) in high(3) downTo low(1) }
|
||||
expectOrder("0 !in 1 .. 3", "HLX") { x(0) !in high(3) downTo low(1) }
|
||||
expectOrder("x(0) in high(3) downTo low(1)", "HLX") { assertFalse(x(0) in high(3) downTo low(1)) }
|
||||
expectOrder("0 in high(3) downTo low(1)", "HL") { assertFalse(0 in high(3) downTo low(1)) }
|
||||
expectOrder("x(0) in high(3) downTo 1", "HX") { assertFalse(x(0) in high(3) downTo 1) }
|
||||
expectOrder("x(0) in 3 downTo low(1)", "LX") { assertFalse(x(0) in 3 downTo low(1)) }
|
||||
expectOrder("x(0) !in high(3) downTo low(1)", "HLX") { assertTrue(x(0) !in high(3) downTo low(1)) }
|
||||
expectOrder("0 !in high(3) downTo low(1)", "HL") { assertTrue(0 !in high(3) downTo low(1)) }
|
||||
expectOrder("x(0) !in high(3) downTo 1", "HX") { assertTrue(x(0) !in high(3) downTo 1) }
|
||||
expectOrder("x(0) !in 3 downTo low(1)", "LX") { assertTrue(x(0) !in 3 downTo low(1)) }
|
||||
|
||||
expectOrder("x(4) in high(3) downTo low(1)", "HLX") { assertFalse(x(4) in high(3) downTo low(1)) }
|
||||
expectOrder("4 in high(3) downTo low(1)", "HL") { assertFalse(4 in high(3) downTo low(1)) }
|
||||
expectOrder("x(4) in high(3) downTo 1", "HX") { assertFalse(x(4) in high(3) downTo 1) }
|
||||
expectOrder("x(4) in 3 downTo low(1)", "LX") { assertFalse(x(4) in 3 downTo low(1)) }
|
||||
expectOrder("x(4) !in high(3) downTo low(1)", "HLX") { assertTrue(x(4) !in high(3) downTo low(1)) }
|
||||
expectOrder("4 !in high(3) downTo low(1)", "HL") { assertTrue(4 !in high(3) downTo low(1)) }
|
||||
expectOrder("x(4) !in high(3) downTo 1", "HX") { assertTrue(x(4) !in high(3) downTo 1) }
|
||||
expectOrder("x(4) !in 3 downTo low(1)", "LX") { assertTrue(x(4) !in 3 downTo low(1)) }
|
||||
|
||||
expectOrder("x(2) in high(3) downTo low(1)", "HLX") { assertTrue(x(2) in high(3) downTo low(1)) }
|
||||
expectOrder("2 in high(3) downTo low(1)", "HL") { assertTrue(2 in high(3) downTo low(1)) }
|
||||
expectOrder("x(2) in high(3) downTo 1", "HX") { assertTrue(x(2) in high(3) downTo 1) }
|
||||
expectOrder("x(2) in 3 downTo low(1)", "LX") { assertTrue(x(2) in 3 downTo low(1)) }
|
||||
expectOrder("x(2) !in high(3) downTo low(1)", "HLX") { assertFalse(x(2) !in high(3) downTo low(1)) }
|
||||
expectOrder("2 !in high(3) downTo low(1)", "HL") { assertFalse(2 !in high(3) downTo low(1)) }
|
||||
expectOrder("x(2) !in high(3) downTo 1", "HX") { assertFalse(x(2) !in high(3) downTo 1) }
|
||||
expectOrder("x(2) !in 3 downTo low(1)", "LX") { assertFalse(x(2) !in 3 downTo low(1)) }
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
// WITH_RUNTIME
|
||||
import kotlin.test.*
|
||||
|
||||
var order = StringBuilder()
|
||||
|
||||
inline fun expectOrder(at: String, expected: String, body: () -> Unit) {
|
||||
order = StringBuilder() // have to do that in order to run this test in JS
|
||||
body()
|
||||
if (order.toString() != expected) throw AssertionError("$at: expected: $expected, actual: $order")
|
||||
}
|
||||
|
||||
fun low(i: Int): Int {
|
||||
order.append("L")
|
||||
return i
|
||||
}
|
||||
|
||||
fun high(i: Int): Int {
|
||||
order.append("H")
|
||||
return i
|
||||
}
|
||||
|
||||
fun x(i: Int): Int {
|
||||
order.append("X")
|
||||
return i
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
expectOrder("x(0) in (high(3) downTo low(1)).reversed()", "HLX") { assertFalse(x(0) in (high(3) downTo low(1)).reversed()) }
|
||||
expectOrder("0 in (high(3) downTo low(1)).reversed()", "HL") { assertFalse(0 in (high(3) downTo low(1)).reversed()) }
|
||||
expectOrder("x(0) in high(3) downTo 1", "HX") { assertFalse(x(0) in high(3) downTo 1) }
|
||||
expectOrder("x(0) in 3 downTo low(1)", "LX") { assertFalse(x(0) in 3 downTo low(1)) }
|
||||
expectOrder("x(0) !in (high(3) downTo low(1)).reversed()", "HLX") { assertTrue(x(0) !in (high(3) downTo low(1)).reversed()) }
|
||||
expectOrder("0 !in (high(3) downTo low(1)).reversed()", "HL") { assertTrue(0 !in (high(3) downTo low(1)).reversed()) }
|
||||
expectOrder("x(0) !in high(3) downTo 1", "HX") { assertTrue(x(0) !in high(3) downTo 1) }
|
||||
expectOrder("x(0) !in 3 downTo low(1)", "LX") { assertTrue(x(0) !in 3 downTo low(1)) }
|
||||
|
||||
expectOrder("x(4) in (high(3) downTo low(1)).reversed()", "HLX") { assertFalse(x(4) in (high(3) downTo low(1)).reversed()) }
|
||||
expectOrder("4 in (high(3) downTo low(1)).reversed()", "HL") { assertFalse(4 in (high(3) downTo low(1)).reversed()) }
|
||||
expectOrder("x(4) in high(3) downTo 1", "HX") { assertFalse(x(4) in high(3) downTo 1) }
|
||||
expectOrder("x(4) in 3 downTo low(1)", "LX") { assertFalse(x(4) in 3 downTo low(1)) }
|
||||
expectOrder("x(4) !in (high(3) downTo low(1)).reversed()", "HLX") { assertTrue(x(4) !in (high(3) downTo low(1)).reversed()) }
|
||||
expectOrder("4 !in (high(3) downTo low(1)).reversed()", "HL") { assertTrue(4 !in (high(3) downTo low(1)).reversed()) }
|
||||
expectOrder("x(4) !in high(3) downTo 1", "HX") { assertTrue(x(4) !in high(3) downTo 1) }
|
||||
expectOrder("x(4) !in 3 downTo low(1)", "LX") { assertTrue(x(4) !in 3 downTo low(1)) }
|
||||
|
||||
expectOrder("x(2) in (high(3) downTo low(1)).reversed()", "HLX") { assertTrue(x(2) in (high(3) downTo low(1)).reversed()) }
|
||||
expectOrder("2 in (high(3) downTo low(1)).reversed()", "HL") { assertTrue(2 in (high(3) downTo low(1)).reversed()) }
|
||||
expectOrder("x(2) in high(3) downTo 1", "HX") { assertTrue(x(2) in high(3) downTo 1) }
|
||||
expectOrder("x(2) in 3 downTo low(1)", "LX") { assertTrue(x(2) in 3 downTo low(1)) }
|
||||
expectOrder("x(2) !in (high(3) downTo low(1)).reversed()", "HLX") { assertFalse(x(2) !in (high(3) downTo low(1)).reversed()) }
|
||||
expectOrder("2 !in (high(3) downTo low(1)).reversed()", "HL") { assertFalse(2 !in (high(3) downTo low(1)).reversed()) }
|
||||
expectOrder("x(2) !in high(3) downTo 1", "HX") { assertFalse(x(2) !in high(3) downTo 1) }
|
||||
expectOrder("x(2) !in 3 downTo low(1)", "LX") { assertFalse(x(2) !in 3 downTo low(1)) }
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
// WITH_RUNTIME
|
||||
import kotlin.test.*
|
||||
|
||||
var order = StringBuilder()
|
||||
|
||||
inline fun expectOrder(at: String, expected: String, body: () -> Unit) {
|
||||
order = StringBuilder() // have to do that in order to run this test in JS
|
||||
body()
|
||||
if (order.toString() != expected) throw AssertionError("$at: expected: $expected, actual: $order")
|
||||
}
|
||||
|
||||
fun low(i: Int): Int {
|
||||
order.append("L")
|
||||
return i
|
||||
}
|
||||
|
||||
fun high(i: Int): Int {
|
||||
order.append("H")
|
||||
return i
|
||||
}
|
||||
|
||||
fun x(i: Int?): Int? {
|
||||
order.append("X")
|
||||
return i
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
expectOrder("x(null) in low(1) .. high(3)", "LHX") { assertFalse(x(null) in low(1) .. high(3)) }
|
||||
expectOrder("null in low(1) .. high(3)", "LH") { assertFalse(null in low(1) .. high(3)) }
|
||||
expectOrder("x(null) in 1 .. high(3)", "HX") { assertFalse(x(null) in 1 .. high(3)) }
|
||||
expectOrder("x(null) in low(1) .. 3", "LX") { assertFalse(x(null) in low(1) .. 3) }
|
||||
expectOrder("x(null) !in low(1) .. high(3)", "LHX") { assertTrue(x(null) !in low(1) .. high(3)) }
|
||||
expectOrder("null !in low(1) .. high(3)", "LH") { assertTrue(null !in low(1) .. high(3)) }
|
||||
expectOrder("x(null) !in 1 .. high(3)", "HX") { assertTrue(x(null) !in 1 .. high(3)) }
|
||||
expectOrder("x(null) !in low(1) .. 3", "LX") { assertTrue(x(null) !in low(1) .. 3) }
|
||||
|
||||
expectOrder("x(0) in low(1) .. high(3)", "LHX") { assertFalse(x(0) in low(1) .. high(3)) }
|
||||
expectOrder("0 in low(1) .. high(3)", "LH") { assertFalse(0 in low(1) .. high(3)) }
|
||||
expectOrder("x(0) in 1 .. high(3)", "HX") { assertFalse(x(0) in 1 .. high(3)) }
|
||||
expectOrder("x(0) in low(1) .. 3", "LX") { assertFalse(x(0) in low(1) .. 3) }
|
||||
expectOrder("x(0) !in low(1) .. high(3)", "LHX") { assertTrue(x(0) !in low(1) .. high(3)) }
|
||||
expectOrder("0 !in low(1) .. high(3)", "LH") { assertTrue(0 !in low(1) .. high(3)) }
|
||||
expectOrder("x(0) !in 1 .. high(3)", "HX") { assertTrue(x(0) !in 1 .. high(3)) }
|
||||
expectOrder("x(0) !in low(1) .. 3", "LX") { assertTrue(x(0) !in low(1) .. 3) }
|
||||
|
||||
expectOrder("x(4) in low(1) .. high(3)", "LHX") { assertFalse(x(4) in low(1) .. high(3)) }
|
||||
expectOrder("4 in low(1) .. high(3)", "LH") { assertFalse(4 in low(1) .. high(3)) }
|
||||
expectOrder("x(4) in 1 .. high(3)", "HX") { assertFalse(x(4) in 1 .. high(3)) }
|
||||
expectOrder("x(4) in low(1) .. 3", "LX") { assertFalse(x(4) in low(1) .. 3) }
|
||||
expectOrder("x(4) !in low(1) .. high(3)", "LHX") { assertTrue(x(4) !in low(1) .. high(3)) }
|
||||
expectOrder("4 !in low(1) .. high(3)", "LH") { assertTrue(4 !in low(1) .. high(3)) }
|
||||
expectOrder("x(4) !in 1 .. high(3)", "HX") { assertTrue(x(4) !in 1 .. high(3)) }
|
||||
expectOrder("x(4) !in low(1) .. 3", "LX") { assertTrue(x(4) !in low(1) .. 3) }
|
||||
|
||||
expectOrder("x(2) in low(1) .. high(3)", "LHX") { assertTrue(x(2) in low(1) .. high(3)) }
|
||||
expectOrder("2 in low(1) .. high(3)", "LH") { assertTrue(2 in low(1) .. high(3)) }
|
||||
expectOrder("x(2) in 1 .. high(3)", "HX") { assertTrue(x(2) in 1 .. high(3)) }
|
||||
expectOrder("x(2) in low(1) .. 3", "LX") { assertTrue(x(2) in low(1) .. 3) }
|
||||
expectOrder("x(2) !in low(1) .. high(3)", "LHX") { assertFalse(x(2) !in low(1) .. high(3)) }
|
||||
expectOrder("2 !in low(1) .. high(3)", "LH") { assertFalse(2 !in low(1) .. high(3)) }
|
||||
expectOrder("x(2) !in 1 .. high(3)", "HX") { assertFalse(x(2) !in 1 .. high(3)) }
|
||||
expectOrder("x(2) !in low(1) .. 3", "LX") { assertFalse(x(2) !in low(1) .. 3) }
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+27
-2
@@ -1,5 +1,6 @@
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
// WITH_RUNTIME
|
||||
import kotlin.test.*
|
||||
|
||||
var order = StringBuilder()
|
||||
|
||||
@@ -25,8 +26,32 @@ fun x(i: Int): Int {
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
expectOrder("0 in 1 .. 3", "LHX") { x(0) in low(1) .. high(3) }
|
||||
expectOrder("0 !in 1 .. 3", "LHX") { x(0) !in low(1) .. high(3) }
|
||||
expectOrder("x(0) in low(1) .. high(3)", "LHX") { assertFalse(x(0) in low(1) .. high(3)) }
|
||||
expectOrder("0 in low(1) .. high(3)", "LH") { assertFalse(0 in low(1) .. high(3)) }
|
||||
expectOrder("x(0) in 1 .. high(3)", "HX") { assertFalse(x(0) in 1 .. high(3)) }
|
||||
expectOrder("x(0) in low(1) .. 3", "LX") { assertFalse(x(0) in low(1) .. 3) }
|
||||
expectOrder("x(0) !in low(1) .. high(3)", "LHX") { assertTrue(x(0) !in low(1) .. high(3)) }
|
||||
expectOrder("0 !in low(1) .. high(3)", "LH") { assertTrue(0 !in low(1) .. high(3)) }
|
||||
expectOrder("x(0) !in 1 .. high(3)", "HX") { assertTrue(x(0) !in 1 .. high(3)) }
|
||||
expectOrder("x(0) !in low(1) .. 3", "LX") { assertTrue(x(0) !in low(1) .. 3) }
|
||||
|
||||
expectOrder("x(4) in low(1) .. high(3)", "LHX") { assertFalse(x(4) in low(1) .. high(3)) }
|
||||
expectOrder("4 in low(1) .. high(3)", "LH") { assertFalse(4 in low(1) .. high(3)) }
|
||||
expectOrder("x(4) in 1 .. high(3)", "HX") { assertFalse(x(4) in 1 .. high(3)) }
|
||||
expectOrder("x(4) in low(1) .. 3", "LX") { assertFalse(x(4) in low(1) .. 3) }
|
||||
expectOrder("x(4) !in low(1) .. high(3)", "LHX") { assertTrue(x(4) !in low(1) .. high(3)) }
|
||||
expectOrder("4 !in low(1) .. high(3)", "LH") { assertTrue(4 !in low(1) .. high(3)) }
|
||||
expectOrder("x(4) !in 1 .. high(3)", "HX") { assertTrue(x(4) !in 1 .. high(3)) }
|
||||
expectOrder("x(4) !in low(1) .. 3", "LX") { assertTrue(x(4) !in low(1) .. 3) }
|
||||
|
||||
expectOrder("x(2) in low(1) .. high(3)", "LHX") { assertTrue(x(2) in low(1) .. high(3)) }
|
||||
expectOrder("2 in low(1) .. high(3)", "LH") { assertTrue(2 in low(1) .. high(3)) }
|
||||
expectOrder("x(2) in 1 .. high(3)", "HX") { assertTrue(x(2) in 1 .. high(3)) }
|
||||
expectOrder("x(2) in low(1) .. 3", "LX") { assertTrue(x(2) in low(1) .. 3) }
|
||||
expectOrder("x(2) !in low(1) .. high(3)", "LHX") { assertFalse(x(2) !in low(1) .. high(3)) }
|
||||
expectOrder("2 !in low(1) .. high(3)", "LH") { assertFalse(2 !in low(1) .. high(3)) }
|
||||
expectOrder("x(2) !in 1 .. high(3)", "HX") { assertFalse(x(2) !in 1 .. high(3)) }
|
||||
expectOrder("x(2) !in low(1) .. 3", "LX") { assertFalse(x(2) !in low(1) .. 3) }
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
// WITH_RUNTIME
|
||||
import kotlin.test.*
|
||||
|
||||
var order = StringBuilder()
|
||||
|
||||
inline fun expectOrder(at: String, expected: String, body: () -> Unit) {
|
||||
order = StringBuilder() // have to do that in order to run this test in JS
|
||||
body()
|
||||
if (order.toString() != expected) throw AssertionError("$at: expected: $expected, actual: $order")
|
||||
}
|
||||
|
||||
fun low(i: Int): Int {
|
||||
order.append("L")
|
||||
return i
|
||||
}
|
||||
|
||||
fun high(i: Int): Int {
|
||||
order.append("H")
|
||||
return i
|
||||
}
|
||||
|
||||
fun x(i: Int): Int {
|
||||
order.append("X")
|
||||
return i
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
expectOrder("x(0) in (low(1) .. high(3)).reversed()", "LHX") { assertFalse(x(0) in (low(1) .. high(3)).reversed()) }
|
||||
expectOrder("0 in (low(1) .. high(3)).reversed()", "LH") { assertFalse(0 in (low(1) .. high(3)).reversed()) }
|
||||
expectOrder("x(0) in 1 .. high(3)", "HX") { assertFalse(x(0) in 1 .. high(3)) }
|
||||
expectOrder("x(0) in low(1) .. 3", "LX") { assertFalse(x(0) in low(1) .. 3) }
|
||||
expectOrder("x(0) !in (low(1) .. high(3)).reversed()", "LHX") { assertTrue(x(0) !in (low(1) .. high(3)).reversed()) }
|
||||
expectOrder("0 !in (low(1) .. high(3)).reversed()", "LH") { assertTrue(0 !in (low(1) .. high(3)).reversed()) }
|
||||
expectOrder("x(0) !in 1 .. high(3)", "HX") { assertTrue(x(0) !in 1 .. high(3)) }
|
||||
expectOrder("x(0) !in low(1) .. 3", "LX") { assertTrue(x(0) !in low(1) .. 3) }
|
||||
|
||||
expectOrder("x(4) in (low(1) .. high(3)).reversed()", "LHX") { assertFalse(x(4) in (low(1) .. high(3)).reversed()) }
|
||||
expectOrder("4 in (low(1) .. high(3)).reversed()", "LH") { assertFalse(4 in (low(1) .. high(3)).reversed()) }
|
||||
expectOrder("x(4) in 1 .. high(3)", "HX") { assertFalse(x(4) in 1 .. high(3)) }
|
||||
expectOrder("x(4) in low(1) .. 3", "LX") { assertFalse(x(4) in low(1) .. 3) }
|
||||
expectOrder("x(4) !in (low(1) .. high(3)).reversed()", "LHX") { assertTrue(x(4) !in (low(1) .. high(3)).reversed()) }
|
||||
expectOrder("4 !in (low(1) .. high(3)).reversed()", "LH") { assertTrue(4 !in (low(1) .. high(3)).reversed()) }
|
||||
expectOrder("x(4) !in 1 .. high(3)", "HX") { assertTrue(x(4) !in 1 .. high(3)) }
|
||||
expectOrder("x(4) !in low(1) .. 3", "LX") { assertTrue(x(4) !in low(1) .. 3) }
|
||||
|
||||
expectOrder("x(2) in (low(1) .. high(3)).reversed()", "LHX") { assertTrue(x(2) in (low(1) .. high(3)).reversed()) }
|
||||
expectOrder("2 in (low(1) .. high(3)).reversed()", "LH") { assertTrue(2 in (low(1) .. high(3)).reversed()) }
|
||||
expectOrder("x(2) in 1 .. high(3)", "HX") { assertTrue(x(2) in 1 .. high(3)) }
|
||||
expectOrder("x(2) in low(1) .. 3", "LX") { assertTrue(x(2) in low(1) .. 3) }
|
||||
expectOrder("x(2) !in (low(1) .. high(3)).reversed()", "LHX") { assertFalse(x(2) !in (low(1) .. high(3)).reversed()) }
|
||||
expectOrder("2 !in (low(1) .. high(3)).reversed()", "LH") { assertFalse(2 !in (low(1) .. high(3)).reversed()) }
|
||||
expectOrder("x(2) !in 1 .. high(3)", "HX") { assertFalse(x(2) !in 1 .. high(3)) }
|
||||
expectOrder("x(2) !in low(1) .. 3", "LX") { assertFalse(x(2) !in low(1) .. 3) }
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
// WITH_RUNTIME
|
||||
import kotlin.test.*
|
||||
|
||||
var order = StringBuilder()
|
||||
|
||||
inline fun expectOrder(at: String, expected: String, body: () -> Unit) {
|
||||
order = StringBuilder() // have to do that in order to run this test in JS
|
||||
body()
|
||||
if (order.toString() != expected) throw AssertionError("$at: expected: $expected, actual: $order")
|
||||
}
|
||||
|
||||
fun low(i: Int): Int {
|
||||
order.append("L")
|
||||
return i
|
||||
}
|
||||
|
||||
fun high(i: Int): Int {
|
||||
order.append("H")
|
||||
return i
|
||||
}
|
||||
|
||||
fun x(i: Int): Int {
|
||||
order.append("X")
|
||||
return i
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
expectOrder("x(0) in low(1) until high(3)", "LHX") { assertFalse(x(0) in low(1) until high(3)) }
|
||||
expectOrder("0 in low(1) until high(3)", "LH") { assertFalse(0 in low(1) until high(3)) }
|
||||
expectOrder("x(0) in 1 until high(3)", "HX") { assertFalse(x(0) in 1 until high(3)) }
|
||||
expectOrder("x(0) in low(1) until 3", "LX") { assertFalse(x(0) in low(1) until 3) }
|
||||
expectOrder("x(0) !in low(1) until high(3)", "LHX") { assertTrue(x(0) !in low(1) until high(3)) }
|
||||
expectOrder("0 !in low(1) until high(3)", "LH") { assertTrue(0 !in low(1) until high(3)) }
|
||||
expectOrder("x(0) !in 1 until high(3)", "HX") { assertTrue(x(0) !in 1 until high(3)) }
|
||||
expectOrder("x(0) !in low(1) until 3", "LX") { assertTrue(x(0) !in low(1) until 3) }
|
||||
|
||||
expectOrder("x(4) in low(1) until high(3)", "LHX") { assertFalse(x(4) in low(1) until high(3)) }
|
||||
expectOrder("4 in low(1) until high(3)", "LH") { assertFalse(4 in low(1) until high(3)) }
|
||||
expectOrder("x(4) in 1 until high(3)", "HX") { assertFalse(x(4) in 1 until high(3)) }
|
||||
expectOrder("x(4) in low(1) until 3", "LX") { assertFalse(x(4) in low(1) until 3) }
|
||||
expectOrder("x(4) !in low(1) until high(3)", "LHX") { assertTrue(x(4) !in low(1) until high(3)) }
|
||||
expectOrder("4 !in low(1) until high(3)", "LH") { assertTrue(4 !in low(1) until high(3)) }
|
||||
expectOrder("x(4) !in 1 until high(3)", "HX") { assertTrue(x(4) !in 1 until high(3)) }
|
||||
expectOrder("x(4) !in low(1) until 3", "LX") { assertTrue(x(4) !in low(1) until 3) }
|
||||
|
||||
expectOrder("x(2) in low(1) until high(3)", "LHX") { assertTrue(x(2) in low(1) until high(3)) }
|
||||
expectOrder("2 in low(1) until high(3)", "LH") { assertTrue(2 in low(1) until high(3)) }
|
||||
expectOrder("x(2) in 1 until high(3)", "HX") { assertTrue(x(2) in 1 until high(3)) }
|
||||
expectOrder("x(2) in low(1) until 3", "LX") { assertTrue(x(2) in low(1) until 3) }
|
||||
expectOrder("x(2) !in low(1) until high(3)", "LHX") { assertFalse(x(2) !in low(1) until high(3)) }
|
||||
expectOrder("2 !in low(1) until high(3)", "LH") { assertFalse(2 !in low(1) until high(3)) }
|
||||
expectOrder("x(2) !in 1 until high(3)", "HX") { assertFalse(x(2) !in 1 until high(3)) }
|
||||
expectOrder("x(2) !in low(1) until 3", "LX") { assertFalse(x(2) !in low(1) until 3) }
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
// WITH_RUNTIME
|
||||
import kotlin.test.*
|
||||
|
||||
var order = StringBuilder()
|
||||
|
||||
inline fun expectOrder(at: String, expected: String, body: () -> Unit) {
|
||||
order = StringBuilder() // have to do that in order to run this test in JS
|
||||
body()
|
||||
if (order.toString() != expected) throw AssertionError("$at: expected: $expected, actual: $order")
|
||||
}
|
||||
|
||||
fun low(i: Int): Int {
|
||||
order.append("L")
|
||||
return i
|
||||
}
|
||||
|
||||
fun high(i: Int): Int {
|
||||
order.append("H")
|
||||
return i
|
||||
}
|
||||
|
||||
fun x(i: Int): Int {
|
||||
order.append("X")
|
||||
return i
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
expectOrder("x(0) in (low(1) until high(3)).reversed()", "LHX") { assertFalse(x(0) in (low(1) until high(3)).reversed()) }
|
||||
expectOrder("0 in (low(1) until high(3)).reversed()", "LH") { assertFalse(0 in (low(1) until high(3)).reversed()) }
|
||||
expectOrder("x(0) in 1 until high(3)", "HX") { assertFalse(x(0) in 1 until high(3)) }
|
||||
expectOrder("x(0) in low(1) until 3", "LX") { assertFalse(x(0) in low(1) until 3) }
|
||||
expectOrder("x(0) !in (low(1) until high(3)).reversed()", "LHX") { assertTrue(x(0) !in (low(1) until high(3)).reversed()) }
|
||||
expectOrder("0 !in (low(1) until high(3)).reversed()", "LH") { assertTrue(0 !in (low(1) until high(3)).reversed()) }
|
||||
expectOrder("x(0) !in 1 until high(3)", "HX") { assertTrue(x(0) !in 1 until high(3)) }
|
||||
expectOrder("x(0) !in low(1) until 3", "LX") { assertTrue(x(0) !in low(1) until 3) }
|
||||
|
||||
expectOrder("x(4) in (low(1) until high(3)).reversed()", "LHX") { assertFalse(x(4) in (low(1) until high(3)).reversed()) }
|
||||
expectOrder("4 in (low(1) until high(3)).reversed()", "LH") { assertFalse(4 in (low(1) until high(3)).reversed()) }
|
||||
expectOrder("x(4) in 1 until high(3)", "HX") { assertFalse(x(4) in 1 until high(3)) }
|
||||
expectOrder("x(4) in low(1) until 3", "LX") { assertFalse(x(4) in low(1) until 3) }
|
||||
expectOrder("x(4) !in (low(1) until high(3)).reversed()", "LHX") { assertTrue(x(4) !in (low(1) until high(3)).reversed()) }
|
||||
expectOrder("4 !in (low(1) until high(3)).reversed()", "LH") { assertTrue(4 !in (low(1) until high(3)).reversed()) }
|
||||
expectOrder("x(4) !in 1 until high(3)", "HX") { assertTrue(x(4) !in 1 until high(3)) }
|
||||
expectOrder("x(4) !in low(1) until 3", "LX") { assertTrue(x(4) !in low(1) until 3) }
|
||||
|
||||
expectOrder("x(2) in (low(1) until high(3)).reversed()", "LHX") { assertTrue(x(2) in (low(1) until high(3)).reversed()) }
|
||||
expectOrder("2 in (low(1) until high(3)).reversed()", "LH") { assertTrue(2 in (low(1) until high(3)).reversed()) }
|
||||
expectOrder("x(2) in 1 until high(3)", "HX") { assertTrue(x(2) in 1 until high(3)) }
|
||||
expectOrder("x(2) in low(1) until 3", "LX") { assertTrue(x(2) in low(1) until 3) }
|
||||
expectOrder("x(2) !in (low(1) until high(3)).reversed()", "LHX") { assertFalse(x(2) !in (low(1) until high(3)).reversed()) }
|
||||
expectOrder("2 !in (low(1) until high(3)).reversed()", "LH") { assertFalse(2 !in (low(1) until high(3)).reversed()) }
|
||||
expectOrder("x(2) !in 1 until high(3)", "HX") { assertFalse(x(2) !in 1 until high(3)) }
|
||||
expectOrder("x(2) !in low(1) until 3", "LX") { assertFalse(x(2) !in low(1) until 3) }
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
// WITH_RUNTIME
|
||||
|
||||
fun box(): String {
|
||||
if (Char.MAX_VALUE in Char.MAX_VALUE until Char.MAX_VALUE) return "Fail in Char.MAX_VALUE"
|
||||
if (!(Char.MAX_VALUE !in Char.MAX_VALUE until Char.MAX_VALUE)) return "Fail !in Char.MAX_VALUE"
|
||||
|
||||
if (Int.MAX_VALUE in Int.MAX_VALUE until Int.MAX_VALUE) return "Fail in Int.MAX_VALUE"
|
||||
if (!(Int.MAX_VALUE !in Int.MAX_VALUE until Int.MAX_VALUE)) return "Fail !in Int.MAX_VALUE"
|
||||
|
||||
if (Long.MAX_VALUE in Long.MAX_VALUE until Long.MAX_VALUE) return "Fail in Long.MAX_VALUE"
|
||||
if (!(Long.MAX_VALUE !in Long.MAX_VALUE until Long.MAX_VALUE)) return "Fail !in Long.MAX_VALUE"
|
||||
|
||||
if (UInt.MAX_VALUE in UInt.MAX_VALUE until UInt.MAX_VALUE) return "Fail in UInt.MAX_VALUE"
|
||||
if (!(UInt.MAX_VALUE !in UInt.MAX_VALUE until UInt.MAX_VALUE)) return "Fail !in UInt.MAX_VALUE"
|
||||
|
||||
if (ULong.MAX_VALUE in ULong.MAX_VALUE until ULong.MAX_VALUE) return "Fail in ULong.MAX_VALUE"
|
||||
if (!(ULong.MAX_VALUE !in ULong.MAX_VALUE until ULong.MAX_VALUE)) return "Fail !in ULong.MAX_VALUE"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
// WITH_RUNTIME
|
||||
|
||||
fun box(): String {
|
||||
if ('b' in 'a' until Char.MIN_VALUE) return "Fail in Char.MIN_VALUE"
|
||||
if (!('b' !in 'a' until Char.MIN_VALUE)) return "Fail !in Char.MIN_VALUE"
|
||||
|
||||
if (1 in 0 until Int.MIN_VALUE) return "Fail in Int.MIN_VALUE"
|
||||
if (!(1 !in 0 until Int.MIN_VALUE)) return "Fail !in Int.MIN_VALUE"
|
||||
|
||||
if (1L in 0L until Long.MIN_VALUE) return "Fail in Long.MIN_VALUE"
|
||||
if (!(1L !in 0L until Long.MIN_VALUE)) return "Fail !in Long.MIN_VALUE"
|
||||
|
||||
if (1u in 0u until UInt.MIN_VALUE) return "Fail in UInt.MIN_VALUE"
|
||||
if (!(1u !in 0u until UInt.MIN_VALUE)) return "Fail !in UInt.MIN_VALUE"
|
||||
|
||||
if (1uL in 0uL until ULong.MIN_VALUE) return "Fail in ULong.MIN_VALUE"
|
||||
if (!(1uL !in 0uL until ULong.MIN_VALUE)) return "Fail !in ULong.MIN_VALUE"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
// WITH_RUNTIME
|
||||
|
||||
fun box(): String {
|
||||
val charBound = Char.MIN_VALUE
|
||||
if ('b' in 'a' until charBound) return "Fail in Char.MIN_VALUE"
|
||||
if (!('b' !in 'a' until charBound)) return "Fail !in Char.MIN_VALUE"
|
||||
|
||||
val intBound = Int.MIN_VALUE
|
||||
if (1 in 0 until intBound) return "Fail in Int.MIN_VALUE"
|
||||
if (!(1 !in 0 until intBound)) return "Fail !in Int.MIN_VALUE"
|
||||
|
||||
val longBound = Long.MIN_VALUE
|
||||
if (1L in 0L until longBound) return "Fail in Long.MIN_VALUE"
|
||||
if (!(1L !in 0L until longBound)) return "Fail !in Long.MIN_VALUE"
|
||||
|
||||
val uIntBound = UInt.MIN_VALUE
|
||||
if (1u in 0u until uIntBound) return "Fail in UInt.MIN_VALUE"
|
||||
if (!(1u !in 0u until uIntBound)) return "Fail !in UInt.MIN_VALUE"
|
||||
|
||||
val uLongBound = ULong.MIN_VALUE
|
||||
if (1uL in 0uL until uLongBound) return "Fail in ULong.MIN_VALUE"
|
||||
if (!(1uL !in 0uL until uLongBound)) return "Fail !in ULong.MIN_VALUE"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -1,14 +1,38 @@
|
||||
// WITH_RUNTIME
|
||||
|
||||
val x: Int? = 42
|
||||
fun xFun(): Int? = 42
|
||||
|
||||
val n: Int? = null
|
||||
val nProp: Int?
|
||||
get() = null
|
||||
|
||||
fun box(): String {
|
||||
if (x in 0..2) return "Fail in"
|
||||
if (!(x !in 0..2)) return "Fail !in"
|
||||
|
||||
if (xFun() in 0..2) return "Fail in function"
|
||||
if (!(xFun() !in 0..2)) return "Fail !in function"
|
||||
|
||||
if (n in 0..2) return "Fail in null"
|
||||
if (!(n !in 0..2)) return "Fail !in null"
|
||||
|
||||
if (nProp in 0..2) return "Fail in null property"
|
||||
if (!(nProp !in 0..2)) return "Fail !in null property"
|
||||
|
||||
val v: Int? = 10
|
||||
if (v in 0..2) return "Fail in variable"
|
||||
if (!(v !in 0..2)) return "Fail !in variable"
|
||||
|
||||
val nul: Int? = null
|
||||
if (nul in 0..2) return "Fail in null variable"
|
||||
if (!(nul !in 0..2)) return "Fail !in null variable"
|
||||
|
||||
if (null in 0..2) return "Fail in null const"
|
||||
if (!(null !in 0..2)) return "Fail !in null const"
|
||||
|
||||
if ({ x }() in 0..2) return "Fail in complex"
|
||||
if (!({ x }() !in 0..2)) return "Fail !in complex"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -1,3 +1,6 @@
|
||||
fun testChar(x: Char, a: Char, b: Char) =
|
||||
if (x !in a .. b) "no" else "yes"
|
||||
|
||||
fun testInt(x: Int, a: Int, b: Int) =
|
||||
if (x !in a .. b) "no" else "yes"
|
||||
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
// TODO KT-36829 Optimize 'in' expressions in JVM_IR
|
||||
fun testPrimitiveArray(i: Int, ints: IntArray) = i in ints.indices
|
||||
|
||||
fun testObjectArray(i: Int, xs: Array<Any>) = i in xs.indices
|
||||
@@ -13,4 +11,9 @@ fun testLongWithObjectArray(i: Long, xs: Array<Any>) = i in xs.indices
|
||||
// 2 I2L
|
||||
// 4 ARRAYLENGTH
|
||||
// 2 LCONST_0
|
||||
|
||||
// JVM_TEMPLATES
|
||||
// 6 ICONST_0
|
||||
|
||||
// JVM_IR_TEMPLATES
|
||||
// 10 ICONST_0
|
||||
@@ -1,5 +1,3 @@
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
// TODO KT-36829 Optimize 'in' expressions in JVM_IR
|
||||
fun testCharSequence(i: Int, cs: CharSequence) = i in cs.indices
|
||||
|
||||
fun testLongWithCharSequence(i: Long, cs: CharSequence) = i in cs.indices
|
||||
@@ -7,5 +5,4 @@ fun testLongWithCharSequence(i: Long, cs: CharSequence) = i in cs.indices
|
||||
// 0 getIndices
|
||||
// 0 contains
|
||||
// 2 length
|
||||
// 1 I2L
|
||||
|
||||
// 1 I2L
|
||||
@@ -1,5 +1,3 @@
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
// TODO KT-36829 Optimize 'in' expressions in JVM_IR
|
||||
fun testCollection(i: Int, xs: List<Any>) = i in xs.indices
|
||||
|
||||
fun testLongWithCollection(i: Long, xs: List<Any>) = i in xs.indices
|
||||
|
||||
+7
-3
@@ -1,5 +1,3 @@
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
// TODO KT-36829 Optimize 'in' expressions in JVM_IR
|
||||
fun inInt(x: Long): Boolean {
|
||||
return x in 1..2
|
||||
}
|
||||
@@ -17,7 +15,6 @@ fun inDouble(x: Float): Boolean {
|
||||
}
|
||||
|
||||
// 2 I2L
|
||||
// 3 F2D
|
||||
// 0 INVOKESPECIAL
|
||||
// 0 NEW
|
||||
// 0 rangeTo
|
||||
@@ -25,3 +22,10 @@ fun inDouble(x: Float): Boolean {
|
||||
// 0 intRangeContains
|
||||
// 0 doubleRangeContains
|
||||
// 0 floatRangeContains
|
||||
// 0 contains
|
||||
|
||||
// JVM_TEMPLATES
|
||||
// 3 F2D
|
||||
|
||||
// JVM_IR_TEMPLATES
|
||||
// 2 F2D
|
||||
@@ -1,11 +1,11 @@
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
// TODO KT-36829 Optimize 'in' expressions in JVM_IR
|
||||
fun Byte.inByte(left: Byte, right: Byte) = this in left..right
|
||||
|
||||
fun Short.inInt(left: Int, right: Int) = this in left .. right
|
||||
|
||||
fun Short.inByte(left: Byte, right: Byte) = this in left..right
|
||||
|
||||
fun inChar(x: Char, left: Char, right: Char) = x in left..right
|
||||
|
||||
fun inInt(x: Int, left: Int, right: Int) = x in left..right
|
||||
|
||||
fun inDouble(x: Double, left: Double, right: Double) = x in left..right
|
||||
@@ -23,3 +23,4 @@ fun inCharWithNullableParameter(x: Char?, left: Char, right: Char) = x!! in left
|
||||
// 0 CHECKCAST
|
||||
// 0 INVOKEINTERFACE
|
||||
// 0 <init>
|
||||
// 0 contains
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
// TODO KT-36829 Optimize 'in' expressions in JVM_IR
|
||||
fun testChar(a: Char, x: Char, y: Char) = a in x until y
|
||||
|
||||
fun testByte(a: Byte, x: Byte, y: Byte) = a in x until y
|
||||
|
||||
fun testShort(a: Short, x: Short, y: Short) = a in x until y
|
||||
@@ -10,3 +10,4 @@ fun testLong(a: Long, x: Long, y: Long) = a in x until y
|
||||
|
||||
// 0 until
|
||||
// 0 INVOKEVIRTUAL
|
||||
// 0 contains
|
||||
|
||||
Reference in New Issue
Block a user