diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalWithIsolatingApt.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalWithIsolatingApt.kt index 7065f7461a4..513ba005e9e 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalWithIsolatingApt.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalWithIsolatingApt.kt @@ -86,6 +86,33 @@ class KaptIncrementalWithIsolatingApt : KaptIncrementalIT() { assertContains("Unable to use existing data, re-initializing classpath information for KAPT.") } } + + @Test + fun testNonIncrementalWithUnrecognizedInputs() { + val project = getProject() + + val additionalInputs = project.projectDir.resolve("additionalInputs").also { it.mkdirs() } + project.gradleBuildScript().appendText( + """ + + tasks.whenTaskAdded { + if (it.name == "kaptKotlin") { + it.getInputs().files("${additionalInputs.canonicalPath}") + } + } + """.trimIndent() + ) + + project.build("clean", "build") { + assertSuccessful() + } + + additionalInputs.resolve("layout.xml").createNewFile() + project.build("build") { + assertSuccessful() + assertContains("Incremental annotation processing (apt mode): false") + } + } } private const val patternApt = "Processing java sources with annotation processors:" diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptTask.kt index b7a609c9591..e12dc262e31 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptTask.kt @@ -196,7 +196,22 @@ abstract class KaptTask : ConventionTask(), TaskWithLocalState { val startTime = System.currentTimeMillis() val previousSnapshot = if (inputs.isIncremental) { - ClasspathSnapshot.ClasspathSnapshotFactory.loadFrom(incAptCacheDir) + val loadedPrevious = ClasspathSnapshot.ClasspathSnapshotFactory.loadFrom(incAptCacheDir) + + val previousAndCurrentDataFiles = lazy { loadedPrevious.getAllDataFiles() + allDataFiles } + val allChangesRecognized = changedFiles.all { + val extension = it.extension + if (extension.isEmpty() || extension == "java" || extension == "jar" || extension == "class") { + return@all true + } + // if not a directory, Java source file, jar, or class, it has to be a structure file, in order to understand changes + it in previousAndCurrentDataFiles.value + } + if (allChangesRecognized) { + loadedPrevious + } else { + ClasspathSnapshot.ClasspathSnapshotFactory.getEmptySnapshot() + } } else { ClasspathSnapshot.ClasspathSnapshotFactory.getEmptySnapshot() } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/incremental/ClasspathSnapshot.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/incremental/ClasspathSnapshot.kt index 88c0c7aec43..16bc6573790 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/incremental/ClasspathSnapshot.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/incremental/ClasspathSnapshot.kt @@ -56,6 +56,8 @@ open class ClasspathSnapshot protected constructor( fun getEmptySnapshot() = UnknownSnapshot } + fun getAllDataFiles() = dataForFiles.keys + private fun isCompatible(snapshot: ClasspathSnapshot) = this != UnknownSnapshot && snapshot != UnknownSnapshot