Warn on for-in-array range variable assignment in loop body
According to KT-21354, this should be a warning in 1.2 and before, and no warning (with changed semantics) in 1.3 and later. NB there are some false positives in this check. #KT-21354 In Progress #KT-21321 In Progress
This commit is contained in:
+103
@@ -0,0 +1,103 @@
|
||||
// !LANGUAGE: -ProperForInArrayLoopRangeVariableAssignmentSemantic
|
||||
// !DIAGNOSTICS: -UNUSED_VALUE
|
||||
// SKIP_TXT
|
||||
|
||||
fun testArrayCapturedInLocalFun() {
|
||||
var xs = arrayOf("a", "b", "c")
|
||||
|
||||
fun updateXs() {
|
||||
xs = arrayOf("d", "e", "f")
|
||||
}
|
||||
|
||||
for (x in xs) {
|
||||
println(x)
|
||||
updateXs()
|
||||
}
|
||||
}
|
||||
|
||||
fun testArrayCapturedInLabmda() {
|
||||
var xs = arrayOf("a", "b", "c")
|
||||
|
||||
val updateXs = { xs = arrayOf("d", "e", "f") }
|
||||
|
||||
for (x in xs) {
|
||||
println(x)
|
||||
updateXs()
|
||||
}
|
||||
}
|
||||
|
||||
fun testArrayCapturedInInlineLambda() {
|
||||
var xs = arrayOf("a", "b", "c")
|
||||
|
||||
for (x in xs) {
|
||||
println(x)
|
||||
run {
|
||||
xs = arrayOf("d", "e", "f")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun testArrayCapturedInLocalObject() {
|
||||
var xs = arrayOf("a", "b", "c")
|
||||
|
||||
val updateXs = object : () -> Unit {
|
||||
override fun invoke() {
|
||||
xs = arrayOf("d", "e", "f")
|
||||
}
|
||||
}
|
||||
|
||||
for (x in xs) {
|
||||
println(x)
|
||||
updateXs()
|
||||
}
|
||||
}
|
||||
|
||||
fun testArrayCapturedInLocalClass() {
|
||||
var xs = arrayOf("a", "b", "c")
|
||||
|
||||
class LocalClass {
|
||||
fun updateXs() {
|
||||
xs = arrayOf("d", "e", "f")
|
||||
}
|
||||
}
|
||||
|
||||
val updater = LocalClass()
|
||||
|
||||
for (x in xs) {
|
||||
println(x)
|
||||
updater.updateXs()
|
||||
}
|
||||
}
|
||||
|
||||
fun testCapturedInLambdaAfterLoop() {
|
||||
// NB false positive
|
||||
var xs = intArrayOf(1, 2, 3)
|
||||
for (x in xs) {
|
||||
println(x)
|
||||
<!ASSIGNMENT_TO_ARRAY_LOOP_VARIABLE!>xs<!> = intArrayOf(4, 5, 6)
|
||||
}
|
||||
val lambda = { xs = intArrayOf() }
|
||||
lambda()
|
||||
}
|
||||
|
||||
fun testCapturedInLambdaInLoopAfterAssignment() {
|
||||
// NB false positive
|
||||
var xs = intArrayOf(1, 2, 3)
|
||||
for (x in xs) {
|
||||
println(x)
|
||||
<!ASSIGNMENT_TO_ARRAY_LOOP_VARIABLE!>xs<!> = intArrayOf(4, 5, 6)
|
||||
val lambda = { xs = intArrayOf() }
|
||||
lambda()
|
||||
}
|
||||
}
|
||||
|
||||
fun testCapturedInNonChangingClosure() {
|
||||
// NB false positive
|
||||
var xs = intArrayOf(1, 2, 3)
|
||||
val lambda = { println(xs) }
|
||||
for (x in xs) {
|
||||
println(x)
|
||||
<!ASSIGNMENT_TO_ARRAY_LOOP_VARIABLE!>xs<!> = intArrayOf(4, 5, 6)
|
||||
lambda()
|
||||
}
|
||||
}
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
// !LANGUAGE: -ProperForInArrayLoopRangeVariableAssignmentSemantic
|
||||
// !DIAGNOSTICS: -UNUSED_VALUE
|
||||
// SKIP_TXT
|
||||
|
||||
class Delegate<T>(var v: T) {
|
||||
operator fun getValue(thisRef: Any?, kProp: Any?) = v
|
||||
operator fun setValue(thisRef: Any?, kProp: Any?, value: T) { v = value }
|
||||
}
|
||||
|
||||
fun testLocalDelegatedProperty() {
|
||||
var xs by Delegate(arrayOf("a", "b", "c"))
|
||||
for (x in xs) {
|
||||
println(x)
|
||||
xs = arrayOf("d", "e", "f")
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
// !LANGUAGE: +ProperForInArrayLoopRangeVariableAssignmentSemantic
|
||||
// !DIAGNOSTICS: -UNUSED_VALUE
|
||||
// SKIP_TXT
|
||||
|
||||
fun testObjectArray() {
|
||||
var xs = arrayOf("a", "b", "c")
|
||||
for (x in xs) {
|
||||
println(x)
|
||||
xs = arrayOf("d", "e", "f")
|
||||
}
|
||||
}
|
||||
|
||||
fun testPrimitiveArray() {
|
||||
var xs = intArrayOf(1, 2, 3)
|
||||
for (x in xs) {
|
||||
println(x)
|
||||
xs = intArrayOf(4, 5, 6)
|
||||
}
|
||||
}
|
||||
Vendored
+39
@@ -0,0 +1,39 @@
|
||||
// !LANGUAGE: -ProperForInArrayLoopRangeVariableAssignmentSemantic
|
||||
// !DIAGNOSTICS: -UNUSED_VALUE
|
||||
// SKIP_TXT
|
||||
|
||||
fun testObjectArray() {
|
||||
var xs = arrayOf("a", "b", "c")
|
||||
for (x in xs) {
|
||||
println(x)
|
||||
<!ASSIGNMENT_TO_ARRAY_LOOP_VARIABLE!>xs<!> = arrayOf("d", "e", "f")
|
||||
}
|
||||
}
|
||||
|
||||
fun testPrimitiveArray() {
|
||||
var xs = intArrayOf(1, 2, 3)
|
||||
for (x in xs) {
|
||||
println(x)
|
||||
<!ASSIGNMENT_TO_ARRAY_LOOP_VARIABLE!>xs<!> = intArrayOf(4, 5, 6)
|
||||
}
|
||||
}
|
||||
|
||||
var global = arrayOf("a", "b", "c")
|
||||
|
||||
fun testGlobalArray() {
|
||||
for (x in global) {
|
||||
println(x)
|
||||
global = arrayOf("d", "e", "f")
|
||||
}
|
||||
}
|
||||
|
||||
fun testAssignmentNotInLoop() {
|
||||
var xs = intArrayOf(1, 2, 3)
|
||||
println(xs)
|
||||
xs = intArrayOf(7, 8, 9)
|
||||
for (x in xs) {
|
||||
println(x)
|
||||
}
|
||||
xs = intArrayOf(4, 5, 6)
|
||||
println(xs)
|
||||
}
|
||||
Reference in New Issue
Block a user