From 6f7fffbffc45e770a9918bdf6815ed09ead3845a Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Fri, 17 Apr 2020 13:06:19 +0300 Subject: [PATCH] JPS: remove outputs for additional dirty files for current iteration JPS does not remove output files for files marked as dirty for current iteration. This is a problem for adding complementary files during JPS MPP IC. If output files are not removed, the compiler might raise an error for duplicated actual declarations. Original commit: 06275a201cfaff69440671a19c60d0fb178cd5f7 --- .../kotlin/jps/build/FSOperationsHelper.kt | 19 ++++++++++++++++++- .../multiplatform/custom/buildError/build.log | 3 +++ .../custom/buildError2Levels/build.log | 3 +++ .../custom/complementaryFiles/build.log | 4 ++++ 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/FSOperationsHelper.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/FSOperationsHelper.kt index 51ff82208df..d38aebdc087 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/FSOperationsHelper.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/FSOperationsHelper.kt @@ -21,8 +21,11 @@ import com.intellij.util.containers.ContainerUtil import org.jetbrains.jps.ModuleChunk import org.jetbrains.jps.builders.BuildRootDescriptor import org.jetbrains.jps.builders.BuildTarget +import org.jetbrains.jps.builders.FileProcessor +import org.jetbrains.jps.builders.impl.DirtyFilesHolderBase import org.jetbrains.jps.builders.java.JavaSourceRootDescriptor import org.jetbrains.jps.builders.java.dependencyView.Mappings +import org.jetbrains.jps.incremental.BuildOperations import org.jetbrains.jps.incremental.CompileContext import org.jetbrains.jps.incremental.FSOperations import org.jetbrains.jps.incremental.ModuleBuildTarget @@ -76,19 +79,33 @@ class FSOperationsHelper( /** * Marks given [files] as dirty for current round and given [target] of [chunk]. */ - fun markFilesForCurrentRound(target: ModuleBuildTarget, files: Iterable) { + fun markFilesForCurrentRound(target: ModuleBuildTarget, files: Collection) { require(target in chunk.targets) val targetDirtyFiles = dirtyFilesHolder.byTarget.getValue(target) + val dirtyFileToRoot = HashMap() files.forEach { file -> val root = compileContext.projectDescriptor.buildRootIndex .findAllParentDescriptors(file, compileContext) .single { sourceRoot -> sourceRoot.target == target } targetDirtyFiles._markDirty(file, root as JavaSourceRootDescriptor) + dirtyFileToRoot[file] = root } markFilesImpl(files, currentRound = true) { it.exists() } + cleanOutputsForNewDirtyFilesInCurrentRound(target, dirtyFileToRoot) + } + + private fun cleanOutputsForNewDirtyFilesInCurrentRound(target: ModuleBuildTarget, dirtyFiles: Map) { + val dirtyFilesHolder = object : DirtyFilesHolderBase(compileContext) { + override fun processDirtyFiles(processor: FileProcessor) { + dirtyFiles.forEach { (file, root) -> processor.apply(target, file, root) } + } + + override fun hasDirtyFiles(): Boolean = dirtyFiles.isNotEmpty() + } + BuildOperations.cleanOutputsCorrespondingToChangedFiles(compileContext, dirtyFilesHolder) } fun markFiles(files: Iterable) { diff --git a/jps/jps-plugin/testData/incremental/multiModule/multiplatform/custom/buildError/build.log b/jps/jps-plugin/testData/incremental/multiModule/multiplatform/custom/buildError/build.log index 186234f80fb..104fae8b14b 100644 --- a/jps/jps-plugin/testData/incremental/multiModule/multiplatform/custom/buildError/build.log +++ b/jps/jps-plugin/testData/incremental/multiModule/multiplatform/custom/buildError/build.log @@ -31,6 +31,9 @@ Building pJvm Cleaning output files: out/production/pJvm/META-INF/pJvm.kotlin_module End of files +Cleaning output files: + out/production/pJvm/FJvmKt.class +End of files Compiling files: c/src/f.kt pJvm/src/fJvm.kt diff --git a/jps/jps-plugin/testData/incremental/multiModule/multiplatform/custom/buildError2Levels/build.log b/jps/jps-plugin/testData/incremental/multiModule/multiplatform/custom/buildError2Levels/build.log index 2f051fcd555..75f18a0efbb 100644 --- a/jps/jps-plugin/testData/incremental/multiModule/multiplatform/custom/buildError2Levels/build.log +++ b/jps/jps-plugin/testData/incremental/multiModule/multiplatform/custom/buildError2Levels/build.log @@ -35,6 +35,9 @@ Building pJvm Cleaning output files: out/production/pJvm/META-INF/pJvm.kotlin_module End of files +Cleaning output files: + out/production/pJvm/FgKt.class +End of files Compiling files: c/src/f.kt c/src/g.kt diff --git a/jps/jps-plugin/testData/incremental/multiModule/multiplatform/custom/complementaryFiles/build.log b/jps/jps-plugin/testData/incremental/multiModule/multiplatform/custom/complementaryFiles/build.log index 55fe16560c0..d50092a5710 100644 --- a/jps/jps-plugin/testData/incremental/multiModule/multiplatform/custom/complementaryFiles/build.log +++ b/jps/jps-plugin/testData/incremental/multiModule/multiplatform/custom/complementaryFiles/build.log @@ -6,6 +6,10 @@ Cleaning output files: out/production/pJvm/FJvmKt.class out/production/pJvm/META-INF/pJvm.kotlin_module End of files +Cleaning output files: + out/production/pJvm/FKt.class + out/production/pJvm/SharedImmutable.class +End of files Compiling files: c/src/f.kt pJvm/src/fJvm.kt