KT-35472: Detect when content of annotation processor changes

Even if annotation processor classpath is the same, in case
individual entries change (e.g. bulding annotationo processor
from source), KATP should run non-incrementally.

Test: KaptIncrementalWithIsolatingApt.testUnchangedAnnotationProcessorClasspathButContentChanged
This commit is contained in:
Ivan Gavrilovic
2019-12-18 11:32:29 +00:00
committed by Yan Zhulanow
parent 7b227f3113
commit 62924ddcd4
2 changed files with 31 additions and 0 deletions
@@ -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()
@@ -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) }