diff --git a/compiler/util/src/org/jetbrains/kotlin/utils/threadLocal.kt b/compiler/util/src/org/jetbrains/kotlin/utils/threadLocal.kt index 078bbcdb1ae..65fa3534cd7 100644 --- a/compiler/util/src/org/jetbrains/kotlin/utils/threadLocal.kt +++ b/compiler/util/src/org/jetbrains/kotlin/utils/threadLocal.kt @@ -23,4 +23,7 @@ private class ThreadLocalDelegate(private val initializer: () -> T) : ReadWri override operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { map[Thread.currentThread()] = value } + + override fun toString(): String = + "ThreadLocalDelegate(${map.entries.joinToString { "#${it.key.id}=>${it.value}" }})" } \ No newline at end of file diff --git a/libraries/stdlib/api/js-v1/kotlin.properties.kt b/libraries/stdlib/api/js-v1/kotlin.properties.kt index 429645ae93a..a23abf85e92 100644 --- a/libraries/stdlib/api/js-v1/kotlin.properties.kt +++ b/libraries/stdlib/api/js-v1/kotlin.properties.kt @@ -16,6 +16,8 @@ public abstract class ObservableProperty : kotlin.properties.ReadWritePropert public open override operator fun getValue(thisRef: kotlin.Any?, property: kotlin.reflect.KProperty<*>): V public open override operator fun setValue(thisRef: kotlin.Any?, property: kotlin.reflect.KProperty<*>, value: V): kotlin.Unit + + public open override fun toString(): kotlin.String } @kotlin.SinceKotlin(version = "1.4") diff --git a/libraries/stdlib/api/js/kotlin.properties.kt b/libraries/stdlib/api/js/kotlin.properties.kt index 429645ae93a..a23abf85e92 100644 --- a/libraries/stdlib/api/js/kotlin.properties.kt +++ b/libraries/stdlib/api/js/kotlin.properties.kt @@ -16,6 +16,8 @@ public abstract class ObservableProperty : kotlin.properties.ReadWritePropert public open override operator fun getValue(thisRef: kotlin.Any?, property: kotlin.reflect.KProperty<*>): V public open override operator fun setValue(thisRef: kotlin.Any?, property: kotlin.reflect.KProperty<*>, value: V): kotlin.Unit + + public open override fun toString(): kotlin.String } @kotlin.SinceKotlin(version = "1.4") diff --git a/libraries/stdlib/src/kotlin/properties/Delegates.kt b/libraries/stdlib/src/kotlin/properties/Delegates.kt index 587d60e3a16..e38e6cb5073 100644 --- a/libraries/stdlib/src/kotlin/properties/Delegates.kt +++ b/libraries/stdlib/src/kotlin/properties/Delegates.kt @@ -65,5 +65,8 @@ private class NotNullVar() : ReadWriteProperty { public override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { this.value = value } + + public override fun toString(): String = + "NotNullProperty(${if (value != null) "value=$value" else "value not initialized yet"})" } diff --git a/libraries/stdlib/src/kotlin/properties/ObservableProperty.kt b/libraries/stdlib/src/kotlin/properties/ObservableProperty.kt index ffa78099577..4a9e1161e22 100644 --- a/libraries/stdlib/src/kotlin/properties/ObservableProperty.kt +++ b/libraries/stdlib/src/kotlin/properties/ObservableProperty.kt @@ -40,4 +40,6 @@ public abstract class ObservableProperty(initialValue: V) : ReadWriteProperty this.value = value afterChange(property, oldValue, value) } + + override fun toString(): String = "ObservableProperty(value=$value)" } \ No newline at end of file diff --git a/libraries/stdlib/test/properties/delegation/DelegationTest.kt b/libraries/stdlib/test/properties/delegation/DelegationTest.kt index d8f58a28915..df93e0d4556 100644 --- a/libraries/stdlib/test/properties/delegation/DelegationTest.kt +++ b/libraries/stdlib/test/properties/delegation/DelegationTest.kt @@ -16,30 +16,36 @@ class NotNullVarTest() { private class NotNullVarTestGeneric(val a1: String, val b1: T) { var a: String by Delegates.notNull() - var b by Delegates.notNull() + val bDelegate = Delegates.notNull() + var b by bDelegate public fun doTest() { + assertEquals("NotNullProperty(value not initialized yet)", bDelegate.toString()) a = a1 b = b1 assertTrue(a == "a", "fail: a should be a, but was $a") assertTrue(b == "b", "fail: b should be b, but was $b") + assertEquals("NotNullProperty(value=$b)", bDelegate.toString()) } } class ObservablePropertyTest { var result = false - var b: Int by Delegates.observable(1, { property, old, new -> + val bDelegate = Delegates.observable(1) { property, old, new -> assertEquals("b", property.name) if (!result) assertEquals(1, old) result = true assertEquals(new, b, "New value has already been set") - }) + } + + var b: Int by bDelegate @Test fun doTest() { b = 4 assertTrue(b == 4, "fail: b != 4") assertTrue(result, "fail: result should be true") + assertEquals("ObservableProperty(value=$b)", bDelegate.toString()) } } diff --git a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt index 8ef07981da5..5088b3c8e76 100644 --- a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt +++ b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt @@ -4426,6 +4426,7 @@ public abstract class kotlin/properties/ObservableProperty : kotlin/properties/R protected fun beforeChange (Lkotlin/reflect/KProperty;Ljava/lang/Object;Ljava/lang/Object;)Z public fun getValue (Ljava/lang/Object;Lkotlin/reflect/KProperty;)Ljava/lang/Object; public fun setValue (Ljava/lang/Object;Lkotlin/reflect/KProperty;Ljava/lang/Object;)V + public fun toString ()Ljava/lang/String; } public abstract interface class kotlin/properties/PropertyDelegateProvider {