JPS: exclude source roots from other targets

Previously `findJavaRootDescriptor` was return source root for random
module. This cause build errors for mpp (same file may appear in
multiple source roots of common and platform modules)

#KT-28988 Fixed

Original commit: 75e59fdc46
This commit is contained in:
Sergey Rostov
2019-01-10 16:23:08 +03:00
parent 269f5e57f1
commit e9aeb9459b
7 changed files with 61 additions and 4 deletions
@@ -19,7 +19,9 @@ package org.jetbrains.kotlin.jps.build
import com.intellij.openapi.diagnostic.Logger
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.java.JavaSourceRootDescriptor
import org.jetbrains.jps.builders.java.dependencyView.Mappings
import org.jetbrains.jps.incremental.CompileContext
import org.jetbrains.jps.incremental.FSOperations
@@ -27,6 +29,7 @@ import org.jetbrains.jps.incremental.ModuleBuildTarget
import org.jetbrains.jps.incremental.fs.CompilationRound
import java.io.File
import java.util.HashMap
import kotlin.collections.*
/**
* Entry point for safely marking files as dirty.
@@ -76,10 +79,13 @@ class FSOperationsHelper(
fun markFilesForCurrentRound(target: ModuleBuildTarget, files: Iterable<File>) {
require(target in chunk.targets)
val targetDirtyFiles = dirtyFilesHolder.byTarget[target]!!
files.forEach {
val root = compileContext.projectDescriptor.buildRootIndex.findJavaRootDescriptor(compileContext, it)!!
targetDirtyFiles._markDirty(it, root)
val targetDirtyFiles = dirtyFilesHolder.byTarget.getValue(target)
files.forEach { file ->
val root = compileContext.projectDescriptor.buildRootIndex
.findAllParentDescriptors<BuildRootDescriptor>(file, compileContext)
.single { sourceRoot -> sourceRoot.target == target }
targetDirtyFiles._markDirty(file, root as JavaSourceRootDescriptor)
}
markFilesImpl(files, currentRound = true) { it.exists() }