Skip to content

Commit

Permalink
Merge branch '2.0.0' into toda_k/reproducible-build
Browse files Browse the repository at this point in the history
# Conflicts:
#	projects/koin-ksp-compiler/src/jvmMain/kotlin/org/koin/compiler/verify/KoinTagWriter.kt
  • Loading branch information
arnaudgiuliani committed Dec 23, 2024
2 parents 26437d2 + 29d0266 commit c5afa3a
Show file tree
Hide file tree
Showing 17 changed files with 68 additions and 29 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
uses: actions/setup-java@v3
with:
distribution: 'zulu'
java-version: 11
java-version: 17

- name: Setup Gradle
uses: gradle/gradle-build-action@v2
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,6 @@ classes/
.DS_Store
/build
/captures
.kotlin


9 changes: 9 additions & 0 deletions examples/android-coffee-maker/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ val androidMinSDK : String by project
android {
compileSdk = androidCompileSDK.toInt()
defaultConfig {
namespace = "org.koin.sample.androidx"
minSdk = androidMinSDK.toInt()
applicationId = "org.gradle.kotlin.dsl.samples.androidstudio"
versionCode = 1
Expand All @@ -32,6 +33,14 @@ android {
}
}
}

compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
}

dependencies {
Expand Down
9 changes: 9 additions & 0 deletions examples/android-library/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ val androidMinSDK : String by project
android {
compileSdk = androidCompileSDK.toInt()
defaultConfig {
namespace = "org.koin.sample.android.library"
minSdk = androidMinSDK.toInt()
}
// to use KSP generated Code
Expand All @@ -21,6 +22,14 @@ android {
}
}
}

compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
}

dependencies {
Expand Down
2 changes: 1 addition & 1 deletion examples/gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ kotlin.code.style=official

#Android
android.useAndroidX=true
androidMinSDK=14
androidMinSDK=21
androidCompileSDK=34
12 changes: 6 additions & 6 deletions examples/gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
# /!\ Koin in gradle.properties /!\

# Core
kotlin = "1.9.24"
koin = "3.5.6"
koinAnnotations = "1.4.0"
ksp = "1.9.24-1.0.20"
kotlin = "2.0.21"
koin = "4.0.1-RC2"
koinAnnotations = "2.0.0-Beta2"
ksp = "2.0.21-1.0.28"
junit = "4.13.2"
# Android
agp = "7.4.2"
androidCompat = "1.6.1"
agp = "8.3.2"
androidCompat = "1.7.0"

[libraries]
koin-core = { module = "io.insert-koin:koin-core", version.ref = "koin" }
Expand Down
2 changes: 1 addition & 1 deletion examples/gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
Expand Down
2 changes: 1 addition & 1 deletion projects/gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ org.gradle.parallel=true
#Kotlin
kotlin.code.style=official
#Koin
koinAnnotationsVersion=1.4.0
koinAnnotationsVersion=2.0.0-Beta3
#Android
android.useAndroidX=true
androidMinSDK=14
Expand Down
6 changes: 3 additions & 3 deletions projects/gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
# /!\ Koin in gradle.properties /!\

# Core
kotlin = "1.9.24"
koin = "3.5.6"
ksp = "1.9.24-1.0.20"
kotlin = "2.0.21"
koin = "4.0.0"
ksp = "2.0.21-1.0.28"
publish = "2.0.0"
dokka = "1.9.10"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class DefaultModuleWriter(
override val hasExternalDefinitions: Boolean = true
override val generateModuleBody: Boolean = generateDefaultModule

override fun writeModuleFooter() {
override fun writeModuleFooter(closeBrackets : Boolean) {
writeln(DEFAULT_MODULE_FOOTER)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ class KoinCodeGenerator(

checkAlreadyGenerated(module)

if (module.alreadyGenerated == false && !module.isExpect){
if (module.alreadyGenerated == false){
ClassModuleWriter(codeGenerator, resolver, module).writeModule(isComposeViewModelActive)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,10 @@ abstract class ModuleWriter(

writeEmptyLine()

if (generateModuleBody){
if (module.isExpect){
writeModuleFooter(closeBrackets = false)

} else if (generateModuleBody){
writeModuleFunction()
writeModuleInstance()
writeModuleIncludes()
Expand Down Expand Up @@ -197,10 +200,19 @@ abstract class ModuleWriter(
private fun generateExternalDefinitionCalls(): String =
module.externalDefinitions.joinToString(separator = "\n${TAB}") { "${it.name}()" }

open fun writeModuleFooter() {
writeln(MODULE_FOOTER)
open fun writeModuleFooter(closeBrackets : Boolean = true) {
if (closeBrackets) {
writeln(MODULE_FOOTER)
}

val visibilityString = module.visibility.toSourceString()
writeln("${visibilityString}val $modulePath.module : org.koin.core.module.Module get() = $generatedField")
val actualKeyword = when {
module.isActual -> "actual "
module.isExpect -> "expect "
else -> ""
}
val returnedValue = if (!module.isExpect) " get() = $generatedField" else ""
writeln("${actualKeyword}${visibilityString}val $modulePath.module : org.koin.core.module.Module${returnedValue}")
}

open fun onFinishWriteModule() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ val SCOPED = DefinitionAnnotation("scoped", annotationType = Scoped::class)
val KOIN_VIEWMODEL = DefinitionAnnotation("viewModel", "org.koin.androidx.viewmodel.dsl.viewModel", KoinViewModel::class)

//TODO Remove isComposeViewModelActive with Koin 4
val KOIN_VIEWMODEL_COMPOSE = DefinitionAnnotation("viewModel", "org.koin.compose.viewmodel.dsl.viewModel", KoinViewModel::class)
val KOIN_VIEWMODEL_COMPOSE = DefinitionAnnotation("viewModel", "org.koin.core.module.dsl.viewModel", KoinViewModel::class)

val KOIN_WORKER = DefinitionAnnotation("worker", "org.koin.androidx.workmanager.dsl.worker", KoinWorker::class)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ sealed class KoinMetaData {
val isCreatedAtStart: Boolean? = null,
val visibility: Visibility = Visibility.PUBLIC,
val isDefault: Boolean = false,
val isExpect : Boolean = false
val isExpect : Boolean = false,
val isActual : Boolean = false
) : KoinMetaData() {

var alreadyGenerated : Boolean? = null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ class ModuleScanner(
val isCreatedAtStart = getIsCreatedAtStart(annotations)
val componentScan = getComponentScan(annotations)
val isExpect = declaration.isExpect
val isActual = declaration.isActual

val name = "$element"
val type = if (declaration.classKind == ClassKind.OBJECT) {
Expand All @@ -49,7 +50,8 @@ class ModuleScanner(
includes = includes.toModuleIncludes(),
isCreatedAtStart = isCreatedAtStart,
visibility = declaration.getVisibility(),
isExpect = isExpect
isExpect = isExpect,
isActual = isActual
)

val annotatedFunctions = declaration.getAllFunctions()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,9 @@ fun List<KSValueParameter>.getParameters(): List<KoinMetaData.DefinitionParamete
}

private fun getParameter(param: KSValueParameter): KoinMetaData.DefinitionParameter {
val firstAnnotation = param.annotations.firstOrNull()
// Get the first annotation that is not a Provided annotation
// The [Provided] annotation will be evaluated when making the dependency graph.
val firstAnnotation = param.annotations.filter { it.shortName.asString() != Provided::class.simpleName }.firstOrNull()
val annotationName = firstAnnotation?.shortName?.asString()
val annotationValue = firstAnnotation?.arguments?.getValueArgument()
val paramName = param.name?.asString()
Expand All @@ -105,15 +107,15 @@ private fun getParameter(param: KSValueParameter): KoinMetaData.DefinitionParame
val isLazy = resolvedTypeString.startsWith("Lazy<")

return when (annotationName) {
"${InjectedParam::class.simpleName}" -> KoinMetaData.DefinitionParameter.ParameterInject(name = paramName, isNullable = isNullable, hasDefault = hasDefault)
"${InjectedParam::class.simpleName}" -> KoinMetaData.DefinitionParameter.ParameterInject(name = paramName, isNullable = isNullable, hasDefault = hasDefault,)
"${Property::class.simpleName}" -> KoinMetaData.DefinitionParameter.Property(name = paramName, value = annotationValue, isNullable, hasDefault = hasDefault)
"${Named::class.simpleName}" -> {
val qualifier = firstAnnotation.arguments.getNamed().getValue()
KoinMetaData.DefinitionParameter.Dependency(name = paramName, qualifier = qualifier, isNullable = isNullable, hasDefault = hasDefault, type = resolvedType)
KoinMetaData.DefinitionParameter.Dependency(name = paramName, qualifier = qualifier, isNullable = isNullable, hasDefault = hasDefault, type = resolvedType, alreadyProvided = hasProvidedAnnotation(param))
}
"${Qualifier::class.simpleName}" -> {
val qualifier = firstAnnotation.arguments.getQualifier().getValue()
KoinMetaData.DefinitionParameter.Dependency(name = paramName, qualifier = qualifier, isNullable = isNullable, hasDefault = hasDefault, type = resolvedType)
KoinMetaData.DefinitionParameter.Dependency(name = paramName, qualifier = qualifier, isNullable = isNullable, hasDefault = hasDefault, type = resolvedType, alreadyProvided = hasProvidedAnnotation(param))
}
"${ScopeId::class.simpleName}" -> {
val scopeIdValue: String = firstAnnotation.arguments.getScope().getValue()
Expand All @@ -126,8 +128,7 @@ private fun getParameter(param: KSValueParameter): KoinMetaData.DefinitionParame
isLazy -> KoinMetaData.DependencyKind.Lazy
else -> KoinMetaData.DependencyKind.Single
}
val provided = (annotationName == "${Provided::class.simpleName}")
KoinMetaData.DefinitionParameter.Dependency(name = paramName, hasDefault = hasDefault, kind = kind, isNullable = isNullable, type = resolvedType, alreadyProvided = provided)
KoinMetaData.DefinitionParameter.Dependency(name = paramName, hasDefault = hasDefault, kind = kind, isNullable = isNullable, type = resolvedType, alreadyProvided = hasProvidedAnnotation(param))
}
}
}
Expand All @@ -144,3 +145,7 @@ fun String.filterForbiddenKeywords() : String{
if (it in forbiddenKeywords) "`$it`" else it
}
}

private fun hasProvidedAnnotation(param: KSValueParameter): Boolean {
return param.annotations.any { it.shortName.asString() == Provided::class.simpleName }
}
Original file line number Diff line number Diff line change
Expand Up @@ -147,4 +147,4 @@ class KoinTagWriter(val codeGenerator: CodeGenerator, val logger: KSPLogger) {
fileStream.appendText("\n$tag")
alreadyDeclared.add(tagName)
}
}
}

0 comments on commit c5afa3a

Please sign in to comment.