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