diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/DefaultKotlinJavaToolchain.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/DefaultKotlinJavaToolchain.kt index 9f7b0d2335f..a5bafcd3ba2 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/DefaultKotlinJavaToolchain.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/DefaultKotlinJavaToolchain.kt @@ -16,6 +16,7 @@ import org.gradle.api.model.ObjectFactory import org.gradle.api.plugins.JavaPluginExtension import org.gradle.api.provider.Property import org.gradle.api.provider.Provider +import org.gradle.api.provider.ProviderFactory import org.gradle.api.tasks.Internal import org.gradle.internal.jvm.Jvm import org.gradle.jvm.toolchain.* @@ -32,6 +33,7 @@ import javax.inject.Inject internal abstract class DefaultKotlinJavaToolchain @Inject constructor( private val objects: ObjectFactory, projectLayout: ProjectLayout, + providerFactory: ProviderFactory, jvmCompilerOptions: () -> KotlinJvmCompilerOptions? ) : KotlinJavaToolchain { @@ -86,13 +88,14 @@ internal abstract class DefaultKotlinJavaToolchain @Inject constructor( .chainedFinalizeValueOnRead() private fun getToolsJarFromJvm( + providerFactory: ProviderFactory, jvmProvider: Provider, javaVersionProvider: Provider ): Provider { return objects .propertyWithConvention( javaVersionProvider.flatMap { javaVersion -> - jvmProvider.map { jvm -> + jvmProvider.mapOrNull(providerFactory) { jvm -> jvm.toolsJar.also { if (it == null && javaVersion < JavaVersion.VERSION_1_9) { throw GradleException( @@ -107,10 +110,11 @@ internal abstract class DefaultKotlinJavaToolchain @Inject constructor( } @get:Internal - internal val jdkToolsJar: Provider = getToolsJarFromJvm(buildJvm, javaVersion) + internal val jdkToolsJar: Provider = getToolsJarFromJvm(providerFactory, buildJvm, javaVersion) @get:Internal internal val currentJvmJdkToolsJar: Provider = getToolsJarFromJvm( + providerFactory, gradleJvm, gradleJvm.map { // Current JVM should always have java version diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/providerApiUtils.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/providerApiUtils.kt index dd9da0c59c9..d1ac989bedc 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/providerApiUtils.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/providerApiUtils.kt @@ -16,6 +16,13 @@ import org.gradle.api.provider.* import java.io.File import kotlin.reflect.KProperty +// Workaround for https://github.com/gradle/gradle/issues/12388 +// which should be fixed via https://github.com/gradle/gradle/issues/24767 +internal fun Provider.mapOrNull( + providerFactory: ProviderFactory, + block: (IN) -> OUT? +): Provider = flatMap { providerFactory.provider { (block(it)) } } + internal operator fun Provider.getValue(thisRef: Any?, property: KProperty<*>) = get() internal operator fun Property.setValue(thisRef: Any?, property: KProperty<*>, value: T) {