From e07b2e30e2789a7110e3b861cbb63c5ff0de5c0e Mon Sep 17 00:00:00 2001 From: Ivan Gavrilovic Date: Tue, 15 Oct 2019 19:27:06 +0100 Subject: [PATCH] KT-34258: Make sure to clean up stale files even if no Kotlin sources If running incrementally, even if there aren't any Kotlin sources to compile, there could be stale output files that need to be removed. E.g stub generation must have generated .java files removed if all Kotlin sources are removed. Kotlin compile task will be skipped only if there are no Kotlin sources and task run is non-incremental. Test: KaptIncrementalIT.testRemoveAllKotlinSources --- .../kotlin/gradle/KaptIncrementalIT.kt | 35 ++++++++++++++++--- .../jetbrains/kotlin/gradle/tasks/Tasks.kt | 3 +- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalIT.kt index 9c51178b7e3..9bdd60cca8b 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalIT.kt @@ -1,10 +1,8 @@ package org.jetbrains.kotlin.gradle -import org.jetbrains.kotlin.gradle.util.allKotlinFiles -import org.jetbrains.kotlin.gradle.util.findFileByName -import org.jetbrains.kotlin.gradle.util.getFileByName -import org.jetbrains.kotlin.gradle.util.modify +import org.jetbrains.kotlin.gradle.util.* import org.junit.Test +import kotlin.test.assertEquals open class KaptIncrementalIT : BaseGradleIT() { companion object { @@ -204,6 +202,35 @@ open class KaptIncrementalIT : BaseGradleIT() { } } + @Test + fun testRemoveAllKotlinSources() { + val project = getProject() + val kapt3StubsPath = "build/tmp/kapt3/stubs/main" + + project.build("build") { + assertSuccessful() + assertKapt3FullyExecuted() + } + + with(project.projectDir) { + resolve("src/main/java").deleteRecursively() + resolve("src/main/java/bar").mkdirs() + resolve("src/main/java/bar/MyClass.java").writeText( + """ + package bar; + public class MyClass {} + """.trimIndent() + ) + } + + project.build("build") { + assertSuccessful() + + // Make sure all stubs are removed + assertEquals(emptyList(), fileInWorkingDir(kapt3StubsPath).walk().filter { it.extension == "java" }.toList()) + } + } + @Test fun testRemoveAnnotations() { val project = getProject() diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt index 31f76b2236f..0931274bdba 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt @@ -296,7 +296,8 @@ abstract class AbstractKotlinCompile() : AbstractKo logger.kotlinDebug { "All kotlin sources: ${allKotlinSources.pathsAsStringRelativeTo(project.rootProject.projectDir)}" } - if (allKotlinSources.isEmpty()) { + if (!inputs.isIncremental && allKotlinSources.isEmpty()) { + // Skip running only if non-incremental run. Otherwise, we may need to do some cleanup. logger.kotlinDebug { "No Kotlin files found, skipping Kotlin compiler task" } return }