From f60bfc34c0fd414a7eaaade444c54cb1cd5a18c9 Mon Sep 17 00:00:00 2001 From: Ivan Gavrilovic Date: Mon, 6 May 2019 14:37:40 -0700 Subject: [PATCH] Remove generated sources and classes for full KAPT build When running incremental annotation processing in KAPT, even if incremental flag is enabled, and full rebuild should be performed (e.g. in presence of dynamic non-incremental APs), make sure generated sources and classes are removed. #KT-31322 fixed --- .../kotlin/kapt3/base/KaptContext.kt | 8 +++ .../base/incremental/IncrementalKaptTest.kt | 64 +++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/plugins/kapt3/kapt3-base/src/org/jetbrains/kotlin/kapt3/base/KaptContext.kt b/plugins/kapt3/kapt3-base/src/org/jetbrains/kotlin/kapt3/base/KaptContext.kt index 827760f5aa6..f0e7d47ec1a 100644 --- a/plugins/kapt3/kapt3-base/src/org/jetbrains/kotlin/kapt3/base/KaptContext.kt +++ b/plugins/kapt3/kapt3-base/src/org/jetbrains/kotlin/kapt3/base/KaptContext.kt @@ -64,6 +64,14 @@ open class KaptContext(val options: KaptOptions, val withJdk: Boolean, val logge cacheManager?.invalidateAndGetDirtyFiles( options.changedFiles, options.classpathChanges ) ?: SourcesToReprocess.FullRebuild + + if (sourcesToReprocess == SourcesToReprocess.FullRebuild) { + // remove all generated sources and classes + options.sourcesOutputDir.deleteRecursively() + options.sourcesOutputDir.mkdir() + options.classesOutputDir.deleteRecursively() + options.classesOutputDir.mkdir() + } } else { sourcesToReprocess = SourcesToReprocess.FullRebuild } diff --git a/plugins/kapt3/kapt3-base/test/org/jetbrains/kotlin/kapt3/base/incremental/IncrementalKaptTest.kt b/plugins/kapt3/kapt3-base/test/org/jetbrains/kotlin/kapt3/base/incremental/IncrementalKaptTest.kt index 7d890298754..e56694e21ba 100644 --- a/plugins/kapt3/kapt3-base/test/org/jetbrains/kotlin/kapt3/base/incremental/IncrementalKaptTest.kt +++ b/plugins/kapt3/kapt3-base/test/org/jetbrains/kotlin/kapt3/base/incremental/IncrementalKaptTest.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.base.kapt3.KaptOptions import org.jetbrains.kotlin.base.kapt3.collectJavaSourceFiles import org.jetbrains.kotlin.kapt3.base.KaptContext import org.jetbrains.kotlin.kapt3.base.doAnnotationProcessing +import org.jetbrains.kotlin.kapt3.base.incremental.RuntimeProcType import org.jetbrains.kotlin.kapt3.base.incremental.SourcesToReprocess import org.jetbrains.kotlin.kapt3.base.util.WriterBackedKaptLogger import org.junit.Assert.* @@ -160,4 +161,67 @@ class IncrementalKaptTest { assertTrue(outputDir.resolve("test/UserGenerated.java").exists()) } + + /** Regression test for KT-31322. */ + @Test + fun testCleanupWithDynamicNonIncremental() { + val sourcesDir = tmp.newFolder().resolve("test").also { base -> + base.mkdir() + listOf("User.java", "Address.java", "Observable.java").map { + TEST_DATA_DIR.resolve(it).copyTo(base.resolve(it)) + } + } + + val outputDir = tmp.newFolder() + val incrementalCacheDir = tmp.newFolder() + val options = KaptOptions.Builder().apply { + projectBaseDir = tmp.newFolder() + javaSourceRoots.add(sourcesDir) + + sourcesOutputDir = outputDir + classesOutputDir = outputDir + stubsOutputDir = outputDir + incrementalDataOutputDir = outputDir + + incrementalCache = incrementalCacheDir + }.build() + + val logger = WriterBackedKaptLogger(isVerbose = true) + KaptContext(options, true, logger).use { + it.doAnnotationProcessing( + options.collectJavaSourceFiles(SourcesToReprocess.FullRebuild), + listOf(DynamicProcessor(RuntimeProcType.NON_INCREMENTAL).toDynamic()) + ) + } + + val optionsForSecondRun = KaptOptions.Builder().apply { + projectBaseDir = tmp.newFolder() + javaSourceRoots.add(sourcesDir) + + sourcesOutputDir = outputDir + classesOutputDir = outputDir + stubsOutputDir = outputDir + incrementalDataOutputDir = outputDir + + incrementalCache = incrementalCacheDir + changedFiles.add(sourcesDir.resolve("User.java")) + flags.add(KaptFlag.INCREMENTAL_APT) + }.build() + + KaptContext(optionsForSecondRun, true, logger).use { + val sourcesToReprocess = + it.cacheManager!!.invalidateAndGetDirtyFiles(optionsForSecondRun.changedFiles, emptyList()) + assertEquals(SourcesToReprocess.FullRebuild, sourcesToReprocess) + + // check output dir is empty + assertEquals(listOf(outputDir), outputDir.walkTopDown().toList()) + + it.doAnnotationProcessing( + optionsForSecondRun.collectJavaSourceFiles(sourcesToReprocess), + listOf(DynamicProcessor(RuntimeProcType.NON_INCREMENTAL).toDynamic()) + ) + } + + assertTrue(outputDir.resolve("test/UserGenerated.java").exists()) + } } \ No newline at end of file