diff --git a/examples/other-ksp/src/main/kotlin/org/koin/example/supertype/Types.kt b/examples/other-ksp/src/main/kotlin/org/koin/example/supertype/Types.kt index 6492838a..9f0631b3 100644 --- a/examples/other-ksp/src/main/kotlin/org/koin/example/supertype/Types.kt +++ b/examples/other-ksp/src/main/kotlin/org/koin/example/supertype/Types.kt @@ -21,5 +21,9 @@ public class C : B(),D class MyType { @Single - class MyChildType + class MyChildType { + @Single + class MyGrandChildType + } + } diff --git a/examples/other-ksp/src/test/kotlin/org.koin.example/TestModule.kt b/examples/other-ksp/src/test/kotlin/org.koin.example/TestModule.kt index 4ddd45e4..0cc24680 100644 --- a/examples/other-ksp/src/test/kotlin/org.koin.example/TestModule.kt +++ b/examples/other-ksp/src/test/kotlin/org.koin.example/TestModule.kt @@ -129,7 +129,8 @@ class TestModule { assertEquals(2,koin.get(named("another-counter")).list.size) assertEquals("another-counter",koin.get().name) - assertNotNull(koin.getOrNull()) + assertNotNull(koin.getOrNull()) + assertNotNull(koin.getOrNull()) } diff --git a/projects/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/generator/DefinitionWriterFactory.kt b/projects/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/generator/DefinitionWriterFactory.kt index 4435ad0a..1d3e1574 100644 --- a/projects/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/generator/DefinitionWriterFactory.kt +++ b/projects/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/generator/DefinitionWriterFactory.kt @@ -48,7 +48,7 @@ class DefinitionWriterFactory( } } // Class - is KoinMetaData.Definition.ClassDefinition -> writer.writeDefinition(definition, prefix = "${definition.packageNamePrefix}${definition.className}", isExternalDefinition = isExternal ?: false) + is KoinMetaData.Definition.ClassDefinition -> writer.writeDefinition(definition, prefix = definition.qualifiedName, isExternalDefinition = isExternal ?: false) } } diff --git a/projects/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/metadata/KoinMetaData.kt b/projects/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/metadata/KoinMetaData.kt index 25959e4d..5e3622a5 100644 --- a/projects/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/metadata/KoinMetaData.kt +++ b/projects/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/metadata/KoinMetaData.kt @@ -203,14 +203,14 @@ sealed class KoinMetaData { qualifier: String?, isCreatedAtStart: Boolean? = null, keyword: DefinitionAnnotation, - val className: String, + val qualifiedName: String, val constructorParameters: List = emptyList(), bindings: List, scope: Scope? = null, isExpect : Boolean, isActual : Boolean ) : Definition( - className, + qualifiedName, constructorParameters, packageName, qualifier, diff --git a/projects/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/scanner/ClassComponentScanner.kt b/projects/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/scanner/ClassComponentScanner.kt index 638ad273..8a30818d 100644 --- a/projects/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/scanner/ClassComponentScanner.kt +++ b/projects/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/scanner/ClassComponentScanner.kt @@ -27,18 +27,16 @@ class ClassComponentScanner( fun createClassDefinition(element: KSAnnotated): KoinMetaData.Definition { val ksClassDeclaration = (element as KSClassDeclaration) - val parent = ksClassDeclaration.parentDeclaration?.simpleName?.asString() - val packageName = (ksClassDeclaration.getPackageName() + (parent?.let { ".$it" } ?: "")).filterForbiddenKeywords() - val className = ksClassDeclaration.simpleName.asString() - + val packageName = ksClassDeclaration.getPackageName().filterForbiddenKeywords() + val qualifiedName = ksClassDeclaration.qualifiedName?.asString() ?: "" val qualifier = ksClassDeclaration.getQualifier() val annotations = element.getKoinAnnotations() val scopeAnnotation = annotations.getScopeAnnotation() return if (scopeAnnotation != null){ - createClassDefinition(element, scopeAnnotation.second, ksClassDeclaration, scopeAnnotation.first, packageName, qualifier, className, annotations) + createClassDefinition(element, scopeAnnotation.second, ksClassDeclaration, scopeAnnotation.first, packageName, qualifier, qualifiedName, annotations) } else { annotations.firstNotNullOf { (annotationName, annotation) -> - createClassDefinition(element, annotation, ksClassDeclaration, annotationName, packageName, qualifier, className, annotations) + createClassDefinition(element, annotation, ksClassDeclaration, annotationName, packageName, qualifier, qualifiedName, annotations) } } } @@ -50,7 +48,7 @@ class ClassComponentScanner( annotationName: String, packageName: String, qualifier: String?, - className: String, + qualifiedName: String, annotations: Map = emptyMap() ): KoinMetaData.Definition.ClassDefinition { val declaredBindings = declaredBindings(annotation) @@ -64,23 +62,26 @@ class ClassComponentScanner( return when (annotationName) { SINGLE.annotationName -> { - createSingleDefinition(annotation, packageName, qualifier, className, ctorParams, allBindings, isExpect, isActual = isActual) + createSingleDefinition(annotation, packageName, qualifier, qualifiedName, ctorParams, allBindings, isExpect, isActual = isActual) } + SINGLETON.annotationName -> { - createSingleDefinition(annotation, packageName, qualifier, className, ctorParams, allBindings, isExpect, isActual = isActual) + createSingleDefinition(annotation, packageName, qualifier, qualifiedName, ctorParams, allBindings, isExpect, isActual = isActual) } + FACTORY.annotationName -> { - createClassDefinition(FACTORY,packageName, qualifier, className, ctorParams, allBindings, isExpect = isExpect, isActual = isActual) + createClassDefinition(FACTORY,packageName, qualifier, qualifiedName, ctorParams, allBindings, isExpect = isExpect, isActual = isActual) } + KOIN_VIEWMODEL.annotationName -> { - createClassDefinition(KOIN_VIEWMODEL,packageName, qualifier, className, ctorParams, allBindings, isExpect = isExpect, isActual = isActual) + createClassDefinition(KOIN_VIEWMODEL,packageName, qualifier, qualifiedName, ctorParams, allBindings, isExpect = isExpect, isActual = isActual) } KOIN_WORKER.annotationName -> { - createClassDefinition(KOIN_WORKER,packageName, qualifier, className, ctorParams, allBindings, isExpect = isExpect, isActual = isActual) + createClassDefinition(KOIN_WORKER,packageName, qualifier, qualifiedName, ctorParams, allBindings, isExpect = isExpect, isActual = isActual) } SCOPE.annotationName -> { val (scopeData, extraScopeBindings, extraAnnotationDefinition) = getAnnotationScopeData(annotation, annotations, allBindings) - createClassDefinition(extraAnnotationDefinition ?: SCOPE,packageName, qualifier, className, ctorParams, extraScopeBindings,scope = scopeData, isExpect = isExpect, isActual = isActual) + createClassDefinition(extraAnnotationDefinition ?: SCOPE,packageName, qualifier, qualifiedName, ctorParams, extraScopeBindings,scope = scopeData, isExpect = isExpect, isActual = isActual) } else -> error("Unknown annotation type: $annotationName") } @@ -90,7 +91,7 @@ class ClassComponentScanner( annotation: KSAnnotation, packageName: String, qualifier: String?, - className: String, + qualifiedName: String, ctorParams: List?, allBindings: List, isExpect : Boolean, @@ -98,14 +99,14 @@ class ClassComponentScanner( ): KoinMetaData.Definition.ClassDefinition { val createdAtStart: Boolean = annotation.arguments.firstOrNull { it.name?.asString() == "createdAtStart" }?.value as Boolean? ?: false - return createClassDefinition(SINGLE, packageName, qualifier, className, ctorParams, allBindings, isCreatedAtStart = createdAtStart, isExpect= isExpect, isActual = isActual) + return createClassDefinition(SINGLE, packageName, qualifier, qualifiedName, ctorParams, allBindings, isCreatedAtStart = createdAtStart, isExpect= isExpect, isActual = isActual) } private fun createClassDefinition( keyword : DefinitionAnnotation, packageName: String, qualifier: String?, - className: String, + qualifiedName: String, ctorParams: List?, allBindings: List, isCreatedAtStart : Boolean? = null, @@ -117,7 +118,7 @@ class ClassComponentScanner( packageName = packageName, qualifier = qualifier, isCreatedAtStart = isCreatedAtStart, - className = className, + qualifiedName = qualifiedName, constructorParameters = ctorParams ?: emptyList(), bindings = allBindings, keyword = keyword,