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.
This commit is contained in:
Alexey Tsvetkov
2020-04-17 13:06:19 +03:00
parent 4ccec5218f
commit 06275a201c
5 changed files with 28 additions and 3 deletions
@@ -21,8 +21,11 @@ import com.intellij.util.containers.ContainerUtil
import org.jetbrains.jps.ModuleChunk import org.jetbrains.jps.ModuleChunk
import org.jetbrains.jps.builders.BuildRootDescriptor import org.jetbrains.jps.builders.BuildRootDescriptor
import org.jetbrains.jps.builders.BuildTarget 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.JavaSourceRootDescriptor
import org.jetbrains.jps.builders.java.dependencyView.Mappings 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.CompileContext
import org.jetbrains.jps.incremental.FSOperations import org.jetbrains.jps.incremental.FSOperations
import org.jetbrains.jps.incremental.ModuleBuildTarget 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]. * Marks given [files] as dirty for current round and given [target] of [chunk].
*/ */
fun markFilesForCurrentRound(target: ModuleBuildTarget, files: Iterable<File>) { fun markFilesForCurrentRound(target: ModuleBuildTarget, files: Collection<File>) {
require(target in chunk.targets) require(target in chunk.targets)
val targetDirtyFiles = dirtyFilesHolder.byTarget.getValue(target) val targetDirtyFiles = dirtyFilesHolder.byTarget.getValue(target)
val dirtyFileToRoot = HashMap<File, JavaSourceRootDescriptor>()
files.forEach { file -> files.forEach { file ->
val root = compileContext.projectDescriptor.buildRootIndex val root = compileContext.projectDescriptor.buildRootIndex
.findAllParentDescriptors<BuildRootDescriptor>(file, compileContext) .findAllParentDescriptors<BuildRootDescriptor>(file, compileContext)
.single { sourceRoot -> sourceRoot.target == target } .single { sourceRoot -> sourceRoot.target == target }
targetDirtyFiles._markDirty(file, root as JavaSourceRootDescriptor) targetDirtyFiles._markDirty(file, root as JavaSourceRootDescriptor)
dirtyFileToRoot[file] = root
} }
markFilesImpl(files, currentRound = true) { it.exists() } markFilesImpl(files, currentRound = true) { it.exists() }
cleanOutputsForNewDirtyFilesInCurrentRound(target, dirtyFileToRoot)
}
private fun cleanOutputsForNewDirtyFilesInCurrentRound(target: ModuleBuildTarget, dirtyFiles: Map<File, JavaSourceRootDescriptor>) {
val dirtyFilesHolder = object : DirtyFilesHolderBase<JavaSourceRootDescriptor, ModuleBuildTarget>(compileContext) {
override fun processDirtyFiles(processor: FileProcessor<JavaSourceRootDescriptor, ModuleBuildTarget>) {
dirtyFiles.forEach { (file, root) -> processor.apply(target, file, root) }
}
override fun hasDirtyFiles(): Boolean = dirtyFiles.isNotEmpty()
}
BuildOperations.cleanOutputsCorrespondingToChangedFiles(compileContext, dirtyFilesHolder)
} }
fun markFiles(files: Iterable<File>) { fun markFiles(files: Iterable<File>) {
@@ -31,6 +31,9 @@ Building pJvm
Cleaning output files: Cleaning output files:
out/production/pJvm/META-INF/pJvm.kotlin_module out/production/pJvm/META-INF/pJvm.kotlin_module
End of files End of files
Cleaning output files:
out/production/pJvm/FJvmKt.class
End of files
Compiling files: Compiling files:
c/src/f.kt c/src/f.kt
pJvm/src/fJvm.kt pJvm/src/fJvm.kt
@@ -35,6 +35,9 @@ Building pJvm
Cleaning output files: Cleaning output files:
out/production/pJvm/META-INF/pJvm.kotlin_module out/production/pJvm/META-INF/pJvm.kotlin_module
End of files End of files
Cleaning output files:
out/production/pJvm/FgKt.class
End of files
Compiling files: Compiling files:
c/src/f.kt c/src/f.kt
c/src/g.kt c/src/g.kt
@@ -6,6 +6,10 @@ Cleaning output files:
out/production/pJvm/FJvmKt.class out/production/pJvm/FJvmKt.class
out/production/pJvm/META-INF/pJvm.kotlin_module out/production/pJvm/META-INF/pJvm.kotlin_module
End of files End of files
Cleaning output files:
out/production/pJvm/FKt.class
out/production/pJvm/SharedImmutable.class
End of files
Compiling files: Compiling files:
c/src/f.kt c/src/f.kt
pJvm/src/fJvm.kt pJvm/src/fJvm.kt
-2
View File
@@ -47,8 +47,6 @@ org.jetbrains.kotlin.idea.spring.tests.references.SpringReferenceNavigationTestG
org.jetbrains.kotlin.idea.stubs.MultiFileHighlightingTestGenerated.testTopLevelMembersReference, Always red org.jetbrains.kotlin.idea.stubs.MultiFileHighlightingTestGenerated.testTopLevelMembersReference, Always red
org.jetbrains.kotlin.j2k.JavaToKotlinConverterSingleFileTestGenerated.AnonymousClass.testKt_13146 org.jetbrains.kotlin.j2k.JavaToKotlinConverterSingleFileTestGenerated.AnonymousClass.testKt_13146
org.jetbrains.kotlin.j2k.JavaToKotlinConverterSingleFileTestGenerated.Issues.testKt_807 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.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.psi.injection.StringInterpolationInjectionTest.testInterpolationSimpleName, Stable failure during run may work in debug
org.jetbrains.kotlin.nj2k.NewJavaToKotlinConverterSingleFileTestGenerated.Issues.testKt_8170, KT-36459 org.jetbrains.kotlin.nj2k.NewJavaToKotlinConverterSingleFileTestGenerated.Issues.testKt_8170, KT-36459
Can't render this file because it contains an unexpected character in line 12 and column 132.