Handle reversed() in ForLoopsLowering.
We get the info for the underlying progression and invert it. For progressions whose last bound was open (e.g., `until` loop), the reversed version will have an open first bound and so the induction variable must be incremented first. Also unified the way of extracting HeaderInfo out of changed calls (e.g., `indices.reversed()`), and fixed declaration parents in ForLoopsLowering.
This commit is contained in:
committed by
max-kammerer
parent
3d1b6fb83c
commit
1b703448d3
Vendored
+18
@@ -0,0 +1,18 @@
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
// WITH_RUNTIME
|
||||
import kotlin.test.*
|
||||
|
||||
fun box(): String {
|
||||
val arr = intArrayOf(1, 2, 3, 4)
|
||||
var sum = 0
|
||||
var index = 0
|
||||
for (i in arr.reversedArray()) {
|
||||
// reversedArray() returns a new Array with elements in reversed order.
|
||||
// Modifying the original array should have no effect on the iteration subject.
|
||||
arr[index++] = 0
|
||||
sum = sum * 10 + i
|
||||
}
|
||||
assertEquals(4321, sum)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
// WITH_RUNTIME
|
||||
import kotlin.test.*
|
||||
|
||||
fun box(): String {
|
||||
val arr = intArrayOf(1, 2, 3, 4)
|
||||
var sum = 0
|
||||
var index = arr.size - 1
|
||||
for (i in arr.reversedArray().reversedArray()) {
|
||||
// reversedArray() returns a new Array with elements in reversed order.
|
||||
// Modifying the original array should have no effect on the iteration subject.
|
||||
arr[index--] = 0
|
||||
sum = sum * 10 + i
|
||||
}
|
||||
assertEquals(1234, sum)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
// WITH_RUNTIME
|
||||
import kotlin.test.*
|
||||
|
||||
fun box(): String {
|
||||
val arr = intArrayOf(1, 2, 3, 4)
|
||||
var sum = 0
|
||||
var index = 0
|
||||
for (i in arr.reversed()) {
|
||||
// reversed() returns a new List with elements in reversed order.
|
||||
// Modifying the original array should have no effect on the iteration subject.
|
||||
arr[index++] = 0
|
||||
sum = sum * 10 + i
|
||||
}
|
||||
assertEquals(4321, sum)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
Vendored
+18
@@ -0,0 +1,18 @@
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
// WITH_RUNTIME
|
||||
import kotlin.test.*
|
||||
|
||||
fun box(): String {
|
||||
val arr = intArrayOf(1, 2, 3, 4)
|
||||
var sum = 0
|
||||
var index = arr.size - 1
|
||||
for (i in arr.reversed().reversed()) {
|
||||
// reversed() returns a new List with elements in reversed order.
|
||||
// Modifying the original array should have no effect on the iteration subject.
|
||||
arr[index--] = 0
|
||||
sum = sum * 10 + i
|
||||
}
|
||||
assertEquals(1234, sum)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
// WITH_RUNTIME
|
||||
import kotlin.test.*
|
||||
|
||||
fun box(): String {
|
||||
val arr = intArrayOf(1, 1, 1, 1)
|
||||
var sum = 0
|
||||
for (i in arr.indices.reversed().reversed()) {
|
||||
sum = sum * 10 + i + arr[i]
|
||||
}
|
||||
assertEquals(1234, sum)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
// WITH_RUNTIME
|
||||
import kotlin.test.*
|
||||
|
||||
fun box(): String {
|
||||
var sum = 0
|
||||
for (i in (4 downTo 1).reversed().reversed()) {
|
||||
sum = sum * 10 + i
|
||||
}
|
||||
assertEquals(4321, sum)
|
||||
|
||||
var sumL = 0L
|
||||
for (i in (4L downTo 1L).reversed().reversed()) {
|
||||
sumL = sumL * 10 + i
|
||||
}
|
||||
assertEquals(4321, sumL)
|
||||
|
||||
var sumC = 0
|
||||
for (i in ('4' downTo '1').reversed().reversed()) {
|
||||
sumC = sumC * 10 + i.toInt() - '0'.toInt()
|
||||
}
|
||||
assertEquals(4321, sumC)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
// WITH_RUNTIME
|
||||
import kotlin.test.*
|
||||
|
||||
fun box(): String {
|
||||
var sum = 0
|
||||
for (i in (1 until 5).reversed().reversed()) {
|
||||
sum = sum * 10 + i
|
||||
}
|
||||
assertEquals(1234, sum)
|
||||
|
||||
var sumL = 0L
|
||||
for (i in (1L until 5L).reversed().reversed()) {
|
||||
sumL = sumL * 10 + i
|
||||
}
|
||||
assertEquals(1234, sumL)
|
||||
|
||||
var sumC = 0
|
||||
for (i in ('1' until '5').reversed().reversed()) {
|
||||
sumC = sumC * 10 + i.toInt() - '0'.toInt()
|
||||
}
|
||||
assertEquals(1234, sumC)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
Vendored
+31
@@ -0,0 +1,31 @@
|
||||
// WITH_RUNTIME
|
||||
import kotlin.test.*
|
||||
|
||||
fun intLow() = 1
|
||||
fun intHigh() = 5
|
||||
fun longLow() = 1L
|
||||
fun longHigh() = 5L
|
||||
fun charLow() = '1'
|
||||
fun charHigh() = '5'
|
||||
|
||||
fun box(): String {
|
||||
var sum = 0
|
||||
for (i in (intLow() until intHigh()).reversed().reversed()) {
|
||||
sum = sum * 10 + i
|
||||
}
|
||||
assertEquals(1234, sum)
|
||||
|
||||
var sumL = 0L
|
||||
for (i in (longLow() until longHigh()).reversed().reversed()) {
|
||||
sumL = sumL * 10 + i
|
||||
}
|
||||
assertEquals(1234, sumL)
|
||||
|
||||
var sumC = 0
|
||||
for (i in (charLow() until charHigh()).reversed().reversed()) {
|
||||
sumC = sumC * 10 + i.toInt() - '0'.toInt()
|
||||
}
|
||||
assertEquals(1234, sumC)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
Reference in New Issue
Block a user