From 993e46a300c51bf35270be6ac5decf538d56fbdb Mon Sep 17 00:00:00 2001 From: Alexander Maryanovsky Date: Thu, 15 Oct 2026 14:00:02 +0300 Subject: [PATCH 1/5] Update Kotlin to 2.5.0-beta1 --- .../build/AndroidXMultiplatformExtension.kt | 16 ++++------------ .../build/AndroidXForkTargetsExtensions.kt | 4 ++++ .../androidx/build/AndroidXConfiguration.kt | 3 ++- .../jetbrains/androidx/build/ComposePlatforms.kt | 2 -- .../build/JetBrainsCompatibilityVersions.kt | 4 ++-- .../build/AndroidXMultiplatformExtension.kt | 16 ++++------------ .../androidx/build/AndroidXConfiguration.kt | 3 ++- .../jetbrains/androidx/build/ComposePlatforms.kt | 2 -- .../build/JetBrainsCompatibilityVersions.kt | 4 ++-- .../api/desktop/animation-core.api | 3 +++ .../api/runtime-saveable.klib.api | 2 +- compose/runtime/runtime/api/runtime.klib.api | 2 +- .../ui/ui-graphics/api/desktop/ui-graphics.api | 1 + compose/ui/ui-test/api/desktop/ui-test.api | 5 +++++ compose/ui/ui-test/api/ui-test.klib.api | 10 ++++++++++ .../ui/test/platform/Synchronization.skiko.kt | 1 + compose/ui/ui-text/api/desktop/ui-text.api | 5 +++++ compose/ui/ui-text/api/ui-text.klib.api | 10 ++++++++++ .../text/platform/Synchronization.nonAndroid.kt | 1 + compose/ui/ui/api/desktop/ui.api | 7 +++++++ compose/ui/ui/api/ui.klib.api | 10 ++++++++++ .../compose/ui/platform/Synchronization.skiko.kt | 1 + gradle/libs-fork.versions.toml | 5 +++-- gradle/libs.versions.toml | 5 +++-- kruth/kruth/build-fork.gradle | 2 +- .../api/navigation-common.klib.api | 2 +- .../api/navigation-runtime.klib.api | 2 +- 27 files changed, 85 insertions(+), 43 deletions(-) diff --git a/buildSrc-fork/private/src/main/kotlin/androidx/build/AndroidXMultiplatformExtension.kt b/buildSrc-fork/private/src/main/kotlin/androidx/build/AndroidXMultiplatformExtension.kt index f83fd8902da22..c159cedb67d53 100644 --- a/buildSrc-fork/private/src/main/kotlin/androidx/build/AndroidXMultiplatformExtension.kt +++ b/buildSrc-fork/private/src/main/kotlin/androidx/build/AndroidXMultiplatformExtension.kt @@ -496,6 +496,7 @@ abstract class AndroidXMultiplatformExtension(val project: Project) { ) } + @Suppress("DEPRECATION") // Deprecated in Kotlin 2.5 @JvmOverloads fun androidNativeX86(block: Action? = null): KotlinNativeTarget? = potentiallyRedirecting("androidNativeX86") { @@ -507,6 +508,7 @@ abstract class AndroidXMultiplatformExtension(val project: Project) { } } + @Suppress("DEPRECATION") // Deprecated in Kotlin 2.5 @JvmOverloads fun androidNativeX64(block: Action? = null): KotlinNativeTarget? = potentiallyRedirecting("androidNativeX64") { @@ -518,6 +520,7 @@ abstract class AndroidXMultiplatformExtension(val project: Project) { } } + @Suppress("DEPRECATION") // Deprecated in Kotlin 2.5 @JvmOverloads fun androidNativeArm64(block: Action? = null): KotlinNativeTarget? = potentiallyRedirecting("androidNativeArm64") { @@ -529,6 +532,7 @@ abstract class AndroidXMultiplatformExtension(val project: Project) { } } + @Suppress("DEPRECATION") // Deprecated in Kotlin 2.5 @JvmOverloads fun androidNativeArm32(block: Action? = null): KotlinNativeTarget? = potentiallyRedirecting("androidNativeArm32") { @@ -623,7 +627,6 @@ abstract class AndroidXMultiplatformExtension(val project: Project) { @JvmOverloads fun watchos(block: Action? = null): List { return listOfNotNull( - watchosArm32(block), watchosArm64(block), // TODO(https://youtrack.jetbrains.com/issue/CMP-9513) publish it // watchosDeviceArm64() @@ -631,17 +634,6 @@ abstract class AndroidXMultiplatformExtension(val project: Project) { ) } - @JvmOverloads - fun watchosArm32(block: Action? = null): KotlinNativeTarget? = - potentiallyRedirecting("watchosArm32") { - supportedPlatforms.add(PlatformIdentifier.WATCHOS_ARM_32) - if (project.enableMac()) { - kotlinExtension.watchosArm32 { block?.execute(this) } - } else { - null - } - } - @JvmOverloads fun watchosArm64(block: Action? = null): KotlinNativeTarget? = potentiallyRedirecting("watchosArm64") { diff --git a/buildSrc-fork/private/src/main/kotlin/org/jetbrains/androidx/build/AndroidXForkTargetsExtensions.kt b/buildSrc-fork/private/src/main/kotlin/org/jetbrains/androidx/build/AndroidXForkTargetsExtensions.kt index eb87d0c7b38ca..de04bdff202d9 100644 --- a/buildSrc-fork/private/src/main/kotlin/org/jetbrains/androidx/build/AndroidXForkTargetsExtensions.kt +++ b/buildSrc-fork/private/src/main/kotlin/org/jetbrains/androidx/build/AndroidXForkTargetsExtensions.kt @@ -18,6 +18,7 @@ package org.jetbrains.androidx.build import androidx.build.AndroidXMultiplatformExtension import androidx.build.PlatformIdentifier +import androidx.build.configureNode import androidx.build.configurePinnedKotlinLibraries import androidx.build.getVersionByName import androidx.build.multiplatformExtension @@ -82,6 +83,9 @@ fun AndroidXMultiplatformExtension.configureForkWebTarget( } } } + // Test tasks use the project-level Node.js env spec, so configure it here as well + // as in the root project. Otherwise, KGP's default Node.js version is used. + project.configureNode() } val mainCompilation = target.compilations.findByName("main")!! diff --git a/buildSrc-fork/public/src/main/kotlin/androidx/build/AndroidXConfiguration.kt b/buildSrc-fork/public/src/main/kotlin/androidx/build/AndroidXConfiguration.kt index 2261f72fefb92..d99ad7ddce9bb 100644 --- a/buildSrc-fork/public/src/main/kotlin/androidx/build/AndroidXConfiguration.kt +++ b/buildSrc-fork/public/src/main/kotlin/androidx/build/AndroidXConfiguration.kt @@ -44,8 +44,9 @@ enum class KotlinTarget(val apiVersion: KotlinVersion, val catalogVersion: Strin KOTLIN_2_2(KotlinVersion.KOTLIN_2_2, "kotlin22"), KOTLIN_2_3(KotlinVersion.KOTLIN_2_3, "kotlin23"), KOTLIN_2_4(KotlinVersion.KOTLIN_2_4, "kotlin24"), + KOTLIN_2_5(KotlinVersion.KOTLIN_2_5, "kotlin25"), DEFAULT(JETBRAINS_COMPILE_KOTLIN_VERSION), - LATEST(KOTLIN_2_4); + LATEST(KOTLIN_2_5); constructor( kotlinTarget: KotlinTarget diff --git a/buildSrc-fork/public/src/main/kotlin/org/jetbrains/androidx/build/ComposePlatforms.kt b/buildSrc-fork/public/src/main/kotlin/org/jetbrains/androidx/build/ComposePlatforms.kt index 8c5bbc3589389..49e34492f9970 100644 --- a/buildSrc-fork/public/src/main/kotlin/org/jetbrains/androidx/build/ComposePlatforms.kt +++ b/buildSrc-fork/public/src/main/kotlin/org/jetbrains/androidx/build/ComposePlatforms.kt @@ -23,7 +23,6 @@ enum class ComposePlatforms(vararg val alternativeNames: String) { TvosArm64("TvOs"), TvosSimulatorArm64("TvOs"), WatchosArm64("WatchOs"), - WatchosArm32("WatchOs"), WatchosSimulatorArm64("WatchOs"), LinuxX64("Linux"), LinuxArm64("Linux"), @@ -60,7 +59,6 @@ enum class ComposePlatforms(vararg val alternativeNames: String) { val WATCH_OS = EnumSet.of( WatchosArm64, - WatchosArm32, WatchosSimulatorArm64 ) diff --git a/buildSrc-fork/public/src/main/kotlin/org/jetbrains/androidx/build/JetBrainsCompatibilityVersions.kt b/buildSrc-fork/public/src/main/kotlin/org/jetbrains/androidx/build/JetBrainsCompatibilityVersions.kt index b50052e8e85ac..e9bb0f477093b 100644 --- a/buildSrc-fork/public/src/main/kotlin/org/jetbrains/androidx/build/JetBrainsCompatibilityVersions.kt +++ b/buildSrc-fork/public/src/main/kotlin/org/jetbrains/androidx/build/JetBrainsCompatibilityVersions.kt @@ -16,8 +16,8 @@ package org.jetbrains.androidx.build -import androidx.build.KotlinTarget.KOTLIN_2_2 +import androidx.build.KotlinTarget.KOTLIN_2_4 import org.gradle.api.JavaVersion.VERSION_11 val JETBRAINS_MINIMAL_JAVA_VERSION = VERSION_11 -val JETBRAINS_COMPILE_KOTLIN_VERSION = KOTLIN_2_2 +val JETBRAINS_COMPILE_KOTLIN_VERSION = KOTLIN_2_4 diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXMultiplatformExtension.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXMultiplatformExtension.kt index 93252641162c1..875deae0c0892 100644 --- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXMultiplatformExtension.kt +++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXMultiplatformExtension.kt @@ -497,6 +497,7 @@ abstract class AndroidXMultiplatformExtension(val project: Project) { ) } + @Suppress("DEPRECATION") // Deprecated in Kotlin 2.5 @JvmOverloads fun androidNativeX86(block: Action? = null): KotlinNativeTarget? = potentiallyRedirecting("androidNativeX86") { @@ -508,6 +509,7 @@ abstract class AndroidXMultiplatformExtension(val project: Project) { } } + @Suppress("DEPRECATION") // Deprecated in Kotlin 2.5 @JvmOverloads fun androidNativeX64(block: Action? = null): KotlinNativeTarget? = potentiallyRedirecting("androidNativeX64") { @@ -519,6 +521,7 @@ abstract class AndroidXMultiplatformExtension(val project: Project) { } } + @Suppress("DEPRECATION") // Deprecated in Kotlin 2.5 @JvmOverloads fun androidNativeArm64(block: Action? = null): KotlinNativeTarget? = potentiallyRedirecting("androidNativeArm64") { @@ -530,6 +533,7 @@ abstract class AndroidXMultiplatformExtension(val project: Project) { } } + @Suppress("DEPRECATION") // Deprecated in Kotlin 2.5 @JvmOverloads fun androidNativeArm32(block: Action? = null): KotlinNativeTarget? = potentiallyRedirecting("androidNativeArm32") { @@ -624,7 +628,6 @@ abstract class AndroidXMultiplatformExtension(val project: Project) { @JvmOverloads fun watchos(block: Action? = null): List { return listOfNotNull( - watchosArm32(block), watchosArm64(block), // TODO(https://youtrack.jetbrains.com/issue/CMP-9513) publish it // watchosDeviceArm64() @@ -632,17 +635,6 @@ abstract class AndroidXMultiplatformExtension(val project: Project) { ) } - @JvmOverloads - fun watchosArm32(block: Action? = null): KotlinNativeTarget? = - potentiallyRedirecting("watchosArm32") { - supportedPlatforms.add(PlatformIdentifier.WATCHOS_ARM_32) - if (project.enableMac()) { - kotlinExtension.watchosArm32 { block?.execute(this) } - } else { - null - } - } - @JvmOverloads fun watchosArm64(block: Action? = null): KotlinNativeTarget? = potentiallyRedirecting("watchosArm64") { diff --git a/buildSrc/public/src/main/kotlin/androidx/build/AndroidXConfiguration.kt b/buildSrc/public/src/main/kotlin/androidx/build/AndroidXConfiguration.kt index 2261f72fefb92..d99ad7ddce9bb 100644 --- a/buildSrc/public/src/main/kotlin/androidx/build/AndroidXConfiguration.kt +++ b/buildSrc/public/src/main/kotlin/androidx/build/AndroidXConfiguration.kt @@ -44,8 +44,9 @@ enum class KotlinTarget(val apiVersion: KotlinVersion, val catalogVersion: Strin KOTLIN_2_2(KotlinVersion.KOTLIN_2_2, "kotlin22"), KOTLIN_2_3(KotlinVersion.KOTLIN_2_3, "kotlin23"), KOTLIN_2_4(KotlinVersion.KOTLIN_2_4, "kotlin24"), + KOTLIN_2_5(KotlinVersion.KOTLIN_2_5, "kotlin25"), DEFAULT(JETBRAINS_COMPILE_KOTLIN_VERSION), - LATEST(KOTLIN_2_4); + LATEST(KOTLIN_2_5); constructor( kotlinTarget: KotlinTarget diff --git a/buildSrc/public/src/main/kotlin/org/jetbrains/androidx/build/ComposePlatforms.kt b/buildSrc/public/src/main/kotlin/org/jetbrains/androidx/build/ComposePlatforms.kt index 8c5bbc3589389..49e34492f9970 100644 --- a/buildSrc/public/src/main/kotlin/org/jetbrains/androidx/build/ComposePlatforms.kt +++ b/buildSrc/public/src/main/kotlin/org/jetbrains/androidx/build/ComposePlatforms.kt @@ -23,7 +23,6 @@ enum class ComposePlatforms(vararg val alternativeNames: String) { TvosArm64("TvOs"), TvosSimulatorArm64("TvOs"), WatchosArm64("WatchOs"), - WatchosArm32("WatchOs"), WatchosSimulatorArm64("WatchOs"), LinuxX64("Linux"), LinuxArm64("Linux"), @@ -60,7 +59,6 @@ enum class ComposePlatforms(vararg val alternativeNames: String) { val WATCH_OS = EnumSet.of( WatchosArm64, - WatchosArm32, WatchosSimulatorArm64 ) diff --git a/buildSrc/public/src/main/kotlin/org/jetbrains/androidx/build/JetBrainsCompatibilityVersions.kt b/buildSrc/public/src/main/kotlin/org/jetbrains/androidx/build/JetBrainsCompatibilityVersions.kt index b50052e8e85ac..e9bb0f477093b 100644 --- a/buildSrc/public/src/main/kotlin/org/jetbrains/androidx/build/JetBrainsCompatibilityVersions.kt +++ b/buildSrc/public/src/main/kotlin/org/jetbrains/androidx/build/JetBrainsCompatibilityVersions.kt @@ -16,8 +16,8 @@ package org.jetbrains.androidx.build -import androidx.build.KotlinTarget.KOTLIN_2_2 +import androidx.build.KotlinTarget.KOTLIN_2_4 import org.gradle.api.JavaVersion.VERSION_11 val JETBRAINS_MINIMAL_JAVA_VERSION = VERSION_11 -val JETBRAINS_COMPILE_KOTLIN_VERSION = KOTLIN_2_2 +val JETBRAINS_COMPILE_KOTLIN_VERSION = KOTLIN_2_4 diff --git a/compose/animation/animation-core/api/desktop/animation-core.api b/compose/animation/animation-core/api/desktop/animation-core.api index 5962a0d25fcd8..729ba9c8300c7 100644 --- a/compose/animation/animation-core/api/desktop/animation-core.api +++ b/compose/animation/animation-core/api/desktop/animation-core.api @@ -298,7 +298,9 @@ public final class androidx/compose/animation/core/DeferredTransitionState : and } public abstract interface class androidx/compose/animation/core/DurationBasedAnimationSpec : androidx/compose/animation/core/FiniteAnimationSpec { + public synthetic fun vectorize (Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedAnimationSpec; public abstract fun vectorize (Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedDurationBasedAnimationSpec; + public synthetic fun vectorize (Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedFiniteAnimationSpec; } public abstract interface class androidx/compose/animation/core/Easing { @@ -356,6 +358,7 @@ public abstract interface annotation class androidx/compose/animation/core/Exper } public abstract interface class androidx/compose/animation/core/FiniteAnimationSpec : androidx/compose/animation/core/AnimationSpec { + public synthetic fun vectorize (Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedAnimationSpec; public abstract fun vectorize (Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedFiniteAnimationSpec; } diff --git a/compose/runtime/runtime-saveable/api/runtime-saveable.klib.api b/compose/runtime/runtime-saveable/api/runtime-saveable.klib.api index c2f5187d9dd95..d06e6d6228661 100644 --- a/compose/runtime/runtime-saveable/api/runtime-saveable.klib.api +++ b/compose/runtime/runtime-saveable/api/runtime-saveable.klib.api @@ -1,5 +1,5 @@ // Klib ABI Dump -// Targets: [iosArm64, iosSimulatorArm64, js, linuxArm64, linuxX64, macosArm64, mingwX64, tvosArm64, tvosSimulatorArm64, wasmJs, watchosArm32, watchosArm64, watchosSimulatorArm64] +// Targets: [iosArm64, iosSimulatorArm64, js, linuxArm64, linuxX64, macosArm64, mingwX64, tvosArm64, tvosSimulatorArm64, wasmJs, watchosArm64, watchosSimulatorArm64] // Rendering settings: // - Signature version: 2 // - Show manifest properties: true diff --git a/compose/runtime/runtime/api/runtime.klib.api b/compose/runtime/runtime/api/runtime.klib.api index 44f7134b6f355..2dc0857cf2503 100644 --- a/compose/runtime/runtime/api/runtime.klib.api +++ b/compose/runtime/runtime/api/runtime.klib.api @@ -1,5 +1,5 @@ // Klib ABI Dump -// Targets: [iosArm64, iosSimulatorArm64, js, linuxArm64, linuxX64, macosArm64, mingwX64, tvosArm64, tvosSimulatorArm64, wasmJs, watchosArm32, watchosArm64, watchosSimulatorArm64] +// Targets: [iosArm64, iosSimulatorArm64, js, linuxArm64, linuxX64, macosArm64, mingwX64, tvosArm64, tvosSimulatorArm64, wasmJs, watchosArm64, watchosSimulatorArm64] // Rendering settings: // - Signature version: 2 // - Show manifest properties: true diff --git a/compose/ui/ui-graphics/api/desktop/ui-graphics.api b/compose/ui/ui-graphics/api/desktop/ui-graphics.api index bf89af85de982..21ecbc171639e 100644 --- a/compose/ui/ui-graphics/api/desktop/ui-graphics.api +++ b/compose/ui/ui-graphics/api/desktop/ui-graphics.api @@ -793,6 +793,7 @@ public abstract interface class androidx/compose/ui/graphics/PathIterator : java public abstract fun getTolerance ()F public abstract fun hasNext ()Z public abstract fun next ()Landroidx/compose/ui/graphics/PathSegment; + public synthetic fun next ()Ljava/lang/Object; public abstract fun next ([FI)Landroidx/compose/ui/graphics/PathSegment$Type; public static synthetic fun next$default (Landroidx/compose/ui/graphics/PathIterator;[FIILjava/lang/Object;)Landroidx/compose/ui/graphics/PathSegment$Type; } diff --git a/compose/ui/ui-test/api/desktop/ui-test.api b/compose/ui/ui-test/api/desktop/ui-test.api index 086e1aaeb89c4..6404473b3ec63 100644 --- a/compose/ui/ui-test/api/desktop/ui-test.api +++ b/compose/ui/ui-test/api/desktop/ui-test.api @@ -1026,6 +1026,11 @@ public final class androidx/compose/ui/test/TrackpadInjectionScopeKt { public static synthetic fun tripleClick-8c717Hs$default (Landroidx/compose/ui/test/TrackpadInjectionScope;JIILjava/lang/Object;)V } +public final class androidx/compose/ui/test/platform/SynchronizedObject { + public static final field $stable I + public fun ()V +} + public final class androidx/compose/ui/test/v2/ComposeUiTest_skikoKt { public static final fun runComposeUiTest (Lkotlin/jvm/functions/Function2;)V } diff --git a/compose/ui/ui-test/api/ui-test.klib.api b/compose/ui/ui-test/api/ui-test.klib.api index 0cf0689fd81a2..b22cf61569d29 100644 --- a/compose/ui/ui-test/api/ui-test.klib.api +++ b/compose/ui/ui-test/api/ui-test.klib.api @@ -778,8 +778,18 @@ final fun androidx.compose.ui.test/isSelected(): androidx.compose.ui.test/Semant final fun androidx.compose.ui.test/isToggleable(): androidx.compose.ui.test/SemanticsMatcher // androidx.compose.ui.test/isToggleable|isToggleable(){}[0] final inline fun <#A: kotlin/Any?> androidx.compose.ui.test/wrapAssertionErrorsWithNodeInfo(androidx.compose.ui.test/SemanticsSelector, androidx.compose.ui.semantics/SemanticsNode, kotlin/Function0<#A>): #A // androidx.compose.ui.test/wrapAssertionErrorsWithNodeInfo|wrapAssertionErrorsWithNodeInfo(androidx.compose.ui.test.SemanticsSelector;androidx.compose.ui.semantics.SemanticsNode;kotlin.Function0<0:0>){0§}[0] +// Targets: [apple] +final class androidx.compose.ui.test.platform/SynchronizedObject : kotlinx.atomicfu.locks/SynchronizedObject { // androidx.compose.ui.test.platform/SynchronizedObject|null[0] + constructor () // androidx.compose.ui.test.platform/SynchronizedObject.|(){}[0] +} + // Targets: [apple] final fun androidx.compose.ui.test.v2/runComposeUiTest(kotlin.coroutines/SuspendFunction1) // androidx.compose.ui.test.v2/runComposeUiTest|runComposeUiTest(kotlin.coroutines.SuspendFunction1){}[0] +// Targets: [js, wasmJs] +final class androidx.compose.ui.test.platform/SynchronizedObject { // androidx.compose.ui.test.platform/SynchronizedObject|null[0] + constructor () // androidx.compose.ui.test.platform/SynchronizedObject.|(){}[0] +} + // Targets: [js, wasmJs] final fun androidx.compose.ui.test.v2/runComposeUiTest(kotlin.coroutines/SuspendFunction1): kotlinx.coroutines.test.internal/JsPromiseInterfaceForTesting // androidx.compose.ui.test.v2/runComposeUiTest|runComposeUiTest(kotlin.coroutines.SuspendFunction1){}[0] diff --git a/compose/ui/ui-test/src/skikoMain/kotlin/androidx/compose/ui/test/platform/Synchronization.skiko.kt b/compose/ui/ui-test/src/skikoMain/kotlin/androidx/compose/ui/test/platform/Synchronization.skiko.kt index 7c96ae6bba7fb..299836eac0139 100644 --- a/compose/ui/ui-test/src/skikoMain/kotlin/androidx/compose/ui/test/platform/Synchronization.skiko.kt +++ b/compose/ui/ui-test/src/skikoMain/kotlin/androidx/compose/ui/test/platform/Synchronization.skiko.kt @@ -19,6 +19,7 @@ import kotlin.contracts.ExperimentalContracts import kotlin.contracts.InvocationKind import kotlin.contracts.contract +@PublishedApi internal actual class SynchronizedObject : kotlinx.atomicfu.locks.SynchronizedObject() internal actual inline fun makeSynchronizedObject(ref: Any?) = SynchronizedObject() diff --git a/compose/ui/ui-text/api/desktop/ui-text.api b/compose/ui/ui-text/api/desktop/ui-text.api index a3277ab0439e8..82b9e09411ef6 100644 --- a/compose/ui/ui-text/api/desktop/ui-text.api +++ b/compose/ui/ui-text/api/desktop/ui-text.api @@ -1582,6 +1582,11 @@ public final class androidx/compose/ui/text/platform/SynchronizationKt { public static final fun synchronized (Landroidx/compose/ui/text/platform/SynchronizedObject;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; } +public final class androidx/compose/ui/text/platform/SynchronizedObject { + public static final field $stable I + public fun ()V +} + public final class androidx/compose/ui/text/style/BaselineShift { public static final field Companion Landroidx/compose/ui/text/style/BaselineShift$Companion; public static final synthetic fun box-impl (F)Landroidx/compose/ui/text/style/BaselineShift; diff --git a/compose/ui/ui-text/api/ui-text.klib.api b/compose/ui/ui-text/api/ui-text.klib.api index abd422cf01076..f5d898bc8375a 100644 --- a/compose/ui/ui-text/api/ui-text.klib.api +++ b/compose/ui/ui-text/api/ui-text.klib.api @@ -2053,6 +2053,11 @@ final inline fun <#A: kotlin/Any> (androidx.compose.ui.text/AnnotatedString.Buil final inline fun <#A: kotlin/Any?> androidx.compose.ui.text.platform/synchronized(androidx.compose.ui.text.platform/SynchronizedObject, kotlin/Function0<#A>): #A // androidx.compose.ui.text.platform/synchronized|synchronized(androidx.compose.ui.text.platform.SynchronizedObject;kotlin.Function0<0:0>){0§}[0] final inline fun androidx.compose.ui.text/buildAnnotatedString(kotlin/Function1): androidx.compose.ui.text/AnnotatedString // androidx.compose.ui.text/buildAnnotatedString|buildAnnotatedString(kotlin.Function1){}[0] +// Targets: [apple] +final class androidx.compose.ui.text.platform/SynchronizedObject : kotlinx.atomicfu.locks/SynchronizedObject { // androidx.compose.ui.text.platform/SynchronizedObject|null[0] + constructor () // androidx.compose.ui.text.platform/SynchronizedObject.|(){}[0] +} + // Targets: [apple] final fun (platform.Foundation/NSLocale).androidx.compose.ui.text.intl/toComposeLocale(): androidx.compose.ui.text.intl/Locale // androidx.compose.ui.text.intl/toComposeLocale|toComposeLocale@platform.Foundation.NSLocale(){}[0] @@ -2061,3 +2066,8 @@ final val androidx.compose.ui.text.input/androidx_compose_ui_text_input_Platform // Targets: [ios] final fun androidx.compose.ui.text.input/androidx_compose_ui_text_input_PlatformImeOptionsConfiguration$stableprop_getter(): kotlin/Int // androidx.compose.ui.text.input/androidx_compose_ui_text_input_PlatformImeOptionsConfiguration$stableprop_getter|androidx_compose_ui_text_input_PlatformImeOptionsConfiguration$stableprop_getter(){}[0] + +// Targets: [js, wasmJs] +final class androidx.compose.ui.text.platform/SynchronizedObject { // androidx.compose.ui.text.platform/SynchronizedObject|null[0] + constructor () // androidx.compose.ui.text.platform/SynchronizedObject.|(){}[0] +} diff --git a/compose/ui/ui-text/src/nonAndroidMain/kotlin/androidx/compose/ui/text/platform/Synchronization.nonAndroid.kt b/compose/ui/ui-text/src/nonAndroidMain/kotlin/androidx/compose/ui/text/platform/Synchronization.nonAndroid.kt index 310c0c790e3fc..57fc3a6715ad7 100644 --- a/compose/ui/ui-text/src/nonAndroidMain/kotlin/androidx/compose/ui/text/platform/Synchronization.nonAndroid.kt +++ b/compose/ui/ui-text/src/nonAndroidMain/kotlin/androidx/compose/ui/text/platform/Synchronization.nonAndroid.kt @@ -22,6 +22,7 @@ import kotlin.contracts.InvocationKind import kotlin.contracts.contract import kotlin.jvm.JvmName +@PublishedApi internal actual class SynchronizedObject : kotlinx.atomicfu.locks.SynchronizedObject() @Suppress("NOTHING_TO_INLINE") diff --git a/compose/ui/ui/api/desktop/ui.api b/compose/ui/ui/api/desktop/ui.api index 019136476a84d..582f80317001b 100644 --- a/compose/ui/ui/api/desktop/ui.api +++ b/compose/ui/ui/api/desktop/ui.api @@ -3987,6 +3987,11 @@ public final class androidx/compose/ui/platform/SynchronizationKt { public static final fun synchronized (Landroidx/compose/ui/platform/SynchronizedObject;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; } +public final class androidx/compose/ui/platform/SynchronizedObject { + public static final field $stable I + public fun ()V +} + public abstract interface class androidx/compose/ui/platform/TaskDispatchers { public abstract fun getDefault ()Lkotlinx/coroutines/CoroutineDispatcher; public abstract fun getIO ()Lkotlinx/coroutines/CoroutineDispatcher; @@ -4654,6 +4659,7 @@ public final class androidx/compose/ui/window/DialogState_desktopKt { public abstract interface class androidx/compose/ui/window/DialogWindowScope : androidx/compose/ui/window/WindowScope { public abstract fun getWindow ()Landroidx/compose/ui/awt/ComposeDialog; + public synthetic fun getWindow ()Ljava/awt/Window; } public final class androidx/compose/ui/window/Dialog_desktopKt { @@ -4670,6 +4676,7 @@ public final class androidx/compose/ui/window/Dialog_skikoKt { public abstract interface class androidx/compose/ui/window/FrameWindowScope : androidx/compose/ui/window/WindowScope { public abstract fun getWindow ()Landroidx/compose/ui/awt/ComposeWindow; + public synthetic fun getWindow ()Ljava/awt/Window; } public final class androidx/compose/ui/window/MenuBarScope { diff --git a/compose/ui/ui/api/ui.klib.api b/compose/ui/ui/api/ui.klib.api index 8cd30a7ec4b59..6babbe645d024 100644 --- a/compose/ui/ui/api/ui.klib.api +++ b/compose/ui/ui/api/ui.klib.api @@ -4706,6 +4706,11 @@ final inline fun androidx.compose.ui.platform/debugInspectorInfo(crossinline kot final suspend fun (androidx.compose.ui.node/DelegatableNode).androidx.compose.ui.relocation/bringIntoView(kotlin/Function0? = ...) // androidx.compose.ui.relocation/bringIntoView|bringIntoView@androidx.compose.ui.node.DelegatableNode(kotlin.Function0?){}[0] final suspend fun (androidx.compose.ui.platform/PlatformTextInputModifierNode).androidx.compose.ui.platform/establishTextInputSession(kotlin.coroutines/SuspendFunction1): kotlin/Nothing // androidx.compose.ui.platform/establishTextInputSession|establishTextInputSession@androidx.compose.ui.platform.PlatformTextInputModifierNode(kotlin.coroutines.SuspendFunction1){}[0] +// Targets: [apple] +final class androidx.compose.ui.platform/SynchronizedObject : kotlinx.atomicfu.locks/SynchronizedObject { // androidx.compose.ui.platform/SynchronizedObject|null[0] + constructor () // androidx.compose.ui.platform/SynchronizedObject.|(){}[0] +} + // Targets: [ios] abstract interface androidx.compose.ui.uikit/ComposeUIViewControllerDelegate { // androidx.compose.ui.uikit/ComposeUIViewControllerDelegate|null[0] open val preferredStatusBarStyle // androidx.compose.ui.uikit/ComposeUIViewControllerDelegate.preferredStatusBarStyle|{}preferredStatusBarStyle[0] @@ -5013,6 +5018,11 @@ final fun androidx.compose.ui.window/ComposeUIViewController(kotlin/Function1): platform.UIKit/UIViewController // androidx.compose.ui.window/ComposeUIViewController|ComposeUIViewController(kotlin.Function2){}[0] +// Targets: [js, wasmJs] +final class androidx.compose.ui.platform/SynchronizedObject { // androidx.compose.ui.platform/SynchronizedObject|null[0] + constructor () // androidx.compose.ui.platform/SynchronizedObject.|(){}[0] +} + // Targets: [js, wasmJs] final class androidx.compose.ui.window/ComposeViewportConfiguration { // androidx.compose.ui.window/ComposeViewportConfiguration|null[0] final var enableBrowserWindowInsets // androidx.compose.ui.window/ComposeViewportConfiguration.enableBrowserWindowInsets|{}enableBrowserWindowInsets[0] diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/Synchronization.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/Synchronization.skiko.kt index d0e956c9373e6..e67aae779bec5 100644 --- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/Synchronization.skiko.kt +++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/Synchronization.skiko.kt @@ -22,6 +22,7 @@ import kotlin.contracts.InvocationKind import kotlin.contracts.contract import kotlin.jvm.JvmName +@PublishedApi internal actual class SynchronizedObject : kotlinx.atomicfu.locks.SynchronizedObject() @Suppress("NOTHING_TO_INLINE") diff --git a/gradle/libs-fork.versions.toml b/gradle/libs-fork.versions.toml index c05f2c7356d32..bf9b03284f090 100644 --- a/gradle/libs-fork.versions.toml +++ b/gradle/libs-fork.versions.toml @@ -33,7 +33,7 @@ builder = "8.6.0-alpha05" byteBuddy = "1.14.9" asm = "9.7" cmake = "3.22.1" -composeCompilerPlugin = "2.4.20" +composeCompilerPlugin = "2.5.0-Beta1" dagger = "2.57.1" datetime = "0.7.1" dependencyAnalysisGradlePlugin = "2.11.0" @@ -55,7 +55,8 @@ kotlin21 = "2.1.20" kotlin22 = "2.2.20" kotlin23 = "2.3.20" kotlin24 = "2.4.20" -kotlin = "2.4.20" +kotlin25 = "2.5.0-Beta1" +kotlin = "2.5.0-Beta1" kotlinBenchmark = "0.4.14" kotlinGradlePluginAnnotations = "2.3.10" kotlinGradlePluginApi = "2.3.0" diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b58dc53e38013..17f6634ea3397 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -33,7 +33,7 @@ builder = "8.6.0-alpha05" byteBuddy = "1.14.9" asm = "9.7" cmake = "3.22.1" -composeCompilerPlugin = "2.4.20" +composeCompilerPlugin = "2.5.0-Beta1" dagger = "2.57.1" datetime = "0.7.1" dependencyAnalysisGradlePlugin = "2.11.0" @@ -55,7 +55,8 @@ kotlin21 = "2.1.20" kotlin22 = "2.2.20" kotlin23 = "2.3.20" kotlin24 = "2.4.20" -kotlin = "2.4.20" +kotlin25 = "2.5.0-Beta1" +kotlin = "2.5.0-Beta1" kotlinBenchmark = "0.4.14" kotlinGradlePluginAnnotations = "2.3.10" kotlinGradlePluginApi = "2.3.0" diff --git a/kruth/kruth/build-fork.gradle b/kruth/kruth/build-fork.gradle index 0cd76fbd3dafa..af57b110823c4 100644 --- a/kruth/kruth/build-fork.gradle +++ b/kruth/kruth/build-fork.gradle @@ -72,5 +72,5 @@ androidx { legacyDisableKotlinStrictApiMode = true // Temporarily enabled to allow API tracking type = SoftwareType.SNAPSHOT_ONLY_TEST_LIBRARY_WITH_API_TASKS // Used to diff against Google Truth doNotDocumentReason = "Not shipped externally" - kotlinTarget = KotlinTarget.KOTLIN_2_4 + kotlinTarget = KotlinTarget.KOTLIN_2_5 } diff --git a/navigation/navigation-common/api/navigation-common.klib.api b/navigation/navigation-common/api/navigation-common.klib.api index acf411be7f397..1a1d923ac97c6 100644 --- a/navigation/navigation-common/api/navigation-common.klib.api +++ b/navigation/navigation-common/api/navigation-common.klib.api @@ -1,5 +1,5 @@ // Klib ABI Dump -// Targets: [iosArm64, iosSimulatorArm64, js, linuxArm64, linuxX64, macosArm64, tvosArm64, tvosSimulatorArm64, wasmJs, watchosArm32, watchosArm64, watchosSimulatorArm64] +// Targets: [iosArm64, iosSimulatorArm64, js, linuxArm64, linuxX64, macosArm64, tvosArm64, tvosSimulatorArm64, wasmJs, watchosArm64, watchosSimulatorArm64] // Rendering settings: // - Signature version: 2 // - Show manifest properties: true diff --git a/navigation/navigation-runtime/api/navigation-runtime.klib.api b/navigation/navigation-runtime/api/navigation-runtime.klib.api index 78f64f0220702..7109097a9f16b 100644 --- a/navigation/navigation-runtime/api/navigation-runtime.klib.api +++ b/navigation/navigation-runtime/api/navigation-runtime.klib.api @@ -1,5 +1,5 @@ // Klib ABI Dump -// Targets: [iosArm64, iosSimulatorArm64, js, linuxArm64, linuxX64, macosArm64, tvosArm64, tvosSimulatorArm64, wasmJs, watchosArm32, watchosArm64, watchosSimulatorArm64] +// Targets: [iosArm64, iosSimulatorArm64, js, linuxArm64, linuxX64, macosArm64, tvosArm64, tvosSimulatorArm64, wasmJs, watchosArm64, watchosSimulatorArm64] // Rendering settings: // - Signature version: 2 // - Show manifest properties: true From f2b49062ecd8ebe031560ec9eb3f6b4fb43610fb Mon Sep 17 00:00:00 2001 From: Alexander Maryanovsky Date: Mon, 26 Oct 2026 12:42:50 +0200 Subject: [PATCH 2/5] Convert fun interface implementations via lambda to object: notation to work around KT-90466 --- .../androidx/compose/material/TextField.kt | 54 ++++---- .../compose/material3/TextFieldDefaults.kt | 116 +++++++++--------- .../androidx/compose/material3/TimePicker.kt | 54 ++++---- 3 files changed, 119 insertions(+), 105 deletions(-) diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextField.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextField.kt index c21ff962c5c50..4b710893829bb 100644 --- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextField.kt +++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextField.kt @@ -37,6 +37,7 @@ import androidx.compose.foundation.text.input.InputTransformation import androidx.compose.foundation.text.input.KeyboardActionHandler import androidx.compose.foundation.text.input.OutputTransformation import androidx.compose.foundation.text.input.TextFieldBuffer +import androidx.compose.foundation.text.input.TextFieldDecorator import androidx.compose.foundation.text.input.TextFieldLineLimits import androidx.compose.foundation.text.input.TextFieldLineLimits.MultiLine import androidx.compose.foundation.text.input.TextFieldLineLimits.SingleLine @@ -225,35 +226,38 @@ public fun TextField( interactionSource = interactionSource, scrollState = scrollState, lineLimits = lineLimits, - decorator = { innerTextField -> - val textPostTransformation = - if (outputTransformation == null) { - state.text.toString() - } else { - // TODO: use constructor to create TextFieldBuffer from TextFieldState when - // available - lateinit var buffer: TextFieldBuffer - state.edit { buffer = this } - // after edit completes, mutations on buffer are ineffective + decorator = object: TextFieldDecorator { + @Composable + override fun Decoration(innerTextField: @Composable () -> Unit) { + val textPostTransformation = + if (outputTransformation == null) { + state.text.toString() + } else { + // TODO: use constructor to create TextFieldBuffer from TextFieldState when + // available + lateinit var buffer: TextFieldBuffer + state.edit { buffer = this } + // after edit completes, mutations on buffer are ineffective with(outputTransformation) { buffer.transformOutput() } buffer.asCharSequence().toString() } - TextFieldDefaults.TextFieldDecorationBox( - value = textPostTransformation, - visualTransformation = VisualTransformation.None, - innerTextField = innerTextField, - placeholder = placeholder, - label = label, - leadingIcon = leadingIcon, - trailingIcon = trailingIcon, - singleLine = lineLimits == SingleLine, - enabled = enabled, - isError = isError, - interactionSource = interactionSource, - shape = shape, - colors = colors, - ) + TextFieldDefaults.TextFieldDecorationBox( + value = textPostTransformation, + visualTransformation = VisualTransformation.None, + innerTextField = innerTextField, + placeholder = placeholder, + label = label, + leadingIcon = leadingIcon, + trailingIcon = trailingIcon, + singleLine = lineLimits == SingleLine, + enabled = enabled, + isError = isError, + interactionSource = interactionSource, + shape = shape, + colors = colors, + ) + } }, ) } diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextFieldDefaults.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextFieldDefaults.kt index a93b402b6517d..ea277693f0b72 100644 --- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextFieldDefaults.kt +++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextFieldDefaults.kt @@ -179,35 +179,38 @@ public object TextFieldDefaults { unfocusedIndicatorLineThickness = UnfocusedIndicatorThickness, ) }, - ): TextFieldDecorator = TextFieldDecorator { innerTextField -> - val visualText = - if (outputTransformation == null) { - state.text - } else { - val buffer = state.toTextFieldBuffer() - with(outputTransformation) { buffer.transformOutput() } - buffer.asCharSequence() - } + ): TextFieldDecorator = object: TextFieldDecorator { + @Composable + override fun Decoration(innerTextField: @Composable () -> Unit) { + val visualText = + if (outputTransformation == null) { + state.text + } else { + val buffer = state.toTextFieldBuffer() + with(outputTransformation) { buffer.transformOutput() } + buffer.asCharSequence() + } - CommonDecorationBox( - visualText = visualText, - innerTextField = innerTextField, - placeholder = placeholder, - labelPosition = labelPosition.normalize(), - label = label, - leadingIcon = leadingIcon, - trailingIcon = trailingIcon, - prefix = prefix, - suffix = suffix, - supportingText = supportingText, - singleLine = lineLimits == SingleLine, - enabled = enabled, - isError = isError, - interactionSource = interactionSource, - colors = colors, - contentPadding = contentPadding, - container = container, - ) + CommonDecorationBox( + visualText = visualText, + innerTextField = innerTextField, + placeholder = placeholder, + labelPosition = labelPosition.normalize(), + label = label, + leadingIcon = leadingIcon, + trailingIcon = trailingIcon, + prefix = prefix, + suffix = suffix, + supportingText = supportingText, + singleLine = lineLimits == SingleLine, + enabled = enabled, + isError = isError, + interactionSource = interactionSource, + colors = colors, + contentPadding = contentPadding, + container = container, + ) + } } /** @@ -1098,34 +1101,37 @@ public object OutlinedTextFieldDefaults { unfocusedBorderThickness = UnfocusedBorderThickness, ) }, - ): TextFieldDecorator = TextFieldDecorator { innerTextField -> - val visualText = - if (outputTransformation == null) state.text - else { - val buffer = state.toTextFieldBuffer() - with(outputTransformation) { buffer.transformOutput() } - buffer.asCharSequence() - } + ): TextFieldDecorator = object: TextFieldDecorator { + @Composable + override fun Decoration(innerTextField: @Composable () -> Unit) { + val visualText = + if (outputTransformation == null) state.text + else { + val buffer = state.toTextFieldBuffer() + with(outputTransformation) { buffer.transformOutput() } + buffer.asCharSequence() + } - CommonDecorationBox( - visualText = visualText, - innerTextField = innerTextField, - placeholder = placeholder, - labelPosition = labelPosition.normalize(), - label = label, - leadingIcon = leadingIcon, - trailingIcon = trailingIcon, - prefix = prefix, - suffix = suffix, - supportingText = supportingText, - singleLine = lineLimits == SingleLine, - enabled = enabled, - isError = isError, - interactionSource = interactionSource, - colors = colors, - contentPadding = contentPadding, - container = container, - ) + CommonDecorationBox( + visualText = visualText, + innerTextField = innerTextField, + placeholder = placeholder, + labelPosition = labelPosition.normalize(), + label = label, + leadingIcon = leadingIcon, + trailingIcon = trailingIcon, + prefix = prefix, + suffix = suffix, + supportingText = supportingText, + singleLine = lineLimits == SingleLine, + enabled = enabled, + isError = isError, + interactionSource = interactionSource, + colors = colors, + contentPadding = contentPadding, + container = container, + ) + } } /** diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt index e7de109096bd5..eeec1de37e0c8 100644 --- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt +++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt @@ -65,6 +65,7 @@ import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.input.InputTransformation import androidx.compose.foundation.text.input.KeyboardActionHandler import androidx.compose.foundation.text.input.TextFieldBuffer +import androidx.compose.foundation.text.input.TextFieldDecorator import androidx.compose.foundation.text.input.TextFieldLineLimits import androidx.compose.foundation.text.input.TextFieldState import androidx.compose.foundation.text.input.delete @@ -3881,31 +3882,34 @@ private fun TimePickerTextField( 0.90f to Color.Transparent, 1.00f to Color.Transparent, ), - decorator = { innerTextField -> - OutlinedTextFieldDefaults.DecorationBox( - value = textFieldState.text.toString(), - visualTransformation = VisualTransformation.None, - innerTextField = innerTextField, - isError = !isValid, - singleLine = true, - colors = textFieldColors, - enabled = true, - interactionSource = interactionSource, - contentPadding = PaddingValues(0.dp), - container = { - OutlinedTextFieldDefaults.Container( - enabled = true, - isError = !isValid, - interactionSource = interactionSource, - colors = textFieldColors, - shape = - shapes?.timeFieldShape - ?: TimeInputTokens.TimeFieldContainerShape.value, - focusedBorderThickness = 2.dp, - unfocusedBorderThickness = 1.dp, - ) - }, - ) + decorator = object : TextFieldDecorator { + @Composable + override fun Decoration(innerTextField: @Composable (() -> Unit)) { + OutlinedTextFieldDefaults.DecorationBox( + value = textFieldState.text.toString(), + visualTransformation = VisualTransformation.None, + innerTextField = innerTextField, + isError = !isValid, + singleLine = true, + colors = textFieldColors, + enabled = true, + interactionSource = interactionSource, + contentPadding = PaddingValues(0.dp), + container = { + OutlinedTextFieldDefaults.Container( + enabled = true, + isError = !isValid, + interactionSource = interactionSource, + colors = textFieldColors, + shape = + shapes?.timeFieldShape + ?: TimeInputTokens.TimeFieldContainerShape.value, + focusedBorderThickness = 2.dp, + unfocusedBorderThickness = 1.dp, + ) + }, + ) + } }, ) } From b53e6faa7a6419449b985ac85f695adc8b3c59f4 Mon Sep 17 00:00:00 2001 From: Alexander Maryanovsky Date: Sun, 1 Nov 2026 21:17:47 +0200 Subject: [PATCH 3/5] Update Kotlin to 2.5.0-beta2 --- .../src/main/kotlin/androidx/build/AndroidXImplPlugin.kt | 9 +-------- gradle/libs-fork.versions.toml | 6 +++--- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/buildSrc-fork/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt b/buildSrc-fork/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt index 280d2d50324b5..fa4e00d901ed3 100644 --- a/buildSrc-fork/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt +++ b/buildSrc-fork/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt @@ -941,10 +941,7 @@ abstract class AndroidXImplPlugin @Inject constructor() : Plugin { project.setUpBlankProguardFileForJarIfNeeded(javaExtension) project.configureJavaCompilationWarnings(androidXExtension) - if ( - project.multiplatformExtension == null || - project.multiplatformExtension!!.hasJavaEnabled() - ) { + if (project.multiplatformExtension == null) { project.configureDependencyVerification(androidXExtension) { taskProvider -> taskProvider.configure { task -> task.dependsOn(project.tasks.named(JavaPlugin.COMPILE_JAVA_TASK_NAME)) @@ -1653,10 +1650,6 @@ internal fun Project.hasAndroidMultiplatformPlugin(): Boolean = extensions.findByType(AndroidXMultiplatformExtension::class.java)?.hasAndroidMultiplatform() ?: false -@Suppress("DEPRECATION") -internal fun KotlinMultiplatformExtension.hasJavaEnabled(): Boolean = - targets.withType(KotlinJvmTarget::class.java).singleOrNull()?.withJavaEnabled ?: false - internal fun KotlinMultiplatformExtension.hasJvmTarget(): Boolean = targets.withType(KotlinJvmTarget::class.java).isEmpty().not() diff --git a/gradle/libs-fork.versions.toml b/gradle/libs-fork.versions.toml index bf9b03284f090..6046cbb578542 100644 --- a/gradle/libs-fork.versions.toml +++ b/gradle/libs-fork.versions.toml @@ -33,7 +33,7 @@ builder = "8.6.0-alpha05" byteBuddy = "1.14.9" asm = "9.7" cmake = "3.22.1" -composeCompilerPlugin = "2.5.0-Beta1" +composeCompilerPlugin = "2.5.0-Beta2" dagger = "2.57.1" datetime = "0.7.1" dependencyAnalysisGradlePlugin = "2.11.0" @@ -55,8 +55,8 @@ kotlin21 = "2.1.20" kotlin22 = "2.2.20" kotlin23 = "2.3.20" kotlin24 = "2.4.20" -kotlin25 = "2.5.0-Beta1" -kotlin = "2.5.0-Beta1" +kotlin25 = "2.5.0-Beta2" +kotlin = "2.5.0-Beta2" kotlinBenchmark = "0.4.14" kotlinGradlePluginAnnotations = "2.3.10" kotlinGradlePluginApi = "2.3.0" From 0fad367ee77d92ac54eee8043a376989fbe4eae5 Mon Sep 17 00:00:00 2001 From: Alexander Maryanovsky Date: Wed, 11 Nov 2026 14:28:13 +0200 Subject: [PATCH 4/5] Update Kotlin to 2.5.0-RC --- gradle/libs-fork.versions.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle/libs-fork.versions.toml b/gradle/libs-fork.versions.toml index 6046cbb578542..61979ac650f8a 100644 --- a/gradle/libs-fork.versions.toml +++ b/gradle/libs-fork.versions.toml @@ -33,7 +33,7 @@ builder = "8.6.0-alpha05" byteBuddy = "1.14.9" asm = "9.7" cmake = "3.22.1" -composeCompilerPlugin = "2.5.0-Beta2" +composeCompilerPlugin = "2.5.0-RC" dagger = "2.57.1" datetime = "0.7.1" dependencyAnalysisGradlePlugin = "2.11.0" @@ -55,8 +55,8 @@ kotlin21 = "2.1.20" kotlin22 = "2.2.20" kotlin23 = "2.3.20" kotlin24 = "2.4.20" -kotlin25 = "2.5.0-Beta2" -kotlin = "2.5.0-Beta2" +kotlin25 = "2.5.0-RC" +kotlin = "2.5.0-RC" kotlinBenchmark = "0.4.14" kotlinGradlePluginAnnotations = "2.3.10" kotlinGradlePluginApi = "2.3.0" From e7729bea313dff3dcaf877a99aad06db131ac689 Mon Sep 17 00:00:00 2001 From: Alexander Maryanovsky Date: Wed, 11 Nov 2026 14:28:33 +0200 Subject: [PATCH 5/5] Revert "Convert fun interface implementations via lambda to object: notation to work around KT-90466" This reverts commit f2b49062ecd8ebe031560ec9eb3f6b4fb43610fb. --- .../androidx/compose/material/TextField.kt | 54 ++++---- .../compose/material3/TextFieldDefaults.kt | 116 +++++++++--------- .../androidx/compose/material3/TimePicker.kt | 54 ++++---- 3 files changed, 105 insertions(+), 119 deletions(-) diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextField.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextField.kt index 4b710893829bb..c21ff962c5c50 100644 --- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextField.kt +++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextField.kt @@ -37,7 +37,6 @@ import androidx.compose.foundation.text.input.InputTransformation import androidx.compose.foundation.text.input.KeyboardActionHandler import androidx.compose.foundation.text.input.OutputTransformation import androidx.compose.foundation.text.input.TextFieldBuffer -import androidx.compose.foundation.text.input.TextFieldDecorator import androidx.compose.foundation.text.input.TextFieldLineLimits import androidx.compose.foundation.text.input.TextFieldLineLimits.MultiLine import androidx.compose.foundation.text.input.TextFieldLineLimits.SingleLine @@ -226,38 +225,35 @@ public fun TextField( interactionSource = interactionSource, scrollState = scrollState, lineLimits = lineLimits, - decorator = object: TextFieldDecorator { - @Composable - override fun Decoration(innerTextField: @Composable () -> Unit) { - val textPostTransformation = - if (outputTransformation == null) { - state.text.toString() - } else { - // TODO: use constructor to create TextFieldBuffer from TextFieldState when - // available - lateinit var buffer: TextFieldBuffer - state.edit { buffer = this } - // after edit completes, mutations on buffer are ineffective + decorator = { innerTextField -> + val textPostTransformation = + if (outputTransformation == null) { + state.text.toString() + } else { + // TODO: use constructor to create TextFieldBuffer from TextFieldState when + // available + lateinit var buffer: TextFieldBuffer + state.edit { buffer = this } + // after edit completes, mutations on buffer are ineffective with(outputTransformation) { buffer.transformOutput() } buffer.asCharSequence().toString() } - TextFieldDefaults.TextFieldDecorationBox( - value = textPostTransformation, - visualTransformation = VisualTransformation.None, - innerTextField = innerTextField, - placeholder = placeholder, - label = label, - leadingIcon = leadingIcon, - trailingIcon = trailingIcon, - singleLine = lineLimits == SingleLine, - enabled = enabled, - isError = isError, - interactionSource = interactionSource, - shape = shape, - colors = colors, - ) - } + TextFieldDefaults.TextFieldDecorationBox( + value = textPostTransformation, + visualTransformation = VisualTransformation.None, + innerTextField = innerTextField, + placeholder = placeholder, + label = label, + leadingIcon = leadingIcon, + trailingIcon = trailingIcon, + singleLine = lineLimits == SingleLine, + enabled = enabled, + isError = isError, + interactionSource = interactionSource, + shape = shape, + colors = colors, + ) }, ) } diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextFieldDefaults.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextFieldDefaults.kt index ea277693f0b72..a93b402b6517d 100644 --- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextFieldDefaults.kt +++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextFieldDefaults.kt @@ -179,38 +179,35 @@ public object TextFieldDefaults { unfocusedIndicatorLineThickness = UnfocusedIndicatorThickness, ) }, - ): TextFieldDecorator = object: TextFieldDecorator { - @Composable - override fun Decoration(innerTextField: @Composable () -> Unit) { - val visualText = - if (outputTransformation == null) { - state.text - } else { - val buffer = state.toTextFieldBuffer() - with(outputTransformation) { buffer.transformOutput() } - buffer.asCharSequence() - } + ): TextFieldDecorator = TextFieldDecorator { innerTextField -> + val visualText = + if (outputTransformation == null) { + state.text + } else { + val buffer = state.toTextFieldBuffer() + with(outputTransformation) { buffer.transformOutput() } + buffer.asCharSequence() + } - CommonDecorationBox( - visualText = visualText, - innerTextField = innerTextField, - placeholder = placeholder, - labelPosition = labelPosition.normalize(), - label = label, - leadingIcon = leadingIcon, - trailingIcon = trailingIcon, - prefix = prefix, - suffix = suffix, - supportingText = supportingText, - singleLine = lineLimits == SingleLine, - enabled = enabled, - isError = isError, - interactionSource = interactionSource, - colors = colors, - contentPadding = contentPadding, - container = container, - ) - } + CommonDecorationBox( + visualText = visualText, + innerTextField = innerTextField, + placeholder = placeholder, + labelPosition = labelPosition.normalize(), + label = label, + leadingIcon = leadingIcon, + trailingIcon = trailingIcon, + prefix = prefix, + suffix = suffix, + supportingText = supportingText, + singleLine = lineLimits == SingleLine, + enabled = enabled, + isError = isError, + interactionSource = interactionSource, + colors = colors, + contentPadding = contentPadding, + container = container, + ) } /** @@ -1101,37 +1098,34 @@ public object OutlinedTextFieldDefaults { unfocusedBorderThickness = UnfocusedBorderThickness, ) }, - ): TextFieldDecorator = object: TextFieldDecorator { - @Composable - override fun Decoration(innerTextField: @Composable () -> Unit) { - val visualText = - if (outputTransformation == null) state.text - else { - val buffer = state.toTextFieldBuffer() - with(outputTransformation) { buffer.transformOutput() } - buffer.asCharSequence() - } + ): TextFieldDecorator = TextFieldDecorator { innerTextField -> + val visualText = + if (outputTransformation == null) state.text + else { + val buffer = state.toTextFieldBuffer() + with(outputTransformation) { buffer.transformOutput() } + buffer.asCharSequence() + } - CommonDecorationBox( - visualText = visualText, - innerTextField = innerTextField, - placeholder = placeholder, - labelPosition = labelPosition.normalize(), - label = label, - leadingIcon = leadingIcon, - trailingIcon = trailingIcon, - prefix = prefix, - suffix = suffix, - supportingText = supportingText, - singleLine = lineLimits == SingleLine, - enabled = enabled, - isError = isError, - interactionSource = interactionSource, - colors = colors, - contentPadding = contentPadding, - container = container, - ) - } + CommonDecorationBox( + visualText = visualText, + innerTextField = innerTextField, + placeholder = placeholder, + labelPosition = labelPosition.normalize(), + label = label, + leadingIcon = leadingIcon, + trailingIcon = trailingIcon, + prefix = prefix, + suffix = suffix, + supportingText = supportingText, + singleLine = lineLimits == SingleLine, + enabled = enabled, + isError = isError, + interactionSource = interactionSource, + colors = colors, + contentPadding = contentPadding, + container = container, + ) } /** diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt index eeec1de37e0c8..e7de109096bd5 100644 --- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt +++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt @@ -65,7 +65,6 @@ import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.input.InputTransformation import androidx.compose.foundation.text.input.KeyboardActionHandler import androidx.compose.foundation.text.input.TextFieldBuffer -import androidx.compose.foundation.text.input.TextFieldDecorator import androidx.compose.foundation.text.input.TextFieldLineLimits import androidx.compose.foundation.text.input.TextFieldState import androidx.compose.foundation.text.input.delete @@ -3882,34 +3881,31 @@ private fun TimePickerTextField( 0.90f to Color.Transparent, 1.00f to Color.Transparent, ), - decorator = object : TextFieldDecorator { - @Composable - override fun Decoration(innerTextField: @Composable (() -> Unit)) { - OutlinedTextFieldDefaults.DecorationBox( - value = textFieldState.text.toString(), - visualTransformation = VisualTransformation.None, - innerTextField = innerTextField, - isError = !isValid, - singleLine = true, - colors = textFieldColors, - enabled = true, - interactionSource = interactionSource, - contentPadding = PaddingValues(0.dp), - container = { - OutlinedTextFieldDefaults.Container( - enabled = true, - isError = !isValid, - interactionSource = interactionSource, - colors = textFieldColors, - shape = - shapes?.timeFieldShape - ?: TimeInputTokens.TimeFieldContainerShape.value, - focusedBorderThickness = 2.dp, - unfocusedBorderThickness = 1.dp, - ) - }, - ) - } + decorator = { innerTextField -> + OutlinedTextFieldDefaults.DecorationBox( + value = textFieldState.text.toString(), + visualTransformation = VisualTransformation.None, + innerTextField = innerTextField, + isError = !isValid, + singleLine = true, + colors = textFieldColors, + enabled = true, + interactionSource = interactionSource, + contentPadding = PaddingValues(0.dp), + container = { + OutlinedTextFieldDefaults.Container( + enabled = true, + isError = !isValid, + interactionSource = interactionSource, + colors = textFieldColors, + shape = + shapes?.timeFieldShape + ?: TimeInputTokens.TimeFieldContainerShape.value, + focusedBorderThickness = 2.dp, + unfocusedBorderThickness = 1.dp, + ) + }, + ) }, ) }