Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Config check for ignored types, nullable and provided type #140

Merged
merged 2 commits into from
Jul 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion examples/android-coffee-maker/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -48,5 +48,5 @@ dependencies {

ksp {
arg("KOIN_CONFIG_CHECK","true")
// arg("KOIN_DEFAULT_MODULE","false")
arg("KOIN_DEFAULT_MODULE","false")
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import org.koin.core.parameter.parametersOf
import org.koin.core.qualifier.named
import org.koin.sample.android.library.MyScope
import org.koin.sample.androidx.app.*
import org.koin.sample.androidx.data.ProvidedComponent
import org.koin.sample.androidx.data.TaskDatasource

class MainActivity : AppCompatActivity() {
Expand All @@ -28,6 +29,8 @@ class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

getKoin().declare(MyProvidedComponent())

setContentView(R.layout.main_activity)
title = "Android Coffee Maker"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@ package org.koin.sample.androidx.app
import android.content.Context
import org.koin.core.annotation.Factory
import org.koin.core.annotation.InjectedParam
import org.koin.core.annotation.Provided
import org.koin.sample.androidx.MainActivity
import org.koin.sample.androidx.data.ProvidedComponent

class MyProvidedComponent

@Factory
class MyPresenter(@InjectedParam val mainActivity: MainActivity, @InjectedParam val context: Context)
class MyPresenter(@InjectedParam val mainActivity: MainActivity, val context: Context, @Provided val provided : MyProvidedComponent)
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package org.koin.sample.androidx.data

class ProvidedComponent
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
package org.koin.sample.androidx

import org.junit.Test
import org.koin.android.ext.android.getKoin
import org.koin.core.context.startKoin
import org.koin.core.context.stopKoin
import org.koin.ksp.generated.module
import org.koin.sample.android.library.CommonRepository
import org.koin.sample.android.library.MyScope
import org.koin.sample.androidx.app.MyPresenter
import org.koin.sample.androidx.app.ScopedStuff
import org.koin.sample.androidx.data.DataConsumer
import org.koin.sample.androidx.data.MyDataConsumer
import org.koin.sample.androidx.data.ProvidedComponent
import org.koin.sample.androidx.di.AppModule
import org.koin.sample.androidx.di.DataModule
import org.koin.sample.androidx.repository.RepositoryModule
Expand Down
2 changes: 1 addition & 1 deletion examples/android-library/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -35,5 +35,5 @@ dependencies {

ksp {
arg("KOIN_CONFIG_CHECK","true")
// arg("KOIN_DEFAULT_MODULE","false")
arg("KOIN_DEFAULT_MODULE","false")
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ package org.koin.android.annotation

import kotlin.reflect.KClass

//TODO Seperate Android annotations, to have minimum requirement deps as Android

/**
* ViewModel annotation for Koin definition
Expand All @@ -37,6 +36,7 @@ import kotlin.reflect.KClass
@Target(AnnotationTarget.CLASS,AnnotationTarget.FUNCTION)
annotation class KoinViewModel(val binds: Array<KClass<*>> = [])

//TODO Separate Android annotations, to have minimum requirement deps as Android
/**
* Worker annotation for Koin Definition
* Declare type as `worker` definition
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,13 @@ annotation class Module(val includes: Array<KClass<*>> = [], val createdAtStart:
annotation class ComponentScan(val value: String = "")

/**
*
* Tag a dependency as already provided by Koin (like DSL declaration, or internals)
*/
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.VALUE_PARAMETER)
annotation class Provided

/**
* Internal usage for components discovery in generated package
*
* @param value: package of declared definition
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ class BuilderProcessor(
koinCodeGenerator.generateModules(moduleList, defaultModule, isDefaultModuleActive())

if (isConfigCheckActive()) {
logger.warn("[Experimental] Koin Configuration Check")
logger.warn("Koin Configuration Check")
koinConfigVerification.verifyDefinitionDeclarations(moduleList + defaultModule, resolver)
koinConfigVerification.verifyModuleIncludes(moduleList + defaultModule, resolver)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ class KoinGenerator(
generateDefaultModule: Boolean
) {
logger.logging("generate default file ...")
val defaultModuleFile = codeGenerator.getFile(fileName = "Default")
val defaultModuleFile = codeGenerator.getFile(fileName = "Default${defaultModule.hashCode()}")
defaultModuleFile.generateDefaultModuleHeader(defaultModule.definitions)
generateAllExternalDefinitions(defaultModule, defaultModuleFile)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,7 @@ sealed class KoinMetaData {
val isNullable: Boolean = false,
val scopeId: String? = null,
override val hasDefault: Boolean,
val alreadyProvided : Boolean = false,
val type: KSType, val kind: DependencyKind = DependencyKind.Single
) : DefinitionParameter(isNullable)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,8 @@ private fun getParameter(param: KSValueParameter): KoinMetaData.DefinitionParame
isLazy -> KoinMetaData.DependencyKind.Lazy
else -> KoinMetaData.DependencyKind.Single
}
KoinMetaData.DefinitionParameter.Dependency(name = paramName, hasDefault = hasDefault, kind = kind, isNullable = isNullable, type = resolvedType)
val provided = (annotationName == "${Provided::class.simpleName}")
KoinMetaData.DefinitionParameter.Dependency(name = paramName, hasDefault = hasDefault, kind = kind, isNullable = isNullable, type = resolvedType, alreadyProvided = provided)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.koin.compiler.verify


internal val ignored = listOf(
"kotlin.Any",
"android.content.Context",
"android.app.Application",
"androidx.appcompat.app.AppCompatActivity",
"androidx.appcompat.app.AppCompatActivity",
"androidx.fragment.app.Fragment",
"androidx.lifecycle.SavedStateHandle"
)
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ import org.koin.compiler.generator.getFile
import org.koin.compiler.metadata.KoinMetaData
import java.io.OutputStream

private val ignored = listOf("kotlin.Any",)
private val classPrefix = "KoinDef"
private val generationPackage = "org.koin.ksp.generated"

Expand All @@ -47,10 +46,9 @@ class KoinConfigVerification(val codeGenerator: CodeGenerator, val logger: KSPLo
def.parameters
.filterIsInstance<KoinMetaData.DefinitionParameter.Dependency>()
.forEach { param ->
if (!param.hasDefault){
if (!param.hasDefault && !param.isNullable && !param.alreadyProvided) {
checkDependencyIsDefined(param, resolver, def)
}

//TODO Check Cycle
}
} else {
Expand Down Expand Up @@ -116,8 +114,9 @@ class KoinConfigVerification(val codeGenerator: CodeGenerator, val logger: KSPLo
val scope = (definition.scope as? KoinMetaData.Scope.ClassScope)?.type?.qualifiedName?.asString()
var targetTypeToCheck: KSDeclaration = dependencyToCheck.type.declaration

if (targetTypeToCheck.simpleName.asString() == "List" || targetTypeToCheck.simpleName.asString() == "Lazy"){
targetTypeToCheck = dependencyToCheck.type.arguments.firstOrNull()?.type?.resolve()?.declaration ?: targetTypeToCheck
if (targetTypeToCheck.simpleName.asString() == "List" || targetTypeToCheck.simpleName.asString() == "Lazy") {
targetTypeToCheck =
dependencyToCheck.type.arguments.firstOrNull()?.type?.resolve()?.declaration ?: targetTypeToCheck
}

val parameterFullName = targetTypeToCheck.qualifiedName?.asString()
Expand Down
Loading