[Gradle] Ensure java source sets being created eagerly for 'withJava'
^KT-60158 Verification Pending
This commit is contained in:
committed by
Space Team
parent
42d648f775
commit
817e3de8f5
+8
-6
@@ -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 {
|
||||
|
||||
+3
-9
@@ -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>
|
||||
}
|
||||
}
|
||||
|
||||
+17
-8
@@ -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'")
|
||||
}
|
||||
|
||||
+11
-2
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user