From 36b8b9fbdbe452d93d267d437dc05a16dc8b418f Mon Sep 17 00:00:00 2001 From: Sergey Rostov Date: Tue, 20 Nov 2018 13:41:18 +0300 Subject: [PATCH] Fix updating complementary files map in case of compilation errors #KT-27868 Fixed Previously given dirtyFiles was removed from complementaryFilesMap exactly on call of clearComplementaryFilesMapping. This causes fail of next build in case of compilation error of previous build on JPS (since complementary files not known on second build). The right way to do it is removing (replacing) them only after successful build. This was working on Gradle since Gradle rebuilds whole module (project) in case of build error. Original commit: f70d01f657d8c449aee6cb2b4f45d19967787a4f --- .../org/jetbrains/kotlin/jps/build/KotlinBuilder.kt | 10 ++++++++-- .../kotlin/jps/targets/KotlinJsModuleBuildTarget.kt | 3 ++- .../kotlin/jps/targets/KotlinJvmModuleBuildTarget.kt | 3 ++- .../kotlin/jps/targets/KotlinModuleBuildTarget.kt | 10 +++++++--- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt index 6270b13249c..aa6bc4be271 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt @@ -468,7 +468,13 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) { for ((target, files) in generatedFiles) { val kotlinModuleBuilderTarget = kotlinContext.targetsBinding[target]!! - kotlinModuleBuilderTarget.updateCaches(incrementalCaches[kotlinModuleBuilderTarget]!!, files, changesCollector, environment) + kotlinModuleBuilderTarget.updateCaches( + kotlinDirtyFilesHolder, + incrementalCaches[kotlinModuleBuilderTarget]!!, + files, + changesCollector, + environment + ) } updateLookupStorage(lookupTracker, dataManager, kotlinDirtyFilesHolder) @@ -512,7 +518,7 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) { val targetDirtyFiles = dirtyFilesHolder.byTarget[jpsTarget] if (cache != null && targetDirtyFiles != null) { - val complementaryFiles = cache.clearComplementaryFilesMapping( + val complementaryFiles = cache.getComplementaryFilesRecursive( targetDirtyFiles.dirty.keys + targetDirtyFiles.removed ) diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinJsModuleBuildTarget.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinJsModuleBuildTarget.kt index f75403afbe3..9b805a8e6a6 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinJsModuleBuildTarget.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinJsModuleBuildTarget.kt @@ -211,12 +211,13 @@ class KotlinJsModuleBuildTarget(kotlinContext: KotlinCompileContext, jpsModuleBu JpsIncrementalJsCache(jpsModuleBuildTarget, paths) override fun updateCaches( + dirtyFilesHolder: KotlinDirtySourceFilesHolder, jpsIncrementalCache: JpsIncrementalCache, files: List, changesCollector: ChangesCollector, environment: JpsCompilerEnvironment ) { - super.updateCaches(jpsIncrementalCache, files, changesCollector, environment) + super.updateCaches(dirtyFilesHolder, jpsIncrementalCache, files, changesCollector, environment) val incrementalResults = environment.services[IncrementalResultsConsumer::class.java] as IncrementalResultsConsumerImpl diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinJvmModuleBuildTarget.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinJvmModuleBuildTarget.kt index 8c719a3901d..e5c5653819b 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinJvmModuleBuildTarget.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinJvmModuleBuildTarget.kt @@ -254,12 +254,13 @@ class KotlinJvmModuleBuildTarget(kotlinContext: KotlinCompileContext, jpsModuleB } override fun updateCaches( + dirtyFilesHolder: KotlinDirtySourceFilesHolder, jpsIncrementalCache: JpsIncrementalCache, files: List, changesCollector: ChangesCollector, environment: JpsCompilerEnvironment ) { - super.updateCaches(jpsIncrementalCache, files, changesCollector, environment) + super.updateCaches(dirtyFilesHolder, jpsIncrementalCache, files, changesCollector, environment) updateIncrementalCache(files, jpsIncrementalCache as IncrementalJvmCache, changesCollector, null) } diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinModuleBuildTarget.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinModuleBuildTarget.kt index 3e66c6a8662..1f463220131 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinModuleBuildTarget.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinModuleBuildTarget.kt @@ -27,11 +27,11 @@ import org.jetbrains.kotlin.incremental.ChangesCollector import org.jetbrains.kotlin.incremental.ExpectActualTrackerImpl import org.jetbrains.kotlin.incremental.components.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.LookupTracker +import org.jetbrains.kotlin.jps.build.* import org.jetbrains.kotlin.jps.incremental.CacheAttributesDiff +import org.jetbrains.kotlin.jps.incremental.JpsIncrementalCache import org.jetbrains.kotlin.jps.incremental.loadDiff import org.jetbrains.kotlin.jps.incremental.localCacheVersionManager -import org.jetbrains.kotlin.jps.build.* -import org.jetbrains.kotlin.jps.incremental.JpsIncrementalCache import org.jetbrains.kotlin.jps.model.productionOutputFilePath import org.jetbrains.kotlin.jps.model.testOutputFilePath import org.jetbrains.kotlin.modules.TargetId @@ -246,13 +246,17 @@ abstract class KotlinModuleBuildTarget intern } open fun updateCaches( + dirtyFilesHolder: KotlinDirtySourceFilesHolder, jpsIncrementalCache: JpsIncrementalCache, files: List, changesCollector: ChangesCollector, environment: JpsCompilerEnvironment ) { + val changedAndRemovedFiles = dirtyFilesHolder.getDirtyFiles(jpsModuleBuildTarget).keys + + dirtyFilesHolder.getRemovedFiles(jpsModuleBuildTarget) val expectActualTracker = environment.services[ExpectActualTracker::class.java] as ExpectActualTrackerImpl - jpsIncrementalCache.registerComplementaryFiles(expectActualTracker) + + jpsIncrementalCache.updateComplementaryFiles(changedAndRemovedFiles,expectActualTracker) } open fun makeServices(