annotation class ValueContainer @ValueContainer data class StringProperty(var v: String) { fun assign(v: String) { this.v = v } fun assign(v: StringProperty) { this.v = v.get() } fun get(): String = v } data class Task(val input: StringProperty) fun `should not effect error reporting for other operators`() { val task = Task(StringProperty("Fail")) val nullTask: Task? = null // a.b += c task.input += StringProperty("Fail") nullTask?.input += StringProperty("Fail") // a.b <= c task.input <= StringProperty("Fail") nullTask?.input <= StringProperty("Fail") // a.b >= c task.input >= StringProperty("Fail") nullTask?.input >= StringProperty("Fail") // a.b[c] = d task.input[0] = StringProperty("Fail") nullTask?.input[0] = StringProperty("Fail") // a.b[c, d] = e task.input[0, 0] = StringProperty("Fail") nullTask?.input[0, 0] = StringProperty("Fail") // a.b[c,..,d] = e task.input[0, 0, 0] = StringProperty("Fail") nullTask?.input[0, 0, 0] = StringProperty("Fail") // a?.b[c] += d task.input[0] += StringProperty("Fail") nullTask?.input[0] += StringProperty("Fail") // a[i] = b should not be translated to a.get(i).assign(b) operator fun Task.get(i: Int) = this.input task[0] = StringProperty("Fail") // a.get(i) = b should not be translated to a.get(i).assign(b) task.get(0) = StringProperty("Fail") nullTask?.get(0) = StringProperty("Fail") }