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:
@@ -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>) {
|
||||||
|
|||||||
+3
@@ -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
|
||||||
|
|||||||
Vendored
+3
@@ -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
|
||||||
|
|||||||
Vendored
+4
@@ -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
|
||||||
|
|||||||
@@ -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.
|
Reference in New Issue
Block a user