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
@@ -594,6 +594,11 @@ public class IncrementalJpsTestGenerated extends AbstractIncrementalJpsTest {
runTest("jps-plugin/testData/incremental/multiModule/multiplatform/custom/commonSourcesCompilerArg/");
}
@TestMetadata("complementaryFiles")
public void testComplementaryFiles() throws Exception {
runTest("jps-plugin/testData/incremental/multiModule/multiplatform/custom/complementaryFiles/");
}
@TestMetadata("notSameCompiler")
public void testNotSameCompiler() throws Exception {
runTest("jps-plugin/testData/incremental/multiModule/multiplatform/custom/notSameCompiler/");
@@ -638,6 +643,19 @@ public class IncrementalJpsTestGenerated extends AbstractIncrementalJpsTest {
}
}
@TestMetadata("jps-plugin/testData/incremental/multiModule/multiplatform/custom/complementaryFiles")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class ComplementaryFiles extends AbstractIncrementalJpsTest {
private void runTest(String testDataFilePath) throws Exception {
KotlinTestUtils.runTest(this::doTest, TargetBackend.ANY, testDataFilePath);
}
public void testAllFilesPresentInComplementaryFiles() throws Exception {
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("jps-plugin/testData/incremental/multiModule/multiplatform/custom/complementaryFiles"), Pattern.compile("^([^\\.]+)$"), TargetBackend.ANY, true);
}
}
@TestMetadata("jps-plugin/testData/incremental/multiModule/multiplatform/custom/notSameCompiler")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
@@ -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() }
@@ -0,0 +1,4 @@
c [sourceSetHolder]
pJvm [compilationAndSourceSetHolder, jvm]
pJvm -> c [include]
@@ -0,0 +1,14 @@
================ Step #1 =================
Building c
Building pJvm
Cleaning output files:
out/production/pJvm/FJvmKt.class
out/production/pJvm/META-INF/pJvm.kotlin_module
End of files
Compiling files:
c/src/f.kt
pJvm/src/fJvm.kt
End of files
Exit code: OK
------------------------------------------
@@ -0,0 +1,9 @@
expect fun f()
@ExperimentalMultiplatform
@OptionalExpectation
internal expect annotation class SharedImmutable()
@ExperimentalMultiplatform
@SharedImmutable
val UNDEFINED = 1
@@ -0,0 +1,3 @@
actual fun f() = Unit
fun x() = 1
@@ -0,0 +1,3 @@
actual fun f() = Unit
fun x() = 2