From 08c505f9ba70f771d976e97b9f0ad74cf13c1261 Mon Sep 17 00:00:00 2001 From: Ivan Gavrilovic Date: Wed, 23 Jun 2021 15:37:04 +0200 Subject: [PATCH] KT-47347: Kapt processors should not be input files for stub generation This commit avoids passing kapt processors as sources for stub generation task, and it also avoid using them as input files for stub generation. Instead, it adds a new property that simply records if processors are present (as going from empty to 1+ processors should re-run stubs). Fixes #KT-47347 Test: Kapt3IT.kt --- .../org/jetbrains/kotlin/gradle/Kapt3IT.kt | 27 +++++++++++++++++++ .../kapt/Kapt3KotlinGradleSubplugin.kt | 2 -- .../internal/kapt/KaptGenerateStubsTask.kt | 7 +++-- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3IT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3IT.kt index 5caa7e4c98b..3e039d25d2d 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3IT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3IT.kt @@ -27,6 +27,7 @@ import org.junit.Test import java.io.File import java.util.regex.Pattern import java.util.zip.ZipFile +import java.util.zip.ZipOutputStream import kotlin.test.assertNotNull import kotlin.test.assertNull import kotlin.test.assertTrue @@ -817,4 +818,30 @@ open class Kapt3IT : Kapt3BaseIT() { } } } + + /* Regression test for https://youtrack.jetbrains.com/issue/KT-47347. */ + @Test + fun testChangesToKaptConfigurationDoNotTriggerStubGeneration() { + val project = Project("localAnnotationProcessor", directoryPrefix = "kapt2") + + project.build("build") { + assertSuccessful() + } + + ZipOutputStream(project.projectDir.resolve("fake_processor.jar").outputStream()).close() + project.projectDir.resolve("example/build.gradle").appendText( + """ + + dependencies { + kapt files("../fake_processor.jar") + } + """.trimIndent() + ) + + project.build("build") { + assertSuccessful() + assertTasksExecuted(":example:kaptKotlin") + assertTasksUpToDate(":example:kaptGenerateStubsKotlin") + } + } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt index 0dc993fd193..aab23a252d7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt @@ -292,8 +292,6 @@ class Kapt3GradleSubplugin @Inject internal constructor(private val registry: To val kaptTaskProvider: TaskProvider = context.createKaptKotlinTask(useWorkerApi = project.isUseWorkerApi()) kaptGenerateStubsTaskProvider.configure { kaptGenerateStubsTask -> - kaptGenerateStubsTask.source(*kaptConfigurations.toTypedArray()) - kaptGenerateStubsTask.dependsOn(*buildDependencies.toTypedArray()) kaptGenerateStubsTask.dependsOn( project.provider { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptGenerateStubsTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptGenerateStubsTask.kt index 989c990e7ce..ee6055bf643 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptGenerateStubsTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptGenerateStubsTask.kt @@ -76,10 +76,13 @@ abstract class KaptGenerateStubsTask : KotlinCompile(KotlinJvmOptionsImpl()) { @get:Internal lateinit var generatedSourcesDirs: List - @get:Classpath - @get:InputFiles + @get:Internal("Not an input, just passed as kapt args. ") abstract val kaptClasspath: ConfigurableFileCollection + /* Used as input as empty kapt classpath should not trigger stub generation, but a non-empty one should. */ + @Input + fun getIfKaptClasspathIsPresent() = !kaptClasspath.isEmpty + @get:Classpath @get:InputFiles @Suppress("unused")