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 0878c2211ad..5ca082e93ee 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 @@ -95,6 +95,33 @@ class KaptIncrementalWithIsolatingApt : KaptIncrementalIT() { } } + @Test + fun testUnchangedAnnotationProcessorClasspathButContentChanged() { + val project = getProject() + val processorJar = project.projectDir.resolve("processor.jar").also { it.createNewFile() } + project.gradleBuildScript().appendText( + """ + + dependencies { + kapt files("processor.jar") + } + """.trimIndent() + ) + + project.build("clean", "build") { + assertSuccessful() + } + + ZipOutputStream(processorJar.outputStream()).use { + it.putNextEntry(ZipEntry("resource.txt")) + it.closeEntry() + } + project.build("build") { + assertSuccessful() + assertContains("Unable to use existing data, re-initializing classpath information for KAPT.") + } + } + @Test fun testNonIncrementalWithUnrecognizedInputs() { val project = getProject() 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 16bc6573790..f5e3578ce1a 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 @@ -69,6 +69,10 @@ open class ClasspathSnapshot protected constructor( if (!isCompatible(previousSnapshot)) { return KaptClasspathChanges.Unknown } + if (annotationProcessorClasspath.any { it in changedFiles }) { + // in case annotation processor classpath changes, we have to run non-incrementally + return KaptClasspathChanges.Unknown + } val unchangedBetweenCompilations = dataForFiles.keys.intersect(previousSnapshot.dataForFiles.keys).filter { it !in changedFiles } val currentToLoad = dataForFiles.keys.filter { it !in unchangedBetweenCompilations }.also { loadEntriesFor(it) }