Skip to content

Commit 6baf94e

Browse files
committed
check multibinding key collision across modules
1 parent 3e4cd81 commit 6baf94e

File tree

2 files changed

+19
-17
lines changed

2 files changed

+19
-17
lines changed

projects/core/koin-core/src/commonMain/kotlin/org/koin/core/module/Multibinding.kt

+4-2
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ private class MultibindingIterateKey<T>(
6262
val multibindingQualifier: Qualifier,
6363
)
6464

65+
private val multibindingKeyCollisionDetectModule = Module()
66+
6567
class MapMultibindingElementDefinition<K : Any, E : Any> @PublishedApi internal constructor(
6668
private val multibindingQualifier: Qualifier,
6769
private val elementClass: KClass<E>,
@@ -142,12 +144,12 @@ class MapMultibindingElementDefinition<K : Any, E : Any> @PublishedApi internal
142144
private fun indexPrimaryType(instanceFactory: InstanceFactory<*>): InstanceFactory<*>? {
143145
val def = instanceFactory.beanDefinition
144146
val mapping = indexKey(def.primaryType, def.qualifier, def.scopeQualifier)
145-
return declareModule.mappings[mapping].apply {
147+
return multibindingKeyCollisionDetectModule.mappings[mapping].apply {
146148
declareModule.saveMapping(mapping, instanceFactory)
149+
multibindingKeyCollisionDetectModule.saveMapping(mapping, instanceFactory)
147150
}
148151
}
149152

150-
// TODO this only works for the same module, find a way to check across modules.
151153
private fun checkMultibindingKeyCollision(oldInstanceFactory: InstanceFactory<*>?, newKey: K) {
152154
if (oldInstanceFactory != null && needToCheckKeyType(newKey)) {
153155
val oldKey = (oldInstanceFactory.beanDefinition.definition(

projects/core/koin-core/src/commonTest/kotlin/org/koin/core/MapMultibindingTest.kt

+15-15
Original file line numberDiff line numberDiff line change
@@ -272,28 +272,15 @@ class MapMultibindingTest {
272272
}
273273

274274
@Test
275-
fun `override map multibinding elements with different keys but same toString`() {
275+
fun `get exception when overriding map multibinding elements with different keys but same toString`() {
276276
data class MapKey(
277277
val name: String,
278278
val value: Int,
279279
) {
280280
override fun toString(): String = name
281281
}
282282

283-
val app = koinApplication {
284-
modules(
285-
module {
286-
declareMapMultibinding<MapKey, Simple.ComponentInterface1> {
287-
intoMap(MapKey(keyOfComponent1, 1)) { component1 }
288-
}
289-
},
290-
)
291-
}
292-
val koin = app.koin
293-
val rootMap: Map<MapKey, Simple.ComponentInterface1> = koin.getMapMultibinding()
294-
assertEquals(1, rootMap.size)
295-
assertEquals(component1, rootMap[MapKey(keyOfComponent1, 1)])
296-
assertNull(rootMap[MapKey(keyOfComponent1, 2)])
283+
// declare in same module
297284
module {
298285
declareMapMultibinding<MapKey, Simple.ComponentInterface1> {
299286
intoMap(MapKey(keyOfComponent1, 1)) { component1 }
@@ -302,6 +289,19 @@ class MapMultibindingTest {
302289
}
303290
}
304291
}
292+
// declare in different modules
293+
module {
294+
declareMapMultibinding<MapKey, Simple.ComponentInterface1> {
295+
intoMap(MapKey(keyOfComponent2, 1)) { component1 }
296+
}
297+
}
298+
module {
299+
declareMapMultibinding<MapKey, Simple.ComponentInterface1> {
300+
assertFailsWith(MapMultibindingKeyTypeException::class) {
301+
intoMap(MapKey(keyOfComponent2, 2)) { component1 }
302+
}
303+
}
304+
}
305305
}
306306

307307
@Test

0 commit comments

Comments
 (0)