From cdbb14225445bdf689057bb33828356c9ade3bc7 Mon Sep 17 00:00:00 2001 From: "ghasem.shirdel" Date: Sun, 24 Dec 2023 08:47:11 +0330 Subject: [PATCH 1/2] feat: support object modules --- .../compiler/generator/DefinitionGenerationExt.kt | 7 +++++++ .../koin/compiler/generator/ModuleGenerationExt.kt | 14 ++++++++++---- .../org/koin/compiler/metadata/KoinMetaData.kt | 5 ++++- .../org/koin/compiler/scanner/ModuleScanner.kt | 8 +++++++- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/compiler/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/generator/DefinitionGenerationExt.kt b/compiler/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/generator/DefinitionGenerationExt.kt index 6c23eb5d..4ac027e5 100644 --- a/compiler/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/generator/DefinitionGenerationExt.kt +++ b/compiler/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/generator/DefinitionGenerationExt.kt @@ -39,6 +39,13 @@ fun OutputStream.generateModuleFunctionDeclarationDefinition(def: KoinMetaData.D generateDefinition(def) { "moduleInstance.${def.functionName}" } } +fun OutputStream.generateObjectModuleFunctionDeclarationDefinition( + def: KoinMetaData.Definition.FunctionDefinition, + modulePath: String +) { + generateDefinition(def) { "$modulePath.${def.functionName}" } +} + fun OutputStream.generateFunctionDeclarationDefinition(def: KoinMetaData.Definition.FunctionDefinition) { generateDefinition(def) { "${def.packageName}.${def.functionName}" } } diff --git a/compiler/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/generator/ModuleGenerationExt.kt b/compiler/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/generator/ModuleGenerationExt.kt index e9150f4d..897e9c7d 100644 --- a/compiler/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/generator/ModuleGenerationExt.kt +++ b/compiler/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/generator/ModuleGenerationExt.kt @@ -60,7 +60,7 @@ fun generateClassModule(classFile: OutputStream, module: KoinMetaData.Module) { // to able to call the function on this instance. it is KoinMetaData.Definition.FunctionDefinition && it.isClassFunction - }) { + } && !module.type.isObject) { classFile.appendText("${NEW_LINE}val moduleInstance = $modulePath()") } @@ -82,7 +82,7 @@ private fun generateDefinitions( classFile: OutputStream ) { val standardDefinitions = module.definitions.filter { it.isNotScoped() } - standardDefinitions.forEach { it.generateTargetDefinition(classFile) } + standardDefinitions.forEach { it.generateTargetDefinition(module, classFile) } val scopeDefinitions = module.definitions.filter { it.isScoped() } scopeDefinitions @@ -90,7 +90,7 @@ private fun generateDefinitions( .forEach { (scope, definitions) -> classFile.appendText(generateScope(scope!!)) definitions.forEach { - it.generateTargetDefinition(classFile) + it.generateTargetDefinition(module, classFile) } // close scope classFile.appendText("\n\t\t\t\t}") @@ -98,12 +98,18 @@ private fun generateDefinitions( } private fun KoinMetaData.Definition.generateTargetDefinition( + module: KoinMetaData.Module, classFile: OutputStream ) { when (this) { is KoinMetaData.Definition.FunctionDefinition -> { if (isClassFunction) { - classFile.generateModuleFunctionDeclarationDefinition(this) + if (module.type.isObject) { + val modulePath = "${module.packageName}.${module.name}" + classFile.generateObjectModuleFunctionDeclarationDefinition(this, modulePath) + } else{ + classFile.generateModuleFunctionDeclarationDefinition(this) + } } else { classFile.generateFunctionDeclarationDefinition(this) } diff --git a/compiler/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/metadata/KoinMetaData.kt b/compiler/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/metadata/KoinMetaData.kt index 46ebc10b..bd905e84 100644 --- a/compiler/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/metadata/KoinMetaData.kt +++ b/compiler/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/metadata/KoinMetaData.kt @@ -55,7 +55,10 @@ sealed class KoinMetaData { } enum class ModuleType { - FIELD, CLASS + FIELD, CLASS, OBJECT; + + val isObject: Boolean + get() = this == OBJECT } sealed class Scope { diff --git a/compiler/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/scanner/ModuleScanner.kt b/compiler/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/scanner/ModuleScanner.kt index 31a877ad..53c61ee4 100644 --- a/compiler/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/scanner/ModuleScanner.kt +++ b/compiler/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/scanner/ModuleScanner.kt @@ -32,10 +32,16 @@ class ModuleScanner( val componentScan = getComponentScan(annotations) val name = "$element" + val type = if (declaration.classKind == ClassKind.OBJECT) { + KoinMetaData.ModuleType.OBJECT + } else { + KoinMetaData.ModuleType.CLASS + } + val moduleMetadata = KoinMetaData.Module( packageName = modulePackage, name = name, - type = KoinMetaData.ModuleType.CLASS, + type = type, componentScan = componentScan, includes = includes, visibility = declaration.getVisibility() From c678cad5dcaeed3d2d4a293b731fac245194e9eb Mon Sep 17 00:00:00 2001 From: Ghasem Shirdel Date: Fri, 2 Feb 2024 15:04:00 +0330 Subject: [PATCH 2/2] revert ignored verify list Signed-off-by: Ghasem Shirdel --- .../org/koin/compiler/verify/KoinConfigVerification.kt | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/compiler/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/verify/KoinConfigVerification.kt b/compiler/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/verify/KoinConfigVerification.kt index 6977ba6f..64a79172 100644 --- a/compiler/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/verify/KoinConfigVerification.kt +++ b/compiler/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/verify/KoinConfigVerification.kt @@ -24,12 +24,7 @@ import org.koin.compiler.generator.getFile import org.koin.compiler.metadata.KoinMetaData import java.io.OutputStream -private val ignored = listOf( - "kotlin.Any", - "androidx.lifecycle.SavedStateHandle", - "android.content.Context", - "android.app.Application" -) +private val ignored = listOf("kotlin.Any",) private val classPrefix = "KoinDef" private val generationPackage = "org.koin.ksp.generated"