From 0d28454d847e9a9467630b350c00ecd7403bb0da Mon Sep 17 00:00:00 2001 From: Omar Ismail Date: Mon, 26 Jan 2026 12:33:04 +0000 Subject: [PATCH] Ensure compatibility with older Kotlin consumers Lowering the bundled stdlib version via coreLibrariesVersion. This prevents forcing a stdlib upgrade on our users. We: * Set Kotlin API and language versions to 2.0. * Explicitly set `coreLibrariesVersion` to 2.0.21 to maximize compatibility. * Force JS and Wasm stdlib dependencies to match the toolchain version as work-around for KT-71032 TESTED: ./gradlew clean check . I also published to local repository and checked the .module files for the artifacts and the kotlin-stdlib was correctly set to 2.0.21 --- .../wire/buildsupport/WireBuildPlugin.kt | 78 ++++++++++++++++++- gradle/libs.versions.toml | 2 + wire-gradle-plugin/build.gradle.kts | 2 +- 3 files changed, 77 insertions(+), 5 deletions(-) diff --git a/build-support/src/main/kotlin/com/squareup/wire/buildsupport/WireBuildPlugin.kt b/build-support/src/main/kotlin/com/squareup/wire/buildsupport/WireBuildPlugin.kt index fcaec9ddcb..0329c06d23 100644 --- a/build-support/src/main/kotlin/com/squareup/wire/buildsupport/WireBuildPlugin.kt +++ b/build-support/src/main/kotlin/com/squareup/wire/buildsupport/WireBuildPlugin.kt @@ -24,9 +24,12 @@ import java.io.File import kotlinx.validation.ApiValidationExtension import kotlinx.validation.ExperimentalBCVApi import org.gradle.accessors.dm.LibrariesForLibs +import org.gradle.api.GradleException import org.gradle.api.JavaVersion import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.api.artifacts.VersionCatalog +import org.gradle.api.artifacts.VersionCatalogsExtension import org.gradle.api.distribution.plugins.DistributionPlugin import org.gradle.api.publish.PublishingExtension import org.gradle.api.tasks.SourceSet @@ -47,7 +50,11 @@ import org.gradle.kotlin.dsl.register import org.gradle.kotlin.dsl.withType import org.jetbrains.dokka.gradle.DokkaTask import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import org.jetbrains.kotlin.gradle.dsl.KotlinJsProjectExtension import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension +import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension +import org.jetbrains.kotlin.gradle.dsl.KotlinVersion +import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile @@ -209,10 +216,14 @@ class WireBuildPlugin : Plugin { private fun Project.configureCommonKotlin() { tasks.withType(KotlinCompilationTask::class.java).configureEach { compilerOptions { - freeCompilerArgs.addAll( - "-progressive", // https://kotlinlang.org/docs/whatsnew13.html#progressive-mode - "-Xexpect-actual-classes", - ) + freeCompilerArgs.addAll("-Xexpect-actual-classes") + apiVersion.set(KotlinVersion.KOTLIN_2_0) + languageVersion.set(KotlinVersion.KOTLIN_2_0) + } + } + afterEvaluate { + extensions.findByType(KotlinProjectExtension::class.java)?.apply { + coreLibrariesVersion = project.getVersionByName("kotlinCoreLibrariesVersion") } } @@ -238,6 +249,53 @@ class WireBuildPlugin : Plugin { languageSettings.optIn("kotlinx.cinterop.BetaInteropApi") languageSettings.optIn("kotlinx.cinterop.ExperimentalForeignApi") } + kotlin.configureWebKotlinLibraries() + } + plugins.withId("org.jetbrains.kotlin.js") { + val kotlin = extensions.getByName("kotlin") as KotlinJsProjectExtension + kotlin.configureWebKotlinLibraries() + } + } + + // For KotlinWasm/Js, versions of toolchain and stdlib need to be the same: + // https://youtrack.jetbrains.com/issue/KT-71032 + private fun KotlinProjectExtension.configureWebKotlinLibraries() { + val kotlinVersion = project.getVersionByName("kotlin") + + when (this) { + is KotlinJsProjectExtension -> { + val suffix = "js" + sourceSets.apply { + getByName("main").dependencies { + implementation("org.jetbrains.kotlin:kotlin-stdlib-$suffix:$kotlinVersion") + } + getByName("test").dependencies { + implementation("org.jetbrains.kotlin:kotlin-stdlib-$suffix:$kotlinVersion") + implementation("org.jetbrains.kotlin:kotlin-test-$suffix:$kotlinVersion") + } + } + } + + is KotlinMultiplatformExtension -> { + targets.matching { it.platformType in listOf(KotlinPlatformType.js, KotlinPlatformType.wasm) }.configureEach { + val suffix = when (platformType) { + KotlinPlatformType.js -> "js" + KotlinPlatformType.wasm -> if (targetName.contains("wasi", true)) "wasm-wasi" else "wasm-js" + else -> return@configureEach + } + + this@configureWebKotlinLibraries.sourceSets.apply { + getByName("${targetName}Main").dependencies { + implementation("org.jetbrains.kotlin:kotlin-stdlib-$suffix:$kotlinVersion") + } + + getByName("${targetName}Test").dependencies { + implementation("org.jetbrains.kotlin:kotlin-stdlib-$suffix:$kotlinVersion") + implementation("org.jetbrains.kotlin:kotlin-test-$suffix:$kotlinVersion") + } + } + } + } } } @@ -448,3 +506,15 @@ private class WireBuildExtensionImpl(private val project: Project) : WireBuildEx private val Project.isWireBom get() = name.contains("wire-bom") } + +val Project.versionCatalog: VersionCatalog + get() = project.extensions.getByType(VersionCatalogsExtension::class.java).find("libs").get() + +fun Project.getVersionByName(name: String): String { + val version = versionCatalog.findVersion(name) + return if (version.isPresent) { + version.get().requiredVersion + } else { + throw GradleException("Could not find a version for `$name`") + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 21b28c3be4..35a5a00136 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,6 +14,8 @@ jmh = "1.37" jsr305 = "3.0.2" junit = "4.13.2" kotlin = "2.2.21" +# Set to lower version than KGP version to maximize compatibility +kotlinCoreLibrariesVersion = "2.0.21" kotlinpoet = "2.2.0" ktlint = "0.48.2" moshi = "1.15.2" diff --git a/wire-gradle-plugin/build.gradle.kts b/wire-gradle-plugin/build.gradle.kts index 8329152eaf..aeb839210b 100644 --- a/wire-gradle-plugin/build.gradle.kts +++ b/wire-gradle-plugin/build.gradle.kts @@ -49,8 +49,8 @@ dependencies { compileOnly(gradleApi()) compileOnly(libs.pluginz.android) - compileOnly(libs.pluginz.kotlin) + implementation(libs.pluginz.kotlin) implementation(projects.wireCompiler) implementation(projects.wireKotlinGenerator) implementation(libs.swiftpoet)