From 77b7b465423e9406c316fa79a36d69be4417245b Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Thu, 24 Mar 2016 20:54:10 +0300 Subject: [PATCH] Kapt: fix sequential build with kapt when Kotlin source file was modified --- Changelog.md | 3 +++ .../internal/AnnotationProcessingManager.kt | 16 ++++++++++---- .../kotlin/gradle/KotlinGradlePluginIT.kt | 21 ++++++++++++++++++- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/Changelog.md b/Changelog.md index 6b3b4b7ec3a..9ef7a76d52c 100644 --- a/Changelog.md +++ b/Changelog.md @@ -24,6 +24,9 @@ - Drop line breaks between operator arguments (except '+', "-", "&&" and "||") - Add non-null assertions on call site for non-null parameters +### Tools. Android +- Fixed sequential build with kapt and stubs enabled when Kotlin source file was modified and no Java source files were modified + ### IDE - Debugger can distinguish nested inline arguments - Add kotlinClassName() and kotlinFunctionName() macros for use in live templates diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/AnnotationProcessingManager.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/AnnotationProcessingManager.kt index 11e456de31a..2bfb497d15d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/AnnotationProcessingManager.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/AnnotationProcessingManager.kt @@ -24,6 +24,7 @@ import org.gradle.api.tasks.compile.JavaCompile import org.jetbrains.kotlin.gradle.plugin.* import java.io.File import java.io.IOException +import java.util.* import java.util.zip.ZipFile fun Project.initKapt( @@ -125,6 +126,7 @@ public class AnnotationProcessingManager( private val androidVariant: Any? = null) { private val project = task.project + private val random = Random() private companion object { val JAVA_FQNAME_PATTERN = "^([\\p{L}_$][\\p{L}\\p{N}_$]*\\.)*[\\p{L}_$][\\p{L}\\p{N}_$]*$".toRegex() @@ -184,10 +186,16 @@ public class AnnotationProcessingManager( if (!javaHackPackageDir.exists()) javaHackPackageDir.mkdirs() val javaHackClFile = File(javaHackPackageDir, "Cl.java") - if (!javaHackClFile.exists()) { - javaHackClFile.writeText("package __gen.annotation; class Cl { @__gen.KotlinAptAnnotation boolean v; }") - project.logger.kotlinDebug("kapt: Java file stub generated: $javaHackClFile") - } + val previouslyExisted = javaHackClFile.exists() + val comment = System.currentTimeMillis().toString() + "-" + random.nextInt() + + javaHackClFile.writeText( + "// $comment\n" + + "package __gen.annotation;\n" + + "class Cl { @__gen.KotlinAptAnnotation boolean v; }") + + project.logger.kotlinDebug("kapt: Java file stub generated: $javaHackClFile " + + "(previously existed: $previouslyExisted)") if (!javaTask.source.contains(javaHackClFile)) { javaTask.source(javaAptSourceDir) diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinGradlePluginIT.kt b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinGradlePluginIT.kt index a13cf0e0893..e127e4f7463 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinGradlePluginIT.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinGradlePluginIT.kt @@ -209,6 +209,26 @@ class KotlinGradleIT: BaseGradleIT() { } } + @Test + fun testKaptStubsIncrementalBuild() { + val project = Project("kaptStubs", "1.12") + + project.build("build") { + assertSuccessful() + + // Modify the Kotlin source file somehow + val someJavaFile = fileInWorkingDir("src/main/java/test.kt") + someJavaFile.appendText(" ") + } + + project.build("build") { + assertSuccessful() + assertContains(":compileKotlin") + assertContains(":compileJava") + assertNotContains(":compileJava UP-TO-DATE") + } + } + @Test fun testKaptArguments() { Project("kaptArguments", "1.12").build("build") { @@ -248,5 +268,4 @@ class KotlinGradleIT: BaseGradleIT() { assertFileExists("build/classes/main/example/TestClassCustomized.class") } } - } \ No newline at end of file