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