diff --git a/projects/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/generator/KoinGenerator.kt b/projects/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/generator/KoinGenerator.kt index 769c805..bfd0a7e 100644 --- a/projects/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/generator/KoinGenerator.kt +++ b/projects/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/generator/KoinGenerator.kt @@ -55,7 +55,7 @@ class KoinGenerator( generateDefaultModule: Boolean ) { logger.logging("generate default file ...") - val defaultModuleFile = codeGenerator.getFile(fileName = "Default${defaultModule.hashCode()}") + val defaultModuleFile = codeGenerator.getNewFile(fileName = "Default${defaultModule.hashCode()}") defaultModuleFile.generateDefaultModuleHeader(defaultModule.definitions) generateAllExternalDefinitions(defaultModule, defaultModuleFile) @@ -80,7 +80,7 @@ class KoinGenerator( private fun generateModule(module: KoinMetaData.Module) { logger.logging("generate $module - ${module.type}") // generate class module - val moduleFile = codeGenerator.getFile(fileName = module.generateModuleFileName()) + val moduleFile = codeGenerator.getNewFile(fileName = module.generateModuleFileName()) //TODO Remove isComposeViewModelActive with Koin 4 generateClassModule(moduleFile, module, isComposeViewModelActive) } @@ -96,7 +96,7 @@ class KoinGenerator( } } -fun CodeGenerator.getFile(packageName: String = "org.koin.ksp.generated", fileName: String): OutputStream { +fun CodeGenerator.getNewFile(packageName: String = "org.koin.ksp.generated", fileName: String): OutputStream { return try { createNewFile( Dependencies.ALL_FILES, diff --git a/projects/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/verify/KoinConfigVerification.kt b/projects/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/verify/KoinConfigVerification.kt index a1176bb..51ef2d6 100644 --- a/projects/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/verify/KoinConfigVerification.kt +++ b/projects/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/verify/KoinConfigVerification.kt @@ -20,7 +20,7 @@ import com.google.devtools.ksp.processing.CodeGenerator import com.google.devtools.ksp.processing.KSPLogger import com.google.devtools.ksp.processing.Resolver import com.google.devtools.ksp.symbol.KSDeclaration -import org.koin.compiler.generator.getFile +import org.koin.compiler.generator.getNewFile import org.koin.compiler.metadata.KoinMetaData import java.io.OutputStream @@ -39,38 +39,42 @@ class KoinConfigVerification(val codeGenerator: CodeGenerator, val logger: KSPLo val isAlreadyGenerated = codeGenerator.generatedFile.isEmpty() val alreadyDeclaredTags = arrayListOf() - moduleList - .flatMap { it.definitions } - .forEach { def -> - if (isAlreadyGenerated) { - def.parameters - .filterIsInstance() - .forEach { param -> - if (!param.hasDefault && !param.isNullable && !param.alreadyProvided) { - checkDependencyIsDefined(param, resolver, def) - } - //TODO Check Cycle + val allDefinitions = moduleList.flatMap { it.definitions } + + if (!isAlreadyGenerated) { + val tagFileName = "DefinitionTags-${hashCode()}" + val tagFileStream = writeDefinitionTagFile(tagFileName) + allDefinitions.forEach { def -> + writeDefinitionTag(tagFileStream, def, alreadyDeclaredTags) + } + } else { + allDefinitions.forEach { def -> + def.parameters + .filterIsInstance() + .forEach { param -> + if (!param.hasDefault && !param.isNullable && !param.alreadyProvided) { + checkDependencyIsDefined(param, resolver, def) } - } else { - writeDefinitionTag(def, alreadyDeclaredTags) - } + //TODO Check Cycle + } } + } + } + + private fun writeDefinitionTagFile(tagFileName: String): OutputStream { + val fileStream = codeGenerator.getNewFile(fileName = tagFileName) + fileStream.appendText("package $generationPackage") + return fileStream } private fun writeDefinitionTag( + fileStream: OutputStream, def: KoinMetaData.Definition, alreadyDeclared: ArrayList ) { - val label = def.label - val className = label.capitalize() - val fileName = def.packageCamelCase() + className + fileStream.appendText("\n") - val fileStream = codeGenerator.getFile(fileName = fileName) - fileStream.appendText("package $generationPackage") - - // tag for Class & Functions writeClassTag(def, alreadyDeclared, fileStream) - def.bindings.forEach { writeDefinitionBindingTag(it, alreadyDeclared, fileStream) } }