From 41e5a31e1bb3d20d8e6122ad94e565b437453264 Mon Sep 17 00:00:00 2001 From: Sebastian Sellmair Date: Mon, 7 Aug 2023 13:24:34 +0200 Subject: [PATCH] [Gradle] ObservableSet: Only add listeners when a new object is indeed added ^KT-60937 Verification Pending --- .../kotlin/gradle/utils/ObservableSet.kt | 4 +++- .../gradle/unitTests/ObservableSetTest.kt | 20 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/ObservableSet.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/ObservableSet.kt index 2f8876fede0..f0daaffceb1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/ObservableSet.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/ObservableSet.kt @@ -40,10 +40,12 @@ internal class MutableObservableSetImpl(vararg elements: T) : MutableObservab } override fun add(element: T): Boolean { - return underlying.add(element).also { + val added = underlying.add(element) + if (added) { whenObjectAddedActions.toTypedArray().forEach { action -> action(element) } forAllActions.toTypedArray().forEach { action -> action(element) } } + return added } override fun isEmpty(): Boolean { diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/ObservableSetTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/ObservableSetTest.kt index ef97415a90e..9dfc4fa5d8f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/ObservableSetTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/ObservableSetTest.kt @@ -39,6 +39,26 @@ class ObservableSetTest { assertEquals(listOf(1, 2, 3, 4), testListener2.invocations) } + @Test + fun `test - adding already existing elements`() { + val set = MutableObservableSetImpl(1, 2, 3) + val forAllListener = TestListener() + val whenObjectAddedListener = TestListener() + set.forAll(forAllListener) + set.whenObjectAdded(whenObjectAddedListener) + + assertEquals(listOf(1, 2, 3), forAllListener.invocations) + assertEquals(listOf(), whenObjectAddedListener.invocations) + + /* Adding already existing elements */ + set.add(1) + set.addAll(listOf(1, 2)) + + /* No further invocations */ + assertEquals(listOf(1, 2, 3), forAllListener.invocations) + assertEquals(listOf(), whenObjectAddedListener.invocations) + } + @Test fun `test - whenObjectAdded`() { val set = MutableObservableSetImpl(1)