From 06275a201cfaff69440671a19c60d0fb178cd5f7 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. --- .../kotlin/jps/build/FSOperationsHelper.kt | 19 ++++++++++++++++++- .../multiplatform/custom/buildError/build.log | 3 +++ .../custom/buildError2Levels/build.log | 3 +++ .../custom/complementaryFiles/build.log | 4 ++++ tests/mute-common.csv | 2 -- 5 files changed, 28 insertions(+), 3 deletions(-) diff --git a/jps-plugin/src/org/jetbrains/kotlin/jps/build/FSOperationsHelper.kt b/jps-plugin/src/org/jetbrains/kotlin/jps/build/FSOperationsHelper.kt index 51ff82208df..d38aebdc087 100644 --- a/jps-plugin/src/org/jetbrains/kotlin/jps/build/FSOperationsHelper.kt +++ b/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-plugin/testData/incremental/multiModule/multiplatform/custom/buildError/build.log b/jps-plugin/testData/incremental/multiModule/multiplatform/custom/buildError/build.log index 186234f80fb..104fae8b14b 100644 --- a/jps-plugin/testData/incremental/multiModule/multiplatform/custom/buildError/build.log +++ b/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-plugin/testData/incremental/multiModule/multiplatform/custom/buildError2Levels/build.log b/jps-plugin/testData/incremental/multiModule/multiplatform/custom/buildError2Levels/build.log index 2f051fcd555..75f18a0efbb 100644 --- a/jps-plugin/testData/incremental/multiModule/multiplatform/custom/buildError2Levels/build.log +++ b/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-plugin/testData/incremental/multiModule/multiplatform/custom/complementaryFiles/build.log b/jps-plugin/testData/incremental/multiModule/multiplatform/custom/complementaryFiles/build.log index 55fe16560c0..d50092a5710 100644 --- a/jps-plugin/testData/incremental/multiModule/multiplatform/custom/complementaryFiles/build.log +++ b/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 diff --git a/tests/mute-common.csv b/tests/mute-common.csv index eb1f5271dd3..5affa661194 100644 --- a/tests/mute-common.csv +++ b/tests/mute-common.csv @@ -47,8 +47,6 @@ org.jetbrains.kotlin.idea.spring.tests.references.SpringReferenceNavigationTestG org.jetbrains.kotlin.idea.stubs.MultiFileHighlightingTestGenerated.testTopLevelMembersReference, Always red org.jetbrains.kotlin.j2k.JavaToKotlinConverterSingleFileTestGenerated.AnonymousClass.testKt_13146 org.jetbrains.kotlin.j2k.JavaToKotlinConverterSingleFileTestGenerated.Issues.testKt_807 -org.jetbrains.kotlin.jps.build.IncrementalJvmJpsTestGenerated.Custom.testBuildError, Since dc8240c24ebd-ab79c3e0a06f0 Function has several compatible actual declarations in modules -org.jetbrains.kotlin.jps.build.IncrementalJvmJpsTestGenerated.Custom.testBuildError2Levels, Since dc8240c24ebd-ab79c3e0a06f0 Function has several compatible actual declarations in modules org.jetbrains.kotlin.jps.build.IncrementalJvmJpsTestGenerated.WithJava.JavaUsedInKotlin.testMixedInheritance, Different clean up org.jetbrains.kotlin.psi.injection.StringInterpolationInjectionTest.testInterpolationSimpleName, Stable failure during run may work in debug org.jetbrains.kotlin.nj2k.NewJavaToKotlinConverterSingleFileTestGenerated.Issues.testKt_8170, KT-36459