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() = v } data class Task(var input: StringProperty) fun `test local var reference and value`(): String { var property = StringProperty("OK") var originalProperty = property property = StringProperty("Fail") return when { originalProperty.get() != "OK" -> "Fail: ${originalProperty.get()}" originalProperty == property -> "Fail: originalProperty == property" else -> "OK" } } fun `test class property var reference and value`(): String { val task = Task(StringProperty("OK")) val originalProperty = task.input task.input = StringProperty("Fail") return when { originalProperty.get() != "OK" -> "Fail: ${originalProperty.get()}" originalProperty == task.input -> "Fail: originalProperty == task.input" else -> "OK" } } fun `test class property var reference and value with apply`(): String { val task = Task(StringProperty("OK")) val originalProperty = task.input task.apply { input = StringProperty("Fail") } return when { originalProperty.get() != "OK" -> "Fail: ${originalProperty.get()}" originalProperty == task.input -> "Fail: originalProperty == task.input" else -> "OK" } } fun box(): String { var result = `test local var reference and value`() if (result != "OK") return result result = `test class property var reference and value`() if (result != "OK") return result result = `test class property var reference and value with apply`() if (result != "OK") return result return "OK" }