From 08446e2371f6be57fa2eda6a81375bcb2dce5e8a Mon Sep 17 00:00:00 2001 From: Ivan Gavrilovic Date: Thu, 25 Feb 2021 21:15:48 +0000 Subject: [PATCH] KT-45168: Avoid generating stubs for generated Kotlin sources Filter out Kotlin sources coming from KAPT-generated dirs. Some annotation processors e.g Moshi, generate Kotlin sources, and when generating stubs in non-incremental runs, stub generation must ignore those sources. This fixes #KT-45168. Test: Kapt3IT --- .../org/jetbrains/kotlin/gradle/Kapt3IT.kt | 16 ++++++++++++++++ .../src/main/java/TestAnnotationProcessor.kt | 18 +++++++++++++----- .../kapt/Kapt3KotlinGradleSubplugin.kt | 2 +- .../internal/kapt/KaptGenerateStubsTask.kt | 6 +++--- 4 files changed, 33 insertions(+), 9 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 bb2b7f3675e..9ac4a786f32 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 @@ -24,6 +24,8 @@ import org.junit.Assume import org.junit.Test import java.io.File import java.util.zip.ZipFile +import kotlin.test.assertNotNull +import kotlin.test.assertNull abstract class Kapt3BaseIT : BaseGradleIT() { companion object { @@ -455,6 +457,20 @@ open class Kapt3IT : Kapt3BaseIT() { assertContains("Additional warning message from AP") } + + project.build(options = defaultBuildOptions().copy(incremental = false), params = arrayOf("build")) { + assertSuccessful() + assertNull( + project.projectDir.findFileByName("TestGeneratedKt.java"), + "Java stubs should not be generated for Kotlin sources generated by annotation processors." + ) + assertNotNull(project.projectDir.findFileByName("TestGeneratedKt.class")) + assertNull( + project.projectDir.findFileByName("AnotherGenerated.java"), + "Java stubs should not be generated for Kotlin sources generated by annotation processors." + ) + assertNotNull(project.projectDir.findFileByName("AnotherGenerated.class")) + } } @Test diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/localAnnotationProcessor/annotation-processor/src/main/java/TestAnnotationProcessor.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/localAnnotationProcessor/annotation-processor/src/main/java/TestAnnotationProcessor.kt index 2b143c78138..3bb9fccb68d 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/localAnnotationProcessor/annotation-processor/src/main/java/TestAnnotationProcessor.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/localAnnotationProcessor/annotation-processor/src/main/java/TestAnnotationProcessor.kt @@ -48,11 +48,19 @@ class TestAnnotationProcessor : AbstractProcessor() { // print warning processingEnv.messager.printMessage(WARNING, "Additional warning message from AP") processingEnv.filer - .createResource(StandardLocation.CLASS_OUTPUT, "abc", "helloWorld.txt") - .openWriter() - .use { - it.write("Hello, world!") - } + .createResource( + StandardLocation.SOURCE_OUTPUT, + "test.generated", + "AnotherGenerated.kt", + ).openWriter().use { + it.write("package test.generated; class AnotherGenerated") + } + processingEnv.filer + .createResource(StandardLocation.CLASS_OUTPUT, "abc", "helloWorld.txt") + .openWriter() + .use { + it.write("Hello, world!") + } return true } 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 b45c1cde8df..43caf5aba9f 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 @@ -563,7 +563,7 @@ class Kapt3GradleSubplugin @Inject internal constructor(private val registry: To kaptTask.stubsDir = getKaptStubsDir() kaptTask.setDestinationDir { getKaptIncrementalDataDir() } kaptTask.mapClasspath { kaptTask.kotlinCompileTask.classpath } - kaptTask.generatedSourcesDir = sourcesOutputDir + kaptTask.generatedSourcesDirs = listOf(sourcesOutputDir, kotlinSourcesOutputDir) kaptTask.kaptClasspathConfigurations = kaptClasspathConfigurations 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 64ff1696b1c..ac4a67b7cbc 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 @@ -45,7 +45,7 @@ open class KaptGenerateStubsTask : KotlinCompile() { lateinit var stubsDir: File @get:Internal - lateinit var generatedSourcesDir: File + lateinit var generatedSourcesDirs: List @get:Classpath @get:InputFiles @@ -83,7 +83,7 @@ open class KaptGenerateStubsTask : KotlinCompile() { private fun isSourceRootAllowed(source: File): Boolean = !destinationDir.isParentOf(source) && !stubsDir.isParentOf(source) && - !generatedSourcesDir.isParentOf(source) + generatedSourcesDirs.none { it.isParentOf(source) } private val compileKotlinArgumentsContributor by project.provider { kotlinCompileTask.compilerArgumentsContributor @@ -106,7 +106,7 @@ open class KaptGenerateStubsTask : KotlinCompile() { private val sourceRoots by project.provider { kotlinCompileTask.getSourceRoots().let { val javaSourceRoots = it.javaSourceRoots.filterTo(HashSet()) { isSourceRootAllowed(it) } - val kotlinSourceFiles = it.kotlinSourceFiles + val kotlinSourceFiles = it.kotlinSourceFiles.filterTo(ArrayList()) { isSourceRootAllowed(it) } SourceRoots.ForJvm(kotlinSourceFiles, javaSourceRoots) } }