Skip to content

Commit

Permalink
Fix config chceck, nullable , ignored types or @provided types
Browse files Browse the repository at this point in the history
  • Loading branch information
arnaudgiuliani committed Jul 15, 2024
1 parent d051e4e commit 3ce524a
Show file tree
Hide file tree
Showing 13 changed files with 42 additions and 12 deletions.
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(ProvidedComponent())

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,9 @@ 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

@Factory
class MyPresenter(@InjectedParam val mainActivity: MainActivity, @InjectedParam val context: Context)
class MyPresenter(@InjectedParam val mainActivity: MainActivity, val context: Context)
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 @@ -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

0 comments on commit 3ce524a

Please sign in to comment.