From 512f771fcb7eb5907f009c7a45a5b473fe79a426 Mon Sep 17 00:00:00 2001 From: Ting-Yuan Huang Date: Tue, 17 Jan 2023 13:10:04 -0800 Subject: Defer realization of compilation tasks Tested with build scan manually; no easy way to automate the test. (cherry picked from commit da9e9ef5cde26bf8a8bf6381b77a8ed026b91c4b) --- .../google/devtools/ksp/gradle/KotlinFactories.kt | 9 ++++++-- .../com/google/devtools/ksp/gradle/KspSubplugin.kt | 25 ++++++++++++---------- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KotlinFactories.kt b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KotlinFactories.kt index 589a7ed3..73b5d8e1 100644 --- a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KotlinFactories.kt +++ b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KotlinFactories.kt @@ -48,6 +48,7 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinCommonCompilerOptions import org.jetbrains.kotlin.gradle.dsl.KotlinJsCompilerOptionsDefault import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptionsDefault import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformCommonCompilerOptionsDefault +import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.SubpluginOption import org.jetbrains.kotlin.gradle.plugin.mpp.enabledOnCurrentHost import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinCompilationData @@ -121,9 +122,13 @@ class KotlinFactories { fun registerKotlinNativeCompileTask( project: Project, taskName: String, - kotlinCompileTask: KotlinNativeCompile + kotlinCompilation: KotlinCompilation<*> ): TaskProvider { - return project.tasks.register(taskName, KspTaskNative::class.java, kotlinCompileTask.compilation).apply { + return project.tasks.register( + taskName, + KspTaskNative::class.java, + kotlinCompilation as KotlinNativeCompilationData<*> + ).apply { configure { kspTask -> kspTask.onlyIf { kspTask.konanTarget.enabledOnCurrentHost diff --git a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspSubplugin.kt b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspSubplugin.kt index 9bc5ae8b..f1ca11d7 100644 --- a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspSubplugin.kt +++ b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspSubplugin.kt @@ -47,6 +47,7 @@ import org.jetbrains.kotlin.gradle.plugin.InternalSubpluginOption import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationWithResources import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerPluginSupportPlugin +import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.SubpluginArtifact import org.jetbrains.kotlin.gradle.plugin.SubpluginOption @@ -203,7 +204,6 @@ class KspGradleSubplugin @Inject internal constructor(private val registry: Tool val project = kotlinCompilation.target.project val kotlinCompileProvider: TaskProvider> = project.locateTask(kotlinCompilation.compileKotlinTaskName) ?: return project.provider { emptyList() } - val javaCompile = findJavaTaskForKotlinCompilation(kotlinCompilation)?.get() val kspExtension = project.extensions.getByType(KspExtension::class.java) val kspConfigurations = kspConfigurations.find(kotlinCompilation) val nonEmptyKspConfigurations = kspConfigurations.filter { it.allDependencies.isNotEmpty() } @@ -233,7 +233,7 @@ class KspGradleSubplugin @Inject internal constructor(private val registry: Tool "$KSP_GROUP_ID:$KSP_COMPILER_PLUGIN_ID:$KSP_VERSION" ) - if (javaCompile != null) { + findJavaTaskForKotlinCompilation(kotlinCompilation)?.configure { javaCompile -> val generatedJavaSources = javaCompile.project.fileTree(javaOutputDir) generatedJavaSources.include("**/*.java") javaCompile.source(generatedJavaSources) @@ -249,8 +249,6 @@ class KspGradleSubplugin @Inject internal constructor(private val registry: Tool project.kotlinExtension.sourceSets.create("generatedBy" + kspTaskName.capitalizeAsciiOnly()) sourceSetMap.put(kotlinCompilation.defaultSourceSet, kspGeneratedSourceSet) - val kotlinCompileTask = kotlinCompileProvider.get() - val processorClasspath = project.configurations.maybeCreate("${kspTaskName}ProcessorClasspath") .extendsFrom(*nonEmptyKspConfigurations.toTypedArray()) fun configureAsKspTask(kspTask: KspTask, isIncremental: Boolean) { @@ -314,6 +312,7 @@ class KspGradleSubplugin @Inject internal constructor(private val registry: Tool ) if (kspExtension.allowSourcesFromOtherPlugins) { + val kotlinCompileTask = kotlinCompileProvider.get() fun FileCollection.nonSelfDeps(): List = buildDependencies.getDependencies(null).filterNot { it.name == kspTaskName @@ -382,11 +381,12 @@ class KspGradleSubplugin @Inject internal constructor(private val registry: Tool val isIncremental = project.findProperty("ksp.incremental")?.toString()?.toBoolean() ?: true // Create and configure KSP tasks. - val kspTaskProvider = when (kotlinCompileTask) { - is KotlinCompile -> { + val kspTaskProvider = when (kotlinCompilation.platformType) { + KotlinPlatformType.jvm, KotlinPlatformType.androidJvm -> { kotlinCompilation as KotlinCompilationData<*> KotlinFactories.registerKotlinJvmCompileTask(project, kspTaskName, kotlinCompilation).also { it.configure { kspTask -> + val kotlinCompileTask = kotlinCompileProvider.get() as KotlinCompile maybeBlockOtherPlugins(kspTask as BaseKotlinCompile) configureAsKspTask(kspTask, isIncremental) configureAsAbstractKotlinCompileTool(kspTask as AbstractKotlinCompileTool<*>) @@ -420,10 +420,11 @@ class KspGradleSubplugin @Inject internal constructor(private val registry: Tool kotlinCompilation.output.classesDirs.from(classOutputDir) } } - is Kotlin2JsCompile -> { + KotlinPlatformType.js, KotlinPlatformType.wasm -> { kotlinCompilation as KotlinCompilationData<*> KotlinFactories.registerKotlinJSCompileTask(project, kspTaskName, kotlinCompilation).also { it.configure { kspTask -> + val kotlinCompileTask = kotlinCompileProvider.get() as Kotlin2JsCompile maybeBlockOtherPlugins(kspTask as BaseKotlinCompile) configureAsKspTask(kspTask, isIncremental) configureAsAbstractKotlinCompileTool(kspTask as AbstractKotlinCompileTool<*>) @@ -449,10 +450,11 @@ class KspGradleSubplugin @Inject internal constructor(private val registry: Tool } } } - is KotlinCompileCommon -> { + KotlinPlatformType.common -> { kotlinCompilation as KotlinCompilationData<*> KotlinFactories.registerKotlinMetadataCompileTask(project, kspTaskName, kotlinCompilation).also { it.configure { kspTask -> + val kotlinCompileTask = kotlinCompileProvider.get() as KotlinCompileCommon maybeBlockOtherPlugins(kspTask as BaseKotlinCompile) configureAsKspTask(kspTask, isIncremental) configureAsAbstractKotlinCompileTool(kspTask as AbstractKotlinCompileTool<*>) @@ -475,9 +477,10 @@ class KspGradleSubplugin @Inject internal constructor(private val registry: Tool } } } - is KotlinNativeCompile -> { - KotlinFactories.registerKotlinNativeCompileTask(project, kspTaskName, kotlinCompileTask).also { + KotlinPlatformType.native -> { + KotlinFactories.registerKotlinNativeCompileTask(project, kspTaskName, kotlinCompilation).also { it.configure { kspTask -> + val kotlinCompileTask = kotlinCompileProvider.get() as KotlinNativeCompile configureAsKspTask(kspTask, false) configureAsAbstractKotlinCompileTool(kspTask) @@ -504,7 +507,7 @@ class KspGradleSubplugin @Inject internal constructor(private val registry: Tool } } } - else -> return project.provider { emptyList() } + // No else; The cases should be exhaustive } kspGeneratedSourceSet.kotlin.srcDir(project.files(kotlinOutputDir, javaOutputDir).builtBy(kspTaskProvider)) kotlinCompilation.source(kspGeneratedSourceSet) -- cgit v1.2.3