Skip to content

Commit 0794883

Browse files
authored
Update Kotlin to 2.3.20 (#166)
* Update Kotlin to 2.3.20 and CMP to 1.10.2 * Replace APIs deprecated as a result of version update with alternatives
1 parent a4ad4c2 commit 0794883

File tree

19 files changed

+154
-3127
lines changed

19 files changed

+154
-3127
lines changed

blueprints/starter/app/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ plugins {
1010
alias(libs.plugins.appPlatform)
1111
alias(libs.plugins.androidApplication)
1212
alias(libs.plugins.kotlinMultiplatform)
13-
alias(libs.plugins.composeHotReload)
1413
alias(libs.plugins.composeMultiplatform)
1514
alias(libs.plugins.composeCompiler)
1615
}

blueprints/starter/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ plugins {
22
alias(libs.plugins.androidApplication) apply false
33
alias(libs.plugins.androidKmpLibrary) apply false
44
alias(libs.plugins.kotlinMultiplatform) apply false
5-
alias(libs.plugins.composeHotReload) apply false
65
alias(libs.plugins.composeMultiplatform) apply false
76
alias(libs.plugins.composeCompiler) apply false
87
alias(libs.plugins.appPlatform)
Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,23 @@
11
[versions]
22
assertk = "0.28.1"
3-
app-platfrom = "0.0.6"
4-
agp = "8.12.2"
3+
app-platfrom = "0.0.8"
4+
agp = "8.13.2"
55
android-compileSdk = "36"
6-
android-minSdk = "21"
6+
android-minSdk = "23"
77
android-targetSdk = "36"
88
androidx-activity-compose = "1.10.1"
99
androidx-lifecycle = "2.9.3"
10-
compose = "1.8.2"
11-
compose-hot-reload = "1.0.0-beta06"
12-
compose-multiplatform = "1.8.2"
10+
compose-material3 = "1.10.0-alpha05"
11+
compose-multiplatform = "1.10.2"
1312
coroutines = "1.10.2"
14-
kotlin = "2.2.10"
13+
kotlin = "2.3.20"
1514
material = "1.7.3"
1615

1716
[libraries]
1817
androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "androidx-activity-compose" }
1918
androidx-lifecycle-viewmodel = { group = "org.jetbrains.androidx.lifecycle", name = "lifecycle-viewmodel", version.ref = "androidx-lifecycle" }
2019
assertk = { module = "com.willowtreeapps.assertk:assertk", version.ref = "assertk" }
21-
compose-material = { module = "org.jetbrains.compose.material3:material3", version.ref = "compose" }
20+
compose-material = { module = "org.jetbrains.compose.material3:material3", version.ref = "compose-material3" }
2221
compose-material-icons = { module = "org.jetbrains.compose.material:material-icons-extended", version.ref = "material" }
2322
kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" }
2423
coroutines-swing = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-swing", version.ref = "coroutines" }
@@ -29,6 +28,5 @@ androidApplication = { id = "com.android.application", version.ref = "agp" }
2928
androidKmpLibrary = { id = "com.android.kotlin.multiplatform.library", version.ref = "agp" }
3029
appPlatform = { id = "software.amazon.app.platform", version.ref = "app-platfrom" }
3130
kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
32-
composeHotReload = { id = "org.jetbrains.compose.hot-reload", version.ref = "compose-hot-reload" }
3331
composeMultiplatform = { id = "org.jetbrains.compose", version.ref = "compose-multiplatform" }
3432
composeCompiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }

blueprints/starter/kotlin-js-store/wasm/yarn.lock

Lines changed: 0 additions & 3030 deletions
Large diffs are not rendered by default.

buildSrc/src/main/kotlin/software/amazon/app/platform/gradle/buildsrc/KmpPlugin.kt

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import org.gradle.api.artifacts.dsl.DependencyHandler
1414
import org.gradle.api.plugins.ExtensionAware
1515
import org.gradle.api.tasks.SourceTask
1616
import org.jetbrains.compose.ComposeExtension
17-
import org.jetbrains.compose.ComposePlugin
1817
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
1918
import software.amazon.app.platform.gradle.buildsrc.AppPlatformExtension.Companion.appPlatformBuildSrc
2019
import software.amazon.app.platform.gradle.buildsrc.Platform.Companion.allPlatforms
@@ -95,8 +94,17 @@ public open class KmpPlugin : Plugin<Project> {
9594

9695
testingSourceSets.forEach { sourceSetName ->
9796
kmpExtension.sourceSets.getByName(sourceSetName).dependencies {
98-
api(libs.findLibrary("coroutines.test").get().get().toString())
99-
api(libs.findLibrary("turbine").get().get().toString())
97+
// Use api for main source sets (testing utility modules) so downstream modules
98+
// get transitive access. Use implementation for test source sets since api is
99+
// deprecated there in Kotlin 2.3.
100+
val isTestSourceSet = sourceSetName.contains("Test", ignoreCase = true)
101+
if (isTestSourceSet) {
102+
implementation(libs.findLibrary("coroutines.test").get().get().toString())
103+
implementation(libs.findLibrary("turbine").get().get().toString())
104+
} else {
105+
api(libs.findLibrary("coroutines.test").get().get().toString())
106+
api(libs.findLibrary("turbine").get().get().toString())
107+
}
100108
}
101109
}
102110

@@ -106,8 +114,14 @@ public open class KmpPlugin : Plugin<Project> {
106114
private fun Project.configureTests() {
107115
testingSourceSets.forEach { sourceSetName ->
108116
kmpExtension.sourceSets.getByName(sourceSetName).dependencies {
109-
api(kotlin("test"))
110-
api(libs.findLibrary("assertk").get().get().toString())
117+
val isTestSourceSet = sourceSetName.contains("Test", ignoreCase = true)
118+
if (isTestSourceSet) {
119+
implementation(kotlin("test"))
120+
implementation(libs.findLibrary("assertk").get().get().toString())
121+
} else {
122+
api(kotlin("test"))
123+
api(libs.findLibrary("assertk").get().get().toString())
124+
}
111125
}
112126
}
113127

@@ -158,19 +172,18 @@ public open class KmpPlugin : Plugin<Project> {
158172
val Project.kmpExtension: KotlinMultiplatformExtension
159173
get() = extensions.getByType(KotlinMultiplatformExtension::class.java)
160174

161-
val Project.composeDependencies: ComposePlugin.Dependencies
162-
get() = ComposePlugin.Dependencies(this)
163-
164175
val Project.composeMultiplatform: ComposeExtension
165176
get() = extensions.getByType(ComposeExtension::class.java)
166177

167178
fun Project.enableCompose() {
168179
plugins.apply(Plugins.COMPOSE_COMPILER)
169180
plugins.apply(Plugins.COMPOSE_MULTIPLATFORM)
170181

182+
val composeVersion = libs.findVersion("compose.multiplatform").get().requiredVersion
183+
171184
kmpExtension.sourceSets.getByName("commonMain").dependencies {
172-
implementation(composeDependencies.runtime)
173-
implementation(composeDependencies.foundation)
185+
implementation("org.jetbrains.compose.runtime:runtime:$composeVersion")
186+
implementation("org.jetbrains.compose.foundation:foundation:$composeVersion")
174187
}
175188

176189
allPlatforms().forEach { platform -> platform.configureCompose() }

buildSrc/src/main/kotlin/software/amazon/app/platform/gradle/buildsrc/Platform.kt

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import org.gradle.api.plugins.JavaPluginExtension
55
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
66
import software.amazon.app.platform.gradle.buildsrc.AppPlugin.App.Companion.app
77
import software.amazon.app.platform.gradle.buildsrc.AppPlugin.Companion.allExportedDependencies
8-
import software.amazon.app.platform.gradle.buildsrc.KmpPlugin.Companion.composeDependencies
98
import software.amazon.app.platform.gradle.buildsrc.KmpPlugin.Companion.kmpExtension
109
import software.amazon.app.platform.gradle.isAppModule
1110

@@ -84,13 +83,31 @@ internal sealed interface Platform {
8483
}
8584

8685
override fun configureCompose() {
86+
val composeVersion = project.libs.findVersion("compose.multiplatform").get().requiredVersion
87+
8788
project.kmpExtension.sourceSets.getByName("desktopMain").dependencies {
88-
implementation(project.composeDependencies.desktop.currentOs)
89+
implementation(
90+
"org.jetbrains.compose.desktop:desktop-jvm-${currentOsTarget()}:$composeVersion"
91+
)
8992
}
9093

9194
project.kmpExtension.sourceSets.getByName("desktopTest").dependencies {
92-
implementation(project.composeDependencies.desktop.uiTestJUnit4)
93-
implementation(project.composeDependencies.desktop.currentOs)
95+
implementation("org.jetbrains.compose.ui:ui-test-junit4:$composeVersion")
96+
implementation(
97+
"org.jetbrains.compose.desktop:desktop-jvm-${currentOsTarget()}:$composeVersion"
98+
)
99+
}
100+
}
101+
102+
private fun currentOsTarget(): String {
103+
val os = System.getProperty("os.name").lowercase()
104+
val arch = System.getProperty("os.arch").lowercase()
105+
return when {
106+
os.contains("mac") || os.contains("darwin") ->
107+
if (arch.contains("aarch64") || arch.contains("arm")) "macos-arm64" else "macos-x64"
108+
os.contains("win") ->
109+
if (arch.contains("aarch64") || arch.contains("arm")) "windows-arm64" else "windows-x64"
110+
else -> if (arch.contains("aarch64") || arch.contains("arm")) "linux-arm64" else "linux-x64"
94111
}
95112
}
96113
}

gradle-plugin/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ buildConfig {
4040
buildConfigField(String, 'APP_PLATFORM_VERSION', property('VERSION_NAME'))
4141
buildConfigField(String, 'MOLECULE_VERSION', libs.versions.molecule.get())
4242
buildConfigField(String, 'ANDROID_COMPOSE_VERSION', libs.versions.android.compose.version.get())
43+
buildConfigField(String, 'COMPOSE_MULTIPLATFORM_VERSION', libs.versions.compose.multiplatform.get())
4344
}
4445

4546
dependencies {

gradle-plugin/src/main/kotlin/software/amazon/app/platform/gradle/AppPlatformExtension.kt

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.google.devtools.ksp.gradle.KspExtension
44
import gradle_plugin.BuildConfig.ANDROID_COMPOSE_VERSION
55
import gradle_plugin.BuildConfig.APP_PLATFORM_GROUP
66
import gradle_plugin.BuildConfig.APP_PLATFORM_VERSION
7+
import gradle_plugin.BuildConfig.COMPOSE_MULTIPLATFORM_VERSION
78
import gradle_plugin.BuildConfig.KOTLIN_INJECT_ANVIL_VERSION
89
import gradle_plugin.BuildConfig.KOTLIN_INJECT_VERSION
910
import gradle_plugin.BuildConfig.MOLECULE_VERSION
@@ -308,8 +309,8 @@ private fun Project.enableComposeUi() {
308309
plugins.apply(PluginIds.COMPOSE_MULTIPLATFORM)
309310

310311
kmpExtension.sourceSets.getByName("commonMain").dependencies {
311-
implementation(composeDependencies.foundation)
312-
implementation(composeDependencies.runtime)
312+
implementation("org.jetbrains.compose.foundation:foundation:$COMPOSE_MULTIPLATFORM_VERSION")
313+
implementation("org.jetbrains.compose.runtime:runtime:$COMPOSE_MULTIPLATFORM_VERSION")
313314

314315
implementation(
315316
"$APP_PLATFORM_GROUP:renderer-compose-multiplatform-public:$APP_PLATFORM_VERSION"
@@ -366,14 +367,16 @@ private fun Project.addKspDependenciesWhenConfigExists(
366367
target.compilations.configureEach { compilation ->
367368
fun configExists(name: String): Boolean = configurations.any { it.name == name }
368369

369-
// The implementationConfigurationName name is
370-
// 'iosSimulatorArm64CompilationImplementation', 'wasmJsTestCompileClasspath' or
371-
// 'desktopCompileClasspath'.
372-
//
373-
// E.g. 'desktopCompileClasspath' with give use 'kspDesktop'
370+
// Derive the KSP configuration name from the target name and compilation name.
371+
// For main compilations: ksp<TargetName> (e.g. kspDesktop, kspIosSimulatorArm64)
372+
// For test compilations: ksp<TargetName>Test (e.g. kspDesktopTest)
373+
val targetName = target.name.capitalize()
374374
var configName =
375-
"ksp" +
376-
compilation.implementationConfigurationName.substringBefore("Compilation").capitalize()
375+
if (compilation.name == "main") {
376+
"ksp$targetName"
377+
} else {
378+
"ksp$targetName${compilation.name.capitalize()}"
379+
}
377380

378381
if (!configExists(configName) && target.platformType == KotlinPlatformType.androidJvm) {
379382
// Android has different naming for some reason.

gradle-plugin/src/main/kotlin/software/amazon/app/platform/gradle/GradleExtensions.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import org.gradle.api.UnknownTaskException
1010
import org.gradle.api.plugins.PluginContainer
1111
import org.gradle.api.project.IsolatedProject
1212
import org.gradle.api.tasks.TaskContainer
13-
import org.jetbrains.compose.ComposePlugin
1413
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
1514

1615
internal fun PluginContainer.withIds(vararg pluginIds: String, action: (Plugin<*>) -> Unit) {
@@ -38,9 +37,6 @@ internal val Project.androidComponents: AndroidComponentsExtension<*, *, *>
3837
internal val Project.kmpExtension: KotlinMultiplatformExtension
3938
get() = extensions.getByType(KotlinMultiplatformExtension::class.java)
4039

41-
internal val Project.composeDependencies: ComposePlugin.Dependencies
42-
get() = ComposePlugin.Dependencies(this)
43-
4440
internal fun TaskContainer.namedOptional(name: String, configurationAction: (Task) -> Unit) {
4541
try {
4642
named(name, configurationAction)

gradle.properties

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@ kotlin.mpp.stability.nowarn=true
1313
kotlin.mpp.androidSourceSetLayoutVersion=2
1414
kotlin.mpp.enableCInteropCommonization=true
1515
kotlin.native.distribution.downloadFromMaven=true
16-
# There are sometimes build errors and the error suggests to enable this flag.
17-
kotlin.native.cacheKind.iosSimulatorArm64=none
16+
# https://youtrack.jetbrains.com/issue/KT-82395
17+
kotlin.incremental.js=false
18+
kotlin.incremental.js.klib=false
1819

1920
org.jetbrains.compose.experimental.uikit.enabled=true
2021

0 commit comments

Comments
 (0)