Releases: evant/kotlin-inject
v0.4.1
[0.4.1] 2022-01-01
Changed
- Improved generated code formatting.
- Removed explicit retention annotation to get rid of kotlin js warnings.
Fixed
- Fixes conflicting declarations when scoped
@Providesfunctions returned the same type with different generic args. - Fixes default parameter handling with lambda or lazy values.
- Fixes to kotlin native implementation that should make it more usable across threads.
Note: the new memory model limitation is still present, but you can use https://github.com/touchlab/Stately to wrap
the access when using the legacy memory model.
v0.4.0
[0.4.0] 2021-11-12
Changed
- Updated kotlin to 1.5.31
- Updated ksp to 1.5.31-1.0.1
- Several improvements to code generation which often means less code is generated.
Added
-
Multiple rounds handling: This includes support for using types generated by other ksp processors. As a side effect
there is better error reporting for unresolved types. -
Support for multiplatform/native. Check out the sample project.
Note: components are thread-safe, however you will run into issues actually using them from other threads unless you
enable the new memory model. -
Added support for default args when injecting. If the type is present in the graph, it'll be injected, otherwise the
default will be used.@Inject class MyClass(val dep: Dep = Dep("default")) @Component abstract ComponentWithDep { abstract val myClass: MyClass @Provides fun dep(): Dep = Dep("injected") } @Component abstract ComponentWithoutDep { abstract val myClass: MyClass } ComponentWithDep::class.create().myClass.dep // Dep("injected") ComponentWithoutDep::class.create().myClass.dep // Dep("default")
v0.3.7-RC
[0.3.7-RC] 2021-10-29
Changed
- Updated kotlin to 1.6.0-RC
- Updated ksp to 1.6.0-RC-1.0.1-RC
- Several improvements to code generation which often means less code is generated.
Added
- Multiple rounds handling: This includes support for using types generated by other ksp processors. As a side effect
there is better error reporting for unresolved types. - Support for multiplatform/native. Check out
the sample project.
v0.3.6
v0.3.5
v0.3.4
v0.3.3
[0.3.3] - 2021-04-20
Added
-
Allow cycles when there is delayed construction
You can now break cycles by using
Lazyor a function. For example,@Inject class Foo(bar: Bar) @Inject class Bar(foo: Foo)
will fail with a cycle error, but you can fix it by doing
@Inject class Foo(bar: Lazy<Bar>) @Inject class Bar(foo: Foo)
or
@Inject class Foo(bar: () -> Bar) @Inject class Bar(foo: Foo)
This uses
lateinitunder the hood. You will get a runtime exception if you try to use the dependency before
construction completes. -
Added option
me.tatarka.inject.dumpGraphto print the dependency graph while building. This can be useful for
debugging issues. -
Allow type-alias usage with
@IntoMap.You can now do
typealias Entry = Pair<String, MyValue> @Component { @Provides @IntoMap fun entry1(): Entry = "1" to MyValue(1) @Provides @IntoMap fun entry2(): Entry = "2" to MyValue(2) }
Changed
-
Code-gen optimization to reduce code size
-
ksp performance improvements
-
Made handling of nullable and platform types consistent on the different backends.
It is now an error to return a platform type from a
@Providesmethods, you must declare the return type explicitly.
Fixed
- Fix using
@Qualifieron scoped dependencies - Fix declaring components as an inner class
- Fix annotating java class constructors with
@Inject - Fix
@Injecton a companion object
v0.3.2
v0.3.1
[0.3.1] - 2021-02-25
Changed
- Updated ksp to 1.4.30-1.0.0-alpha03
- Minimum supported kotlin version is now 1.4.30
v0.3.0
[0.3.0] - 2021-01-14
Changed
-
Updated ksp to 1.4.20-dev-experimental-20210111.
Key changes:
- You no longer have to define
resolutionStrategyin yoursettings.gradle. - The plugin id has changed from
symbol-processingtocom.google.devtools.ksp.
- You no longer have to define
-
Minimum supported kotlin version is now 1.4.20
Added
-
Support injecting suspend functions
You can now define
suspendcomponent and provides methods@Component abstract class MyComponent { abstract val foo: suspend () -> IFoo val providesFoo: suspend () -> IFoo @Provides get() = { Foo() } }
-
Support default args in component constructors
If you define any default args, you will get an overload
createfunction that provides default values. Due to
processor limitations, you only get a single overload (i.e. you cannot pass defaults from some args but not other).
This can be useful for more conveniently defining parent components.@Component abstract class MyComponent(@Component val parent: ParentComponent = ParentComponent()) { ... } val component = MyComponent::class.create()
-
Support annotating constructors with
@InjectSometimes you don't want to use the primary constructor to construct an object. You can now annotate a more specific
constructor instead.class MyClass { @Inject constructor(arg: String) // use this one for injection constructor(arg: Int) }
-
Support injecting objects
While you can use an object directly, it may be useful to inject it so that you can switch it to an instance at a
later point without updating the consuming code.@Inject object Foo { ... } @Inject MyClass(dep: Foo) { ... }
Fixed
- Respect component's class visibility
- Fix generating incorrect code for fun providers