[Gradle] Ensure java source sets being created eagerly for 'withJava'

^KT-60158 Verification Pending
This commit is contained in:
Sebastian Sellmair
2023-07-07 20:49:55 +02:00
committed by Space Team
parent 42d648f775
commit 817e3de8f5
4 changed files with 39 additions and 25 deletions
@@ -545,9 +545,15 @@ open class NewMultiplatformIT : BaseGradleIT() {
}
gradleBuildScript().modify {
if (testJavaSupportInJvmTargets) {
"""
apply plugin: 'com.github.johnrengelman.shadow'
apply plugin: 'application'
apply plugin: 'kotlin-kapt' // Check that Kapts works, generates and compiles sources
""".trimIndent() + if (testJavaSupportInJvmTargets) {
it + "\nkotlin.jvm(\"jvm6\") { " +
"${KotlinJvmTarget::withJava.name.plus("();").repeat(2)} " + // also check that the function is idempotent
"${
KotlinJvmTarget::withJava.name.plus("();").repeat(2)
} " + // also check that the function is idempotent
"}"
} else {
it.replace("presets.jvm", "presets.jvmWithJava").replace("jvm(", "targetFromPreset(presets.jvmWithJava, ")
@@ -562,10 +568,6 @@ open class NewMultiplatformIT : BaseGradleIT() {
}
}
apply plugin: 'com.github.johnrengelman.shadow'
apply plugin: 'application'
apply plugin: 'kotlin-kapt' // Check that Kapts works, generates and compiles sources
mainClassName = 'com.example.lib.CommonKt'
dependencies {
@@ -29,7 +29,7 @@ import java.util.concurrent.Callable
internal abstract class KotlinSourceSetProcessor<T : AbstractKotlinCompile<*>>(
val tasksProvider: KotlinTasksProvider,
val taskDescription: String,
kotlinCompilation: KotlinCompilationInfo
kotlinCompilation: KotlinCompilationInfo,
) : KotlinCompilationProcessor<T>(kotlinCompilation) {
protected abstract fun doTargetSpecificProcessing()
protected val logger = Logging.getLogger(this.javaClass)!!
@@ -41,13 +41,7 @@ internal abstract class KotlinSourceSetProcessor<T : AbstractKotlinCompile<*>>(
protected val javaSourceSet: SourceSet?
get() = when (val compilation = compilationInfo.safeAs<KotlinCompilationInfo.TCS>()?.origin) {
is KotlinWithJavaCompilation<*, *> -> compilation.javaSourceSet
is KotlinJvmCompilation -> if (compilation.target.withJavaEnabled) {
project.variantImplementationFactory<JavaSourceSetsAccessor.JavaSourceSetsAccessorVariantFactory>()
.getInstance(project)
.sourceSets
.maybeCreate(compilation.name)
} else null
is KotlinJvmCompilation -> compilation.javaSourceSet.getOrNull()
else -> null
}
@@ -154,4 +148,4 @@ internal abstract class KotlinSourceSetProcessor<T : AbstractKotlinCompile<*>>(
}
protected abstract fun doRegisterTask(project: Project, taskName: String): TaskProvider<out T>
}
}
@@ -7,9 +7,11 @@
package org.jetbrains.kotlin.gradle.plugin.mpp
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.SourceSet
import org.gradle.api.tasks.TaskProvider
import org.gradle.api.tasks.compile.JavaCompile
import org.jetbrains.kotlin.gradle.dsl.*
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptions
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions
import org.jetbrains.kotlin.gradle.plugin.HasCompilerOptions
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationWithResources
import org.jetbrains.kotlin.gradle.plugin.internal.JavaSourceSetsAccessor
@@ -17,10 +19,13 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationI
import org.jetbrains.kotlin.gradle.plugin.variantImplementationFactory
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
import org.jetbrains.kotlin.gradle.utils.LenientFuture
import org.jetbrains.kotlin.gradle.utils.future
import org.jetbrains.kotlin.gradle.utils.lenient
import javax.inject.Inject
open class KotlinJvmCompilation @Inject internal constructor(
compilation: KotlinCompilationImpl
compilation: KotlinCompilationImpl,
) : AbstractKotlinCompilationToRunnableFiles<KotlinJvmOptions>(compilation),
KotlinCompilationWithResources<KotlinJvmOptions> {
@@ -62,14 +67,18 @@ open class KotlinJvmCompilation @Inject internal constructor(
* will be enabled after call to this method.
*/
internal val compileJavaTaskProviderSafe: Provider<JavaCompile> = target.project.providers
.provider { if (target.withJavaEnabled) Unit else null }
.map {
project.javaSourceSets.getByName(compilationName).compileJavaTaskName
}
.flatMap {
project.tasks.named(it, JavaCompile::class.java)
.provider { javaSourceSet.getOrNull() }
.flatMap { javaSourceSet ->
@Suppress("RedundantRequireNotNullCall") // IDE and CLI disagree here
checkNotNull(javaSourceSet)
project.tasks.named(javaSourceSet.compileJavaTaskName, JavaCompile::class.java)
}
internal val javaSourceSet: LenientFuture<SourceSet> = target.project.future {
target.withJavaEnabledFuture.await()
target.project.javaSourceSets.maybeCreate(compilationName)
}.lenient
override val processResourcesTaskName: String
get() = compilation.processResourcesTaskName ?: error("Missing 'processResourcesTaskName'")
}
@@ -30,8 +30,9 @@ import org.jetbrains.kotlin.gradle.targets.jvm.tasks.KotlinJvmRunDsl
import org.jetbrains.kotlin.gradle.targets.jvm.tasks.KotlinJvmRunDslImpl
import org.jetbrains.kotlin.gradle.targets.jvm.tasks.registerMainRunTask
import org.jetbrains.kotlin.gradle.tasks.withType
import org.jetbrains.kotlin.gradle.utils.*
import org.jetbrains.kotlin.gradle.utils.CompletableFuture
import org.jetbrains.kotlin.gradle.utils.Future
import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation
import org.jetbrains.kotlin.gradle.utils.findAppliedAndroidPluginIdOrNull
import org.jetbrains.kotlin.gradle.utils.future
import org.jetbrains.kotlin.utils.addToStdlib.cast
@@ -90,10 +91,16 @@ abstract class KotlinJvmTarget @Inject constructor(
mainRun.await()?.configure()
}
/**
* Future that will complete once [withJava] is called and java support for this target
* was established.
*/
internal val withJavaEnabledFuture: Future<Unit> get() = withJavaEnabledFutureImpl
private val withJavaEnabledFutureImpl = CompletableFuture<Unit>()
var withJavaEnabled = false
private set
@Suppress("unused") // user DSL
fun withJava() {
if (withJavaEnabled)
@@ -164,6 +171,8 @@ abstract class KotlinJvmTarget @Inject constructor(
copyUserDefinedAttributesToJavaConfigurations(javaSourceSet)
}
}
withJavaEnabledFutureImpl.complete(Unit)
}
private fun setupJavaSourceSetSourcesAndResources(