From 60a8db1c6cc1c4ecfc2037901a182c959a13dadb Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Fri, 27 Nov 2015 20:01:50 +0300 Subject: [PATCH] Do not use USER_DATA to preserve data between compilation rounds --- .../kotlin/jps/build/KotlinBuilder.kt | 33 ++++--------------- .../kotlin/jps/build/KotlinJpsBuildTest.kt | 2 +- .../clearedHasKotlin/build.log | 22 ------------- .../data-container-version-build.log | 24 +------------- .../moduleWithConstantModified/build.log | 6 ---- .../moduleWithInlineModified/build.log | 6 ---- .../incrementalOffOn/build.log | 11 +++++++ 7 files changed, 19 insertions(+), 85 deletions(-) diff --git a/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt b/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt index d18e41ac030..9681dd830a3 100644 --- a/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt +++ b/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt @@ -74,27 +74,12 @@ import java.util.* public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) { companion object { - private val TARGETS_WITH_CLEARED_CACHES = Key>("Targets with cleared Kotlin caches") private val HAS_KOTLIN_FILE_NAME = "has-kotlin.txt" public val KOTLIN_BUILDER_NAME: String = "Kotlin Builder" public val LOOKUP_TRACKER: JpsElementChildRoleBase> = JpsElementChildRoleBase.create("lookup tracker") val LOG = Logger.getInstance("#org.jetbrains.kotlin.jps.build.KotlinBuilder") - private fun registerTargetsWithClearedCaches(context: CompileContext, targets: Set) { - synchronized(TARGETS_WITH_CLEARED_CACHES) { - val data = (context.getUserData(TARGETS_WITH_CLEARED_CACHES) ?: setOf()) + targets - context.putUserData(TARGETS_WITH_CLEARED_CACHES, data) - } - } - - private fun unregisterTargetsWithClearedCaches(context: CompileContext, targets: Set) { - synchronized(TARGETS_WITH_CLEARED_CACHES) { - val data = (context.getUserData(TARGETS_WITH_CLEARED_CACHES) ?: setOf()) - targets - context.putUserData(TARGETS_WITH_CLEARED_CACHES, data) - } - } - private fun hasKotlin(target: ModuleBuildTarget, paths: BuildDataPaths): Boolean { val hasKotlinFile = File(paths.getTargetDataRoot(target), HAS_KOTLIN_FILE_NAME) return hasKotlinFile.exists() @@ -174,21 +159,21 @@ public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR val projectDescriptor = context.projectDescriptor val dataManager = projectDescriptor.dataManager val targets = chunk.targets - val requestedToRebuild = context.getUserData(TARGETS_WITH_CLEARED_CACHES) ?: setOf() val isFullRebuild = JavaBuilderUtil.isForcedRecompilationAllJavaModules(context) - val hasDirtyKotlin = (dirtyFilesHolder.hasDirtyFiles() || dirtyFilesHolder.hasRemovedFiles()) && - hasKotlinDirtyOrRemovedFiles(dirtyFilesHolder, chunk) if (!isFullRebuild && - !requestedToRebuild.containsAll(targets) && - (hasDirtyKotlin || targets.any { hasKotlin(it, dataManager.dataPaths) }) && + targets.any { hasKotlin(it, dataManager.dataPaths) } && shouldRebuildBecauseVersionChanged(context, dataManager, targets) ) { FSOperations.markDirtyRecursively(context, CompilationRound.NEXT, chunk) { KotlinSourceFileCollector.isKotlinSourceFile(it) } + val targetsWithDependents = getIncrementalCaches(chunk, context).keys + targetsWithDependents.forEach { clearHasKotlin(it, dataManager.dataPaths) } return CHUNK_REBUILD_REQUIRED } - if (hasDirtyKotlin) { + if ((dirtyFilesHolder.hasDirtyFiles() || dirtyFilesHolder.hasRemovedFiles()) && + hasKotlinDirtyOrRemovedFiles(dirtyFilesHolder, chunk) + ) { targets.forEach { setHasKotlin(it, dataManager.dataPaths) } } else { @@ -372,20 +357,15 @@ public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR for (target in allTargets) { dataManager.getKotlinCache(target).clean() - - // prevents excessive version checking in parallel compilation (user data is not shared in parallel compilation) - clearHasKotlin(target, dataManager.dataPaths) } dataManager.getStorage(KotlinDataContainerTarget, LookupStorageProvider).clean() - registerTargetsWithClearedCaches(context, allTargets) return true } CacheVersion.Action.REBUILD_CHUNK -> { LOG.info("Clearing caches for " + targets.joinToString { it.presentableName }) targets.forEach { dataManager.getKotlinCache(it).clean() } - registerTargetsWithClearedCaches(context, targets) return true } CacheVersion.Action.CLEAN_NORMAL_CACHES -> { @@ -421,7 +401,6 @@ public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR val targets = chunk.targets val cacheVersionsProvider = CacheVersionProvider(dataManager.dataPaths) cacheVersionsProvider.allVersions(targets).forEach { it.saveIfNeeded() } - unregisterTargetsWithClearedCaches(context, targets) } private fun doCompileModuleChunk( diff --git a/jps-plugin/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt b/jps-plugin/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt index 64194f40f8f..e35f4947fd8 100644 --- a/jps-plugin/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt +++ b/jps-plugin/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt @@ -235,7 +235,7 @@ public class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() { val buildResult = makeAll() buildResult.assertSuccessful() val warnings = buildResult.getMessages(BuildMessage.Kind.WARNING) - assertEquals("Warning about invalid package prefix in module 2 is expected: $warnings", 1, warnings.size) + assertEquals("Warning about invalid package prefix in module 2 is expected: $warnings", 2, warnings.size) assertEquals("Invalid package prefix name is ignored: invalid-prefix.test", warnings.first().messageText) } diff --git a/jps-plugin/testData/incremental/cacheVersionChanged/clearedHasKotlin/build.log b/jps-plugin/testData/incremental/cacheVersionChanged/clearedHasKotlin/build.log index e058b68b0ac..83489248281 100644 --- a/jps-plugin/testData/incremental/cacheVersionChanged/clearedHasKotlin/build.log +++ b/jps-plugin/testData/incremental/cacheVersionChanged/clearedHasKotlin/build.log @@ -9,28 +9,6 @@ End of files Cleaning output files: out/production/module1/A.class End of files -Cleaning output files: -out/production/module1/B.class -out/production/module1/C.class -out/production/module1/D.class -End of files Compiling files: module1/src/module1_A.kt -module1/src/module1_B.kt -End of files -Compiling files: -module1/src/module1_C.java -module1/src/module1_D.java -End of files -Cleaning output files: -out/production/module2/E.class -End of files -Compiling files: -module2/src/module2_E.kt -End of files -Cleaning output files: -out/production/module3/F.class -End of files -Compiling files: -module3/src/module3_F.kt End of files \ No newline at end of file diff --git a/jps-plugin/testData/incremental/cacheVersionChanged/clearedHasKotlin/data-container-version-build.log b/jps-plugin/testData/incremental/cacheVersionChanged/clearedHasKotlin/data-container-version-build.log index 1e24f9e3e07..83489248281 100644 --- a/jps-plugin/testData/incremental/cacheVersionChanged/clearedHasKotlin/data-container-version-build.log +++ b/jps-plugin/testData/incremental/cacheVersionChanged/clearedHasKotlin/data-container-version-build.log @@ -9,28 +9,6 @@ End of files Cleaning output files: out/production/module1/A.class End of files -Cleaning output files: -out/production/module1/B.class -out/production/module1/C.class -out/production/module1/D.class -End of files Compiling files: module1/src/module1_A.kt -module1/src/module1_B.kt -End of files -Compiling files: -module1/src/module1_C.java -module1/src/module1_D.java -End of files -Cleaning output files: -out/production/module2/E.class -End of files -Compiling files: -module2/src/module2_E.kt -End of files -Cleaning output files: -out/production/module3/F.class -End of files -Compiling files: -module3/src/module3_F.kt -End of files +End of files \ No newline at end of file diff --git a/jps-plugin/testData/incremental/cacheVersionChanged/moduleWithConstantModified/build.log b/jps-plugin/testData/incremental/cacheVersionChanged/moduleWithConstantModified/build.log index f7d0b6869ff..d9e25129990 100644 --- a/jps-plugin/testData/incremental/cacheVersionChanged/moduleWithConstantModified/build.log +++ b/jps-plugin/testData/incremental/cacheVersionChanged/moduleWithConstantModified/build.log @@ -8,12 +8,6 @@ End of files Cleaning output files: out/production/module2/b/B.class End of files -Cleaning output files: -out/production/module2/b/C.class -End of files Compiling files: module2/src/module2_B.kt -End of files -Compiling files: -module2/src/module2_C.java End of files \ No newline at end of file diff --git a/jps-plugin/testData/incremental/cacheVersionChanged/moduleWithInlineModified/build.log b/jps-plugin/testData/incremental/cacheVersionChanged/moduleWithInlineModified/build.log index 679e1ce6888..2883783148a 100644 --- a/jps-plugin/testData/incremental/cacheVersionChanged/moduleWithInlineModified/build.log +++ b/jps-plugin/testData/incremental/cacheVersionChanged/moduleWithInlineModified/build.log @@ -9,12 +9,6 @@ End of files Cleaning output files: out/production/module2/b/B.class End of files -Cleaning output files: -out/production/module2/b/C.class -End of files Compiling files: module2/src/module2_B.kt -End of files -Compiling files: -module2/src/module2_C.java End of files \ No newline at end of file diff --git a/jps-plugin/testData/incremental/changeIncrementalOption/incrementalOffOn/build.log b/jps-plugin/testData/incremental/changeIncrementalOption/incrementalOffOn/build.log index d9957c7d841..bf4fea0aa71 100644 --- a/jps-plugin/testData/incremental/changeIncrementalOption/incrementalOffOn/build.log +++ b/jps-plugin/testData/incremental/changeIncrementalOption/incrementalOffOn/build.log @@ -27,6 +27,17 @@ module2/src/module2_b.kt module2/src/module2_c.kt End of files Cleaning output files: +out/production/module2/META-INF/module2.kotlin_module +out/production/module2/foo/Module2_aKt.class +out/production/module2/foo/Module2_bKt.class +out/production/module2/foo/Module2_cKt.class +End of files +Compiling files: +module2/src/module2_a.kt +module2/src/module2_b.kt +module2/src/module2_c.kt +End of files +Cleaning output files: out/production/module3/foo/D.class End of files Compiling files: