Skip to content

Commit 512f771

Browse files
committed
Defer realization of compilation tasks
Tested with build scan manually; no easy way to automate the test. (cherry picked from commit da9e9ef)
1 parent 348cca8 commit 512f771

File tree

2 files changed

+21
-13
lines changed

2 files changed

+21
-13
lines changed

gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KotlinFactories.kt

+7-2
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinCommonCompilerOptions
4848
import org.jetbrains.kotlin.gradle.dsl.KotlinJsCompilerOptionsDefault
4949
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptionsDefault
5050
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformCommonCompilerOptionsDefault
51+
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
5152
import org.jetbrains.kotlin.gradle.plugin.SubpluginOption
5253
import org.jetbrains.kotlin.gradle.plugin.mpp.enabledOnCurrentHost
5354
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinCompilationData
@@ -121,9 +122,13 @@ class KotlinFactories {
121122
fun registerKotlinNativeCompileTask(
122123
project: Project,
123124
taskName: String,
124-
kotlinCompileTask: KotlinNativeCompile
125+
kotlinCompilation: KotlinCompilation<*>
125126
): TaskProvider<out KspTaskNative> {
126-
return project.tasks.register(taskName, KspTaskNative::class.java, kotlinCompileTask.compilation).apply {
127+
return project.tasks.register(
128+
taskName,
129+
KspTaskNative::class.java,
130+
kotlinCompilation as KotlinNativeCompilationData<*>
131+
).apply {
127132
configure { kspTask ->
128133
kspTask.onlyIf {
129134
kspTask.konanTarget.enabledOnCurrentHost

gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspSubplugin.kt

+14-11
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ import org.jetbrains.kotlin.gradle.plugin.InternalSubpluginOption
4747
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
4848
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationWithResources
4949
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerPluginSupportPlugin
50+
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
5051
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
5152
import org.jetbrains.kotlin.gradle.plugin.SubpluginArtifact
5253
import org.jetbrains.kotlin.gradle.plugin.SubpluginOption
@@ -203,7 +204,6 @@ class KspGradleSubplugin @Inject internal constructor(private val registry: Tool
203204
val project = kotlinCompilation.target.project
204205
val kotlinCompileProvider: TaskProvider<AbstractKotlinCompileTool<*>> =
205206
project.locateTask(kotlinCompilation.compileKotlinTaskName) ?: return project.provider { emptyList() }
206-
val javaCompile = findJavaTaskForKotlinCompilation(kotlinCompilation)?.get()
207207
val kspExtension = project.extensions.getByType(KspExtension::class.java)
208208
val kspConfigurations = kspConfigurations.find(kotlinCompilation)
209209
val nonEmptyKspConfigurations = kspConfigurations.filter { it.allDependencies.isNotEmpty() }
@@ -233,7 +233,7 @@ class KspGradleSubplugin @Inject internal constructor(private val registry: Tool
233233
"$KSP_GROUP_ID:$KSP_COMPILER_PLUGIN_ID:$KSP_VERSION"
234234
)
235235

236-
if (javaCompile != null) {
236+
findJavaTaskForKotlinCompilation(kotlinCompilation)?.configure { javaCompile ->
237237
val generatedJavaSources = javaCompile.project.fileTree(javaOutputDir)
238238
generatedJavaSources.include("**/*.java")
239239
javaCompile.source(generatedJavaSources)
@@ -249,8 +249,6 @@ class KspGradleSubplugin @Inject internal constructor(private val registry: Tool
249249
project.kotlinExtension.sourceSets.create("generatedBy" + kspTaskName.capitalizeAsciiOnly())
250250
sourceSetMap.put(kotlinCompilation.defaultSourceSet, kspGeneratedSourceSet)
251251

252-
val kotlinCompileTask = kotlinCompileProvider.get()
253-
254252
val processorClasspath = project.configurations.maybeCreate("${kspTaskName}ProcessorClasspath")
255253
.extendsFrom(*nonEmptyKspConfigurations.toTypedArray())
256254
fun configureAsKspTask(kspTask: KspTask, isIncremental: Boolean) {
@@ -314,6 +312,7 @@ class KspGradleSubplugin @Inject internal constructor(private val registry: Tool
314312
)
315313

316314
if (kspExtension.allowSourcesFromOtherPlugins) {
315+
val kotlinCompileTask = kotlinCompileProvider.get()
317316
fun FileCollection.nonSelfDeps(): List<Task> =
318317
buildDependencies.getDependencies(null).filterNot {
319318
it.name == kspTaskName
@@ -382,11 +381,12 @@ class KspGradleSubplugin @Inject internal constructor(private val registry: Tool
382381
val isIncremental = project.findProperty("ksp.incremental")?.toString()?.toBoolean() ?: true
383382

384383
// Create and configure KSP tasks.
385-
val kspTaskProvider = when (kotlinCompileTask) {
386-
is KotlinCompile -> {
384+
val kspTaskProvider = when (kotlinCompilation.platformType) {
385+
KotlinPlatformType.jvm, KotlinPlatformType.androidJvm -> {
387386
kotlinCompilation as KotlinCompilationData<*>
388387
KotlinFactories.registerKotlinJvmCompileTask(project, kspTaskName, kotlinCompilation).also {
389388
it.configure { kspTask ->
389+
val kotlinCompileTask = kotlinCompileProvider.get() as KotlinCompile
390390
maybeBlockOtherPlugins(kspTask as BaseKotlinCompile)
391391
configureAsKspTask(kspTask, isIncremental)
392392
configureAsAbstractKotlinCompileTool(kspTask as AbstractKotlinCompileTool<*>)
@@ -420,10 +420,11 @@ class KspGradleSubplugin @Inject internal constructor(private val registry: Tool
420420
kotlinCompilation.output.classesDirs.from(classOutputDir)
421421
}
422422
}
423-
is Kotlin2JsCompile -> {
423+
KotlinPlatformType.js, KotlinPlatformType.wasm -> {
424424
kotlinCompilation as KotlinCompilationData<*>
425425
KotlinFactories.registerKotlinJSCompileTask(project, kspTaskName, kotlinCompilation).also {
426426
it.configure { kspTask ->
427+
val kotlinCompileTask = kotlinCompileProvider.get() as Kotlin2JsCompile
427428
maybeBlockOtherPlugins(kspTask as BaseKotlinCompile)
428429
configureAsKspTask(kspTask, isIncremental)
429430
configureAsAbstractKotlinCompileTool(kspTask as AbstractKotlinCompileTool<*>)
@@ -449,10 +450,11 @@ class KspGradleSubplugin @Inject internal constructor(private val registry: Tool
449450
}
450451
}
451452
}
452-
is KotlinCompileCommon -> {
453+
KotlinPlatformType.common -> {
453454
kotlinCompilation as KotlinCompilationData<*>
454455
KotlinFactories.registerKotlinMetadataCompileTask(project, kspTaskName, kotlinCompilation).also {
455456
it.configure { kspTask ->
457+
val kotlinCompileTask = kotlinCompileProvider.get() as KotlinCompileCommon
456458
maybeBlockOtherPlugins(kspTask as BaseKotlinCompile)
457459
configureAsKspTask(kspTask, isIncremental)
458460
configureAsAbstractKotlinCompileTool(kspTask as AbstractKotlinCompileTool<*>)
@@ -475,9 +477,10 @@ class KspGradleSubplugin @Inject internal constructor(private val registry: Tool
475477
}
476478
}
477479
}
478-
is KotlinNativeCompile -> {
479-
KotlinFactories.registerKotlinNativeCompileTask(project, kspTaskName, kotlinCompileTask).also {
480+
KotlinPlatformType.native -> {
481+
KotlinFactories.registerKotlinNativeCompileTask(project, kspTaskName, kotlinCompilation).also {
480482
it.configure { kspTask ->
483+
val kotlinCompileTask = kotlinCompileProvider.get() as KotlinNativeCompile
481484
configureAsKspTask(kspTask, false)
482485
configureAsAbstractKotlinCompileTool(kspTask)
483486

@@ -504,7 +507,7 @@ class KspGradleSubplugin @Inject internal constructor(private val registry: Tool
504507
}
505508
}
506509
}
507-
else -> return project.provider { emptyList() }
510+
// No else; The cases should be exhaustive
508511
}
509512
kspGeneratedSourceSet.kotlin.srcDir(project.files(kotlinOutputDir, javaOutputDir).builtBy(kspTaskProvider))
510513
kotlinCompilation.source(kspGeneratedSourceSet)

0 commit comments

Comments
 (0)