mirror of
https://github.com/InsanusMokrassar/MicroUtils.git
synced 2024-11-20 07:13:50 +00:00
add readme to generator and add several fixes in processor
This commit is contained in:
parent
9c40d7da3d
commit
9e4bb9d678
@ -5,6 +5,9 @@
|
|||||||
* `Repos`:
|
* `Repos`:
|
||||||
* `Exposed`:
|
* `Exposed`:
|
||||||
* `CommonExposedRepo.selectByIds` uses `foldRight` by default instead of raw foreach
|
* `CommonExposedRepo.selectByIds` uses `foldRight` by default instead of raw foreach
|
||||||
|
* `Koin`:
|
||||||
|
* `Generator`:
|
||||||
|
* Module has been created
|
||||||
|
|
||||||
## 0.16.11
|
## 0.16.11
|
||||||
|
|
||||||
|
100
koin/generator/README.md
Normal file
100
koin/generator/README.md
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
# Koin generator
|
||||||
|
|
||||||
|
It is Kotlin Symbol Processing generator for `Koin` module in `MicroUtils`.
|
||||||
|
|
||||||
|
1. [What may do this generator](#what-may-do-this-generator)
|
||||||
|
2. [How to add generator](#how-to-add-generator)
|
||||||
|
|
||||||
|
## What may do this generator
|
||||||
|
|
||||||
|
Let's imagine you want to have shortcuts in koin, to get something easily:
|
||||||
|
|
||||||
|
```kotlin
|
||||||
|
val koin: Koin// some initialization
|
||||||
|
|
||||||
|
val someUrl = koin.serverUrl
|
||||||
|
```
|
||||||
|
|
||||||
|
So, in that case you may mark containing file with next annotation (in the beginning of file):
|
||||||
|
|
||||||
|
```kotlin
|
||||||
|
@file:GenerateKoinDefinition("serverUrl", String::class, nullable = false)
|
||||||
|
```
|
||||||
|
|
||||||
|
If file is called like `Sample.kt`, will be generated file `GeneratedDefinitionsSample.kt` with next content:
|
||||||
|
|
||||||
|
```kotlin
|
||||||
|
public val Scope.serverUrl: String
|
||||||
|
get() = get(named("serverUrl"))
|
||||||
|
|
||||||
|
public val Koin.serverUrl: String
|
||||||
|
get() = get(named("serverUrl"))
|
||||||
|
|
||||||
|
public fun Module.serverUrlSingle(createdAtStart: Boolean = false,
|
||||||
|
definition: Definition<String>): KoinDefinition<String> =
|
||||||
|
single(named("serverUrl"), createdAtStart = createdAtStart, definition = definition)
|
||||||
|
|
||||||
|
public fun Module.serverUrlFactory(definition: Definition<String>):
|
||||||
|
KoinDefinition<String> = factory(named("serverUrl"), definition = definition)
|
||||||
|
```
|
||||||
|
|
||||||
|
Besides, you may use the generics:
|
||||||
|
|
||||||
|
```kotlin
|
||||||
|
@file:GenerateKoinDefinition("sampleInfo", Sample::class, G1::class, G2::class, nullable = false)
|
||||||
|
```
|
||||||
|
|
||||||
|
Will generate:
|
||||||
|
|
||||||
|
```kotlin
|
||||||
|
public val Scope.sampleInfo: Sample<G1, G2>
|
||||||
|
get() = get(named("sampleInfo"))
|
||||||
|
|
||||||
|
public val Koin.sampleInfo: Sample<G1, G2>
|
||||||
|
get() = get(named("sampleInfo"))
|
||||||
|
|
||||||
|
public fun Module.sampleInfoSingle(createdAtStart: Boolean = false,
|
||||||
|
definition: Definition<Sample<G1, G2>>): KoinDefinition<Sample<G1, G2>> =
|
||||||
|
single(named("sampleInfo"), createdAtStart = createdAtStart, definition = definition)
|
||||||
|
|
||||||
|
public fun Module.sampleInfoFactory(definition: Definition<Sample<G1, G2>>):
|
||||||
|
KoinDefinition<Sample<G1, G2>> = factory(named("sampleInfo"), definition = definition)
|
||||||
|
```
|
||||||
|
|
||||||
|
In case you wish not to generate single:
|
||||||
|
|
||||||
|
```kotlin
|
||||||
|
@file:GenerateKoinDefinition("sampleInfo", Sample::class, G1::class, G2::class, nullable = false, generateSingle = false)
|
||||||
|
```
|
||||||
|
|
||||||
|
And you will take next code:
|
||||||
|
|
||||||
|
```kotlin
|
||||||
|
public val Scope.sampleInfo: Sample<G1, G2>
|
||||||
|
get() = get(named("sampleInfo"))
|
||||||
|
|
||||||
|
public val Koin.sampleInfo: Sample<G1, G2>
|
||||||
|
get() = get(named("sampleInfo"))
|
||||||
|
|
||||||
|
public fun Module.sampleInfoFactory(definition: Definition<Sample<G1, G2>>):
|
||||||
|
KoinDefinition<Sample<G1, G2>> = factory(named("sampleInfo"), definition = definition)
|
||||||
|
```
|
||||||
|
|
||||||
|
## How to add generator
|
||||||
|
|
||||||
|
**Note: $ksp_version in the samples above is equal to supported `ksp` version presented in `/gradle/libs.versions.toml` of project**
|
||||||
|
|
||||||
|
**Note: $microutils_version in the version of MicroUtils library in your project**
|
||||||
|
|
||||||
|
1. Add `classpath` in `build.gradle` (`classpath "com.google.devtools.ksp:symbol-processing-gradle-plugin:$ksp_version"`)
|
||||||
|
2. Add plugin to the plugins list of your module: `id "com.google.devtools.ksp"`
|
||||||
|
3. In `dependencies` block add to the required target/compile the dependency `dev.inmo:micro_utils.koin.generator:$microutils_version`:
|
||||||
|
```groovy
|
||||||
|
dependencies {
|
||||||
|
add("kspCommonMainMetadata", "dev.inmo:micro_utils.koin.generator:$microutils_version") // will work in commonMain of your multiplatform module
|
||||||
|
add("kspJvm", "dev.inmo:micro_utils.koin.generator:$microutils_version") // will work in main of your JVM module
|
||||||
|
}
|
||||||
|
|
||||||
|
ksp { // this generator do not require any arguments and we should left `ksp` empty
|
||||||
|
}
|
||||||
|
```
|
@ -80,6 +80,11 @@ class Processor(
|
|||||||
it.name,
|
it.name,
|
||||||
targetType,
|
targetType,
|
||||||
).apply {
|
).apply {
|
||||||
|
addKdoc(
|
||||||
|
"""
|
||||||
|
@return Definition by key "${it.name}"
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
getter(
|
getter(
|
||||||
FunSpec.getterBuilder().apply {
|
FunSpec.getterBuilder().apply {
|
||||||
addCode(
|
addCode(
|
||||||
@ -102,6 +107,11 @@ class Processor(
|
|||||||
if (it.generateSingle) {
|
if (it.generateSingle) {
|
||||||
addFunction(
|
addFunction(
|
||||||
FunSpec.builder("${it.name}Single").apply {
|
FunSpec.builder("${it.name}Single").apply {
|
||||||
|
addKdoc(
|
||||||
|
"""
|
||||||
|
Will register [definition] with [org.koin.core.module.Module.single] and key "${it.name}"
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
receiver(Module::class)
|
receiver(Module::class)
|
||||||
addParameter(
|
addParameter(
|
||||||
ParameterSpec.builder(
|
ParameterSpec.builder(
|
||||||
@ -128,6 +138,11 @@ class Processor(
|
|||||||
if (it.generateFactory) {
|
if (it.generateFactory) {
|
||||||
addFunction(
|
addFunction(
|
||||||
FunSpec.builder("${it.name}Factory").apply {
|
FunSpec.builder("${it.name}Factory").apply {
|
||||||
|
addKdoc(
|
||||||
|
"""
|
||||||
|
Will register [definition] with [org.koin.core.module.Module.factory] and key "${it.name}"
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
receiver(Module::class)
|
receiver(Module::class)
|
||||||
addParameter(
|
addParameter(
|
||||||
ParameterSpec.builder(
|
ParameterSpec.builder(
|
||||||
|
@ -12,15 +12,27 @@ import org.koin.core.module.Module
|
|||||||
import org.koin.core.qualifier.named
|
import org.koin.core.qualifier.named
|
||||||
import org.koin.core.scope.Scope
|
import org.koin.core.scope.Scope
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Definition by key "sampleInfo"
|
||||||
|
*/
|
||||||
public val Scope.sampleInfo: Test<String>
|
public val Scope.sampleInfo: Test<String>
|
||||||
get() = get(named("sampleInfo"))
|
get() = get(named("sampleInfo"))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Definition by key "sampleInfo"
|
||||||
|
*/
|
||||||
public val Koin.sampleInfo: Test<String>
|
public val Koin.sampleInfo: Test<String>
|
||||||
get() = get(named("sampleInfo"))
|
get() = get(named("sampleInfo"))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Will register [definition] with [org.koin.core.module.Module.single] and key "sampleInfo"
|
||||||
|
*/
|
||||||
public fun Module.sampleInfoSingle(createdAtStart: Boolean = false,
|
public fun Module.sampleInfoSingle(createdAtStart: Boolean = false,
|
||||||
definition: Definition<Test<String>>): KoinDefinition<Test<String>> =
|
definition: Definition<Test<String>>): KoinDefinition<Test<String>> =
|
||||||
single(named("sampleInfo"), createdAtStart = createdAtStart, definition = definition)
|
single(named("sampleInfo"), createdAtStart = createdAtStart, definition = definition)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Will register [definition] with [org.koin.core.module.Module.factory] and key "sampleInfo"
|
||||||
|
*/
|
||||||
public fun Module.sampleInfoFactory(definition: Definition<Test<String>>):
|
public fun Module.sampleInfoFactory(definition: Definition<Test<String>>):
|
||||||
KoinDefinition<Test<String>> = factory(named("sampleInfo"), definition = definition)
|
KoinDefinition<Test<String>> = factory(named("sampleInfo"), definition = definition)
|
||||||
|
@ -2,6 +2,20 @@ package dev.inmo.micro_utils.koin.annotations
|
|||||||
|
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use this annotation to mark files near to which generator should place generated extensions for koin [org.koin.core.scope.Scope]
|
||||||
|
* and [org.koin.core.Koin]
|
||||||
|
*
|
||||||
|
* @param name Name for definitions. This name will be available as extension for [org.koin.core.scope.Scope] and [org.koin.core.Koin]
|
||||||
|
* @param type Type of extensions. It is base star-typed class
|
||||||
|
* @param typeArgs Generic types for [type]. For example, if [type] == `Something::class` and [typeArgs] == `G1::class,
|
||||||
|
* G2::class`, the result type will be `Something<G1, G2>`
|
||||||
|
* @param nullable In case when true, extension will not throw error when definition has not been registered in koin
|
||||||
|
* @param generateSingle Generate definition factory with [org.koin.core.module.Module.single]. You will be able to use
|
||||||
|
* the extension [org.koin.core.module.Module].[name]Single(createdAtStart/* default false */) { /* your definition */ }
|
||||||
|
* @param generateFactory Generate definition factory with [org.koin.core.module.Module.factory]. You will be able to use
|
||||||
|
* the extension [org.koin.core.module.Module].[name]Factory { /* your definition */ }
|
||||||
|
*/
|
||||||
@Target(AnnotationTarget.FILE)
|
@Target(AnnotationTarget.FILE)
|
||||||
@Repeatable
|
@Repeatable
|
||||||
annotation class GenerateKoinDefinition(
|
annotation class GenerateKoinDefinition(
|
||||||
|
Loading…
Reference in New Issue
Block a user