Files
kotlin-fork/compiler/testData/codegen/box/ranges/forInStringWithCustomIterator.kt
T
Dmitry Petrov c22dfeaf82 KT-24156 Do not optimize for-loops over Strings with custom iterator
'fun CharSequence.iterator()' is an extension function, so one can
overload it with custom implementation.
Other "predefined" containers such as arrays and ranges have member
'fun iterator()', so these containers are not affected.

Check that 'iterator' call corresponds to an extension function
'iterator' defined in package 'kotlin.text' with a receiver of type
'kotlin.CharSequence'.

 #KT-24156 Fixed
2018-05-22 10:02:52 +03:00

25 lines
590 B
Kotlin
Vendored

// TARGET_BACKEND: JVM
// WITH_RUNTIME
operator fun String.iterator(): IntIterator = object : IntIterator() {
private var index = 0
override fun nextInt() = codePointAt(index).apply {
index += Character.charCount(this)
}
override fun hasNext(): Boolean = index < length
}
fun String.collectInts(): List<Int> {
val result = ArrayList<Int>()
for (c in this) {
result.add(c)
}
return result
}
fun box(): String {
val ints = String(Character.toChars(127849)).collectInts()
return if (ints == listOf(127849)) "OK" else "Fail: $ints"
}