mirror of
https://github.com/InsanusMokrassar/MicroUtils.git
synced 2024-12-23 17:17:14 +00:00
commit
b6ef818613
@ -1,5 +1,14 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 0.19.3
|
||||||
|
|
||||||
|
* `Koin`
|
||||||
|
* `Generator`
|
||||||
|
* New getter methods now available with opportunity to use parameters
|
||||||
|
* Old notation `*Single` and `*Factory` is deprecated since this release. With old
|
||||||
|
will be generated new `single*` and `factory*` notations for new generations
|
||||||
|
* Add opportunity to use generic-oriented koin definitions
|
||||||
|
|
||||||
## 0.19.2
|
## 0.19.2
|
||||||
|
|
||||||
* `Versions`:
|
* `Versions`:
|
||||||
|
@ -14,5 +14,5 @@ crypto_js_version=4.1.1
|
|||||||
# Project data
|
# Project data
|
||||||
|
|
||||||
group=dev.inmo
|
group=dev.inmo
|
||||||
version=0.19.2
|
version=0.19.3
|
||||||
android_code_version=198
|
android_code_version=199
|
||||||
|
@ -9,19 +9,28 @@ import com.google.devtools.ksp.processing.Resolver
|
|||||||
import com.google.devtools.ksp.processing.SymbolProcessor
|
import com.google.devtools.ksp.processing.SymbolProcessor
|
||||||
import com.google.devtools.ksp.symbol.KSAnnotated
|
import com.google.devtools.ksp.symbol.KSAnnotated
|
||||||
import com.google.devtools.ksp.symbol.KSFile
|
import com.google.devtools.ksp.symbol.KSFile
|
||||||
|
import com.google.devtools.ksp.symbol.Modifier
|
||||||
|
import com.squareup.kotlinpoet.AnnotationSpec
|
||||||
import com.squareup.kotlinpoet.ClassName
|
import com.squareup.kotlinpoet.ClassName
|
||||||
|
import com.squareup.kotlinpoet.CodeBlock
|
||||||
import com.squareup.kotlinpoet.FileSpec
|
import com.squareup.kotlinpoet.FileSpec
|
||||||
import com.squareup.kotlinpoet.FunSpec
|
import com.squareup.kotlinpoet.FunSpec
|
||||||
|
import com.squareup.kotlinpoet.KModifier
|
||||||
import com.squareup.kotlinpoet.ParameterSpec
|
import com.squareup.kotlinpoet.ParameterSpec
|
||||||
|
import com.squareup.kotlinpoet.ParameterizedTypeName
|
||||||
import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
|
import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
|
||||||
import com.squareup.kotlinpoet.PropertySpec
|
import com.squareup.kotlinpoet.PropertySpec
|
||||||
|
import com.squareup.kotlinpoet.TypeName
|
||||||
|
import com.squareup.kotlinpoet.TypeVariableName
|
||||||
import com.squareup.kotlinpoet.asTypeName
|
import com.squareup.kotlinpoet.asTypeName
|
||||||
import com.squareup.kotlinpoet.ksp.toClassName
|
import com.squareup.kotlinpoet.ksp.toClassName
|
||||||
import com.squareup.kotlinpoet.ksp.toTypeName
|
import com.squareup.kotlinpoet.ksp.toTypeName
|
||||||
import com.squareup.kotlinpoet.ksp.writeTo
|
import com.squareup.kotlinpoet.ksp.writeTo
|
||||||
|
import dev.inmo.micro_utils.koin.annotations.GenerateGenericKoinDefinition
|
||||||
import dev.inmo.micro_utils.koin.annotations.GenerateKoinDefinition
|
import dev.inmo.micro_utils.koin.annotations.GenerateKoinDefinition
|
||||||
import org.koin.core.Koin
|
import org.koin.core.Koin
|
||||||
import org.koin.core.module.Module
|
import org.koin.core.module.Module
|
||||||
|
import org.koin.core.parameter.ParametersDefinition
|
||||||
import org.koin.core.scope.Scope
|
import org.koin.core.scope.Scope
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
@ -32,11 +41,236 @@ class Processor(
|
|||||||
private val definitionClassName = ClassName("org.koin.core.definition", "Definition")
|
private val definitionClassName = ClassName("org.koin.core.definition", "Definition")
|
||||||
private val koinDefinitionClassName = ClassName("org.koin.core.definition", "KoinDefinition")
|
private val koinDefinitionClassName = ClassName("org.koin.core.definition", "KoinDefinition")
|
||||||
|
|
||||||
|
private fun FileSpec.Builder.addCodeForType(
|
||||||
|
targetType: TypeName,
|
||||||
|
name: String,
|
||||||
|
nullable: Boolean,
|
||||||
|
generateSingle: Boolean,
|
||||||
|
generateFactory: Boolean,
|
||||||
|
) {
|
||||||
|
val targetTypeAsGenericType = (targetType as? TypeVariableName) ?.copy(reified = true)
|
||||||
|
|
||||||
|
fun addGetterProperty(
|
||||||
|
receiver: KClass<*>
|
||||||
|
) {
|
||||||
|
addProperty(
|
||||||
|
PropertySpec.builder(
|
||||||
|
name,
|
||||||
|
targetType,
|
||||||
|
).apply {
|
||||||
|
addKdoc(
|
||||||
|
"""
|
||||||
|
@return Definition by key "${name}"
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
|
getter(
|
||||||
|
FunSpec.getterBuilder().apply {
|
||||||
|
targetTypeAsGenericType ?.let {
|
||||||
|
addModifiers(KModifier.INLINE)
|
||||||
|
}
|
||||||
|
addCode(
|
||||||
|
"return " + (if (nullable) {
|
||||||
|
"getOrNull"
|
||||||
|
} else {
|
||||||
|
"get"
|
||||||
|
}) + "(named(\"${name}\"))"
|
||||||
|
)
|
||||||
|
}.build()
|
||||||
|
)
|
||||||
|
targetTypeAsGenericType ?.let {
|
||||||
|
addTypeVariable(it)
|
||||||
|
}
|
||||||
|
receiver(receiver)
|
||||||
|
}.build()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targetTypeAsGenericType == null) {
|
||||||
|
addGetterProperty(Scope::class)
|
||||||
|
addGetterProperty(Koin::class)
|
||||||
|
}
|
||||||
|
|
||||||
|
val parametersDefinitionClassName = ClassName(
|
||||||
|
"org.koin.core.parameter",
|
||||||
|
"ParametersDefinition"
|
||||||
|
)
|
||||||
|
fun addGetterMethod(
|
||||||
|
receiver: KClass<*>
|
||||||
|
) {
|
||||||
|
addFunction(
|
||||||
|
FunSpec.builder(
|
||||||
|
name
|
||||||
|
).apply {
|
||||||
|
addKdoc(
|
||||||
|
"""
|
||||||
|
@return Definition by key "${name}" with [parameters]
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
|
receiver(receiver)
|
||||||
|
addParameter(
|
||||||
|
ParameterSpec(
|
||||||
|
"parameters",
|
||||||
|
parametersDefinitionClassName.let {
|
||||||
|
if (targetTypeAsGenericType != null) {
|
||||||
|
it.copy(nullable = true)
|
||||||
|
} else {
|
||||||
|
it
|
||||||
|
}
|
||||||
|
},
|
||||||
|
KModifier.NOINLINE
|
||||||
|
).toBuilder().apply {
|
||||||
|
if (targetTypeAsGenericType != null) {
|
||||||
|
defaultValue("null")
|
||||||
|
}
|
||||||
|
}.build()
|
||||||
|
)
|
||||||
|
addModifiers(KModifier.INLINE)
|
||||||
|
targetTypeAsGenericType ?.let {
|
||||||
|
addTypeVariable(it)
|
||||||
|
returns(it)
|
||||||
|
} ?: returns(targetType)
|
||||||
|
addCode(
|
||||||
|
"return " + (if (nullable) {
|
||||||
|
"getOrNull"
|
||||||
|
} else {
|
||||||
|
"get"
|
||||||
|
}) + "(named(\"${name}\"), parameters)"
|
||||||
|
)
|
||||||
|
}.build()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
addGetterMethod(Scope::class)
|
||||||
|
addGetterMethod(Koin::class)
|
||||||
|
|
||||||
|
fun FunSpec.Builder.addDefinitionParameter() {
|
||||||
|
val definitionModifiers = if (targetTypeAsGenericType == null) {
|
||||||
|
arrayOf()
|
||||||
|
} else {
|
||||||
|
arrayOf(KModifier.NOINLINE)
|
||||||
|
}
|
||||||
|
addParameter(
|
||||||
|
ParameterSpec.builder(
|
||||||
|
"definition",
|
||||||
|
definitionClassName.parameterizedBy(targetType.copy(nullable = false)),
|
||||||
|
*definitionModifiers
|
||||||
|
).build()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (generateSingle) {
|
||||||
|
fun FunSpec.Builder.configure(
|
||||||
|
useInstead: String? = null
|
||||||
|
) {
|
||||||
|
addKdoc(
|
||||||
|
"""
|
||||||
|
Will register [definition] with [org.koin.core.module.Module.single] and key "${name}"
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
|
receiver(Module::class)
|
||||||
|
addParameter(
|
||||||
|
ParameterSpec.builder(
|
||||||
|
"createdAtStart",
|
||||||
|
Boolean::class
|
||||||
|
).apply {
|
||||||
|
defaultValue("false")
|
||||||
|
}.build()
|
||||||
|
)
|
||||||
|
addDefinitionParameter()
|
||||||
|
returns(koinDefinitionClassName.parameterizedBy(targetType.copy(nullable = false)))
|
||||||
|
addCode(
|
||||||
|
"return single(named(\"${name}\"), createdAtStart = createdAtStart, definition = definition)"
|
||||||
|
)
|
||||||
|
targetTypeAsGenericType ?.let {
|
||||||
|
addTypeVariable(it)
|
||||||
|
addModifiers(KModifier.INLINE)
|
||||||
|
}
|
||||||
|
if (useInstead != null) {
|
||||||
|
addAnnotation(
|
||||||
|
AnnotationSpec.builder(
|
||||||
|
Deprecated::class
|
||||||
|
).apply {
|
||||||
|
addMember(
|
||||||
|
CodeBlock.of(
|
||||||
|
"""
|
||||||
|
"This definition is old style and should not be used anymore. Use $useInstead instead"
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
addMember(CodeBlock.of("ReplaceWith(\"$useInstead\")"))
|
||||||
|
}.build()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val actualSingleName = "single${name.replaceFirstChar { it.uppercase() }}"
|
||||||
|
if (targetTypeAsGenericType == null) { // classic type
|
||||||
|
addFunction(
|
||||||
|
FunSpec.builder("${name}Single").apply { configure(actualSingleName) }.build()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
addFunction(
|
||||||
|
FunSpec.builder(actualSingleName).apply { configure() }.build()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (generateFactory) {
|
||||||
|
fun FunSpec.Builder.configure(
|
||||||
|
useInstead: String? = null
|
||||||
|
) {
|
||||||
|
addKdoc(
|
||||||
|
"""
|
||||||
|
Will register [definition] with [org.koin.core.module.Module.factory] and key "${name}"
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
|
receiver(Module::class)
|
||||||
|
addDefinitionParameter()
|
||||||
|
returns(koinDefinitionClassName.parameterizedBy(targetType.copy(nullable = false)))
|
||||||
|
addCode(
|
||||||
|
"return factory(named(\"${name}\"), definition = definition)"
|
||||||
|
)
|
||||||
|
targetTypeAsGenericType ?.let {
|
||||||
|
addTypeVariable(it)
|
||||||
|
addModifiers(KModifier.INLINE)
|
||||||
|
}
|
||||||
|
if (useInstead != null) {
|
||||||
|
addAnnotation(
|
||||||
|
AnnotationSpec.builder(
|
||||||
|
Deprecated::class
|
||||||
|
).apply {
|
||||||
|
addMember(
|
||||||
|
CodeBlock.of(
|
||||||
|
"""
|
||||||
|
"This definition is old style and should not be used anymore. Use $useInstead instead"
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
addMember(CodeBlock.of("ReplaceWith(\"$useInstead\")"))
|
||||||
|
}.build()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val actualFactoryName = "factory${name.replaceFirstChar { it.uppercase() }}"
|
||||||
|
if (targetTypeAsGenericType == null) { // classic type
|
||||||
|
addFunction(
|
||||||
|
FunSpec.builder("${name}Factory").apply { configure(useInstead = actualFactoryName) }.build()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
addFunction(
|
||||||
|
FunSpec.builder(actualFactoryName).apply { configure() }.build()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
addImport("org.koin.core.qualifier", "named")
|
||||||
|
}
|
||||||
|
|
||||||
@OptIn(KspExperimental::class)
|
@OptIn(KspExperimental::class)
|
||||||
override fun process(resolver: Resolver): List<KSAnnotated> {
|
override fun process(resolver: Resolver): List<KSAnnotated> {
|
||||||
resolver.getSymbolsWithAnnotation(
|
(resolver.getSymbolsWithAnnotation(
|
||||||
GenerateKoinDefinition::class.qualifiedName!!
|
GenerateKoinDefinition::class.qualifiedName!!
|
||||||
).filterIsInstance<KSFile>().forEach { ksFile ->
|
) + resolver.getSymbolsWithAnnotation(
|
||||||
|
GenerateGenericKoinDefinition::class.qualifiedName!!
|
||||||
|
)).filterIsInstance<KSFile>().forEach { ksFile ->
|
||||||
FileSpec.builder(
|
FileSpec.builder(
|
||||||
ksFile.packageName.asString(),
|
ksFile.packageName.asString(),
|
||||||
"GeneratedDefinitions${ksFile.fileName.removeSuffix(".kt")}"
|
"GeneratedDefinitions${ksFile.fileName.removeSuffix(".kt")}"
|
||||||
@ -72,92 +306,12 @@ class Processor(
|
|||||||
}.copy(
|
}.copy(
|
||||||
nullable = it.nullable
|
nullable = it.nullable
|
||||||
)
|
)
|
||||||
fun addGetterProperty(
|
|
||||||
receiver: KClass<*>
|
|
||||||
) {
|
|
||||||
addProperty(
|
|
||||||
PropertySpec.builder(
|
|
||||||
it.name,
|
|
||||||
targetType,
|
|
||||||
).apply {
|
|
||||||
addKdoc(
|
|
||||||
"""
|
|
||||||
@return Definition by key "${it.name}"
|
|
||||||
""".trimIndent()
|
|
||||||
)
|
|
||||||
getter(
|
|
||||||
FunSpec.getterBuilder().apply {
|
|
||||||
addCode(
|
|
||||||
"return " + (if (it.nullable) {
|
|
||||||
"getOrNull"
|
|
||||||
} else {
|
|
||||||
"get"
|
|
||||||
}) + "(named(\"${it.name}\"))"
|
|
||||||
)
|
|
||||||
}.build()
|
|
||||||
)
|
|
||||||
receiver(receiver)
|
|
||||||
}.build()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
addGetterProperty(Scope::class)
|
addCodeForType(targetType, it.name, it.nullable, it.generateSingle, it.generateFactory)
|
||||||
addGetterProperty(Koin::class)
|
|
||||||
|
|
||||||
if (it.generateSingle) {
|
|
||||||
addFunction(
|
|
||||||
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)
|
|
||||||
addParameter(
|
|
||||||
ParameterSpec.builder(
|
|
||||||
"createdAtStart",
|
|
||||||
Boolean::class
|
|
||||||
).apply {
|
|
||||||
defaultValue("false")
|
|
||||||
}.build()
|
|
||||||
)
|
|
||||||
addParameter(
|
|
||||||
ParameterSpec.builder(
|
|
||||||
"definition",
|
|
||||||
definitionClassName.parameterizedBy(targetType.copy(nullable = false))
|
|
||||||
).build()
|
|
||||||
)
|
|
||||||
returns(koinDefinitionClassName.parameterizedBy(targetType.copy(nullable = false)))
|
|
||||||
addCode(
|
|
||||||
"return single(named(\"${it.name}\"), createdAtStart = createdAtStart, definition = definition)"
|
|
||||||
)
|
|
||||||
}.build()
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
ksFile.getAnnotationsByType(GenerateGenericKoinDefinition::class).forEach {
|
||||||
if (it.generateFactory) {
|
val targetType = TypeVariableName("T", Any::class)
|
||||||
addFunction(
|
addCodeForType(targetType, it.name, it.nullable, it.generateSingle, it.generateFactory)
|
||||||
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)
|
|
||||||
addParameter(
|
|
||||||
ParameterSpec.builder(
|
|
||||||
"definition",
|
|
||||||
definitionClassName.parameterizedBy(targetType.copy(nullable = false))
|
|
||||||
).build()
|
|
||||||
)
|
|
||||||
returns(koinDefinitionClassName.parameterizedBy(targetType.copy(nullable = false)))
|
|
||||||
addCode(
|
|
||||||
"return factory(named(\"${it.name}\"), definition = definition)"
|
|
||||||
)
|
|
||||||
}.build()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
addImport("org.koin.core.qualifier", "named")
|
|
||||||
}
|
}
|
||||||
}.build().let {
|
}.build().let {
|
||||||
File(
|
File(
|
||||||
|
@ -3,12 +3,15 @@
|
|||||||
// ORIGINAL FILE: Test.kt
|
// ORIGINAL FILE: Test.kt
|
||||||
package dev.inmo.micro_utils.koin.generator.test
|
package dev.inmo.micro_utils.koin.generator.test
|
||||||
|
|
||||||
|
import kotlin.Any
|
||||||
import kotlin.Boolean
|
import kotlin.Boolean
|
||||||
|
import kotlin.Deprecated
|
||||||
import kotlin.String
|
import kotlin.String
|
||||||
import org.koin.core.Koin
|
import org.koin.core.Koin
|
||||||
import org.koin.core.definition.Definition
|
import org.koin.core.definition.Definition
|
||||||
import org.koin.core.definition.KoinDefinition
|
import org.koin.core.definition.KoinDefinition
|
||||||
import org.koin.core.module.Module
|
import org.koin.core.module.Module
|
||||||
|
import org.koin.core.parameter.ParametersDefinition
|
||||||
import org.koin.core.qualifier.named
|
import org.koin.core.qualifier.named
|
||||||
import org.koin.core.scope.Scope
|
import org.koin.core.scope.Scope
|
||||||
|
|
||||||
@ -24,15 +27,73 @@ public val Scope.sampleInfo: Test<String>
|
|||||||
public val Koin.sampleInfo: Test<String>
|
public val Koin.sampleInfo: Test<String>
|
||||||
get() = get(named("sampleInfo"))
|
get() = get(named("sampleInfo"))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Definition by key "sampleInfo" with [parameters]
|
||||||
|
*/
|
||||||
|
public inline fun Scope.sampleInfo(noinline parameters: ParametersDefinition): Test<String> =
|
||||||
|
get(named("sampleInfo"), parameters)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Definition by key "sampleInfo" with [parameters]
|
||||||
|
*/
|
||||||
|
public inline fun Koin.sampleInfo(noinline parameters: ParametersDefinition): Test<String> =
|
||||||
|
get(named("sampleInfo"), parameters)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Will register [definition] with [org.koin.core.module.Module.single] and key "sampleInfo"
|
* Will register [definition] with [org.koin.core.module.Module.single] and key "sampleInfo"
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(
|
||||||
|
"This definition is old style and should not be used anymore. Use singleSampleInfo instead",
|
||||||
|
ReplaceWith("singleSampleInfo"),
|
||||||
|
)
|
||||||
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.single] and key "sampleInfo"
|
||||||
|
*/
|
||||||
|
public fun Module.singleSampleInfo(createdAtStart: Boolean = false,
|
||||||
|
definition: Definition<Test<String>>): KoinDefinition<Test<String>> =
|
||||||
|
single(named("sampleInfo"), createdAtStart = createdAtStart, definition = definition)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Will register [definition] with [org.koin.core.module.Module.factory] and key "sampleInfo"
|
* Will register [definition] with [org.koin.core.module.Module.factory] and key "sampleInfo"
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(
|
||||||
|
"This definition is old style and should not be used anymore. Use factorySampleInfo instead",
|
||||||
|
ReplaceWith("factorySampleInfo"),
|
||||||
|
)
|
||||||
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)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Will register [definition] with [org.koin.core.module.Module.factory] and key "sampleInfo"
|
||||||
|
*/
|
||||||
|
public fun Module.factorySampleInfo(definition: Definition<Test<String>>):
|
||||||
|
KoinDefinition<Test<String>> = factory(named("sampleInfo"), definition = definition)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Definition by key "test" with [parameters]
|
||||||
|
*/
|
||||||
|
public inline fun <reified T : Any> Scope.test(noinline parameters: ParametersDefinition? = null): T
|
||||||
|
= get(named("test"), parameters)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Definition by key "test" with [parameters]
|
||||||
|
*/
|
||||||
|
public inline fun <reified T : Any> Koin.test(noinline parameters: ParametersDefinition? = null): T
|
||||||
|
= get(named("test"), parameters)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Will register [definition] with [org.koin.core.module.Module.single] and key "test"
|
||||||
|
*/
|
||||||
|
public inline fun <reified T : Any> Module.singleTest(createdAtStart: Boolean = false, noinline
|
||||||
|
definition: Definition<T>): KoinDefinition<T> = single(named("test"), createdAtStart =
|
||||||
|
createdAtStart, definition = definition)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Will register [definition] with [org.koin.core.module.Module.factory] and key "test"
|
||||||
|
*/
|
||||||
|
public inline fun <reified T : Any> Module.factoryTest(noinline definition: Definition<T>):
|
||||||
|
KoinDefinition<T> = factory(named("test"), definition = definition)
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
@file:GenerateKoinDefinition("sampleInfo", Test::class, String::class, nullable = false)
|
@file:GenerateKoinDefinition("sampleInfo", Test::class, String::class, nullable = false)
|
||||||
|
@file:GenerateGenericKoinDefinition("test", nullable = false)
|
||||||
package dev.inmo.micro_utils.koin.generator.test
|
package dev.inmo.micro_utils.koin.generator.test
|
||||||
|
|
||||||
|
import dev.inmo.micro_utils.koin.annotations.GenerateGenericKoinDefinition
|
||||||
import dev.inmo.micro_utils.koin.annotations.GenerateKoinDefinition
|
import dev.inmo.micro_utils.koin.annotations.GenerateKoinDefinition
|
||||||
import org.koin.core.Koin
|
import org.koin.core.Koin
|
||||||
|
|
||||||
|
@ -0,0 +1,26 @@
|
|||||||
|
package dev.inmo.micro_utils.koin.annotations
|
||||||
|
|
||||||
|
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)
|
||||||
|
@Repeatable
|
||||||
|
annotation class GenerateGenericKoinDefinition(
|
||||||
|
val name: String,
|
||||||
|
val nullable: Boolean = true,
|
||||||
|
val generateSingle: Boolean = true,
|
||||||
|
val generateFactory: Boolean = true
|
||||||
|
)
|
Loading…
Reference in New Issue
Block a user