From c026c7f24baaf4f91b852001dea968b0f868de21 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Fri, 4 May 2018 23:06:43 +0300 Subject: [PATCH] Filter out non-Java files from kapt inputs #KT-23878 fixed --- .../kotlin/gradle/KaptIncrementalIT.kt | 23 ++++++++--- .../kotlin/gradle/internal/KaptTask.kt | 41 ++++++++++--------- 2 files changed, 39 insertions(+), 25 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 99cdfbe28e6..2ce5b5dd3af 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 @@ -9,7 +9,23 @@ import org.junit.Test class KaptIncrementalNoStubsIT : KaptIncrementalBaseIT(shouldUseStubs = false) class KaptIncrementalWithStubsIT : KaptIncrementalBaseIT(shouldUseStubs = true) -class Kapt3Incremental : KaptIncrementalBaseIT(shouldUseStubs = false, useKapt3 = true) +class Kapt3Incremental : KaptIncrementalBaseIT(shouldUseStubs = false, useKapt3 = true) { + @Test + fun testAddNewLine() { + val project = Project("simple", directoryPrefix = "kapt2") + + project.build("clean", "build") { + assertSuccessful() + } + + project.projectFile("test.kt").modify { "\n$it" } + project.build("build") { + assertSuccessful() + assertTasksExecuted(":kaptGenerateStubsKotlin", ":compileJava", ":compileKotlin") + assertTasksUpToDate(":kaptKotlin") + } + } +} abstract class KaptIncrementalBaseIT(val shouldUseStubs: Boolean, val useKapt3: Boolean = false) : BaseGradleIT() { init { @@ -277,10 +293,7 @@ abstract class KaptIncrementalBaseIT(val shouldUseStubs: Boolean, val useKapt3: private fun CompiledProject.assertKapt3FullyExecuted() { if (useKapt3) { - assertNotContains( - ":kaptKotlin UP-TO-DATE", - ":kaptGenerateStubsKotlin UP-TO-DATE" - ) + assertTasksExecuted(":kaptKotlin", ":kaptGenerateStubsKotlin") } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KaptTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KaptTask.kt index e77a934e492..7141fbcd4d5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KaptTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KaptTask.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.compilerRunner.GradleCompilerEnvironment import org.jetbrains.kotlin.compilerRunner.GradleCompilerRunner import org.jetbrains.kotlin.compilerRunner.OutputItemsCollectorImpl import org.jetbrains.kotlin.gradle.tasks.* +import org.jetbrains.kotlin.incremental.isJavaFile import java.io.File @CacheableTask @@ -36,11 +37,6 @@ open class KaptTask : ConventionTask(), CompilerArgumentAwareWithInput get() { - val sourcesFromKotlinTask = kotlinCompileTask.source - .filter { it.extension == "java" && !isInsideDestinationDirs(it) } - - val stubSources = project.fileTree(stubsDir) - return sourcesFromKotlinTask + stubSources + val result = HashSet() + for (root in javaSourceRoots) { + root.walk().filterTo(result) { it.isJavaFile() } + } + return result } + private val javaSourceRoots: Set + get() = (kotlinCompileTask.sourceRootsContainer.sourceRoots + stubsDir) + .filterTo(HashSet(), ::isRootAllowed) + + private fun isRootAllowed(file: File): Boolean = + !FileUtil.isAncestor(destinationDir, file, /* strict = */ false) && + !FileUtil.isAncestor(classesDir, file, /* strict = */ false) + @TaskAction fun compile() { /** Delete everything inside generated sources and classes output directory * (annotation processing is not incremental) */ clearOutputDirectories() - val sourceRootsFromKotlin = kotlinCompileTask.sourceRootsContainer.sourceRoots - val rawSourceRoots = FilteringSourceRootsContainer(sourceRootsFromKotlin, { !isInsideDestinationDirs(it) }) - val sourceRoots = SourceRoots.ForJvm.create(kotlinCompileTask.source, rawSourceRoots) - val args = prepareCompilerArguments() val messageCollector = GradleMessageCollector(logger) @@ -117,11 +117,12 @@ open class KaptTask : ConventionTask(), CompilerArgumentAwareWithInput