[Injection] Discriminate default instances during clashes resolution

The idea is to try to resolve the dependency without considering default
instances first.

This makes containers more composable, e.g., it is now possible to put
several containers together as long as all except one provide default
implemenetation for some particular service (non-default implementation
will be automatically chosen, and all defaults will be discarded).
This commit is contained in:
Dmitry Savvinov
2019-05-13 19:05:22 +03:00
parent 398d715fc6
commit d80eba31be
2 changed files with 26 additions and 8 deletions
@@ -18,8 +18,16 @@ package org.jetbrains.kotlin.container
import kotlin.reflect.KClass
/*Use to assist injection to provide a default implementation for a certain component and reduce boilerplate in injector code.
* Argument class must be a non-abstract component class or a kotlin object implementing target interface.
* Avoid using when there is no clear 'default' behaviour for a component.
* */
/**
* Use to assist injection to provide a default implementation for a certain component and reduce boilerplate in injector code.
* Argument class must be a non-abstract component class or a kotlin object implementing target interface.
* Avoid using when there is no clear 'default' behaviour for a component.
*
* NB: DefaultImplementation are *discriminated* during resolution of components, meaning that:
* - if there is exactly one non-default implementation and zero or several default, non-default will be chosen.
* - if there is none non-default implementations, default will be chosen
*
* Such configurations may arise, for example, for multiplatform modules: consider analyzing JVM+JS module, where JS contributes
* default implementation of some particular service, and JVM contributes non-default.
**/
annotation class DefaultImplementation(val impl: KClass<*>)