diff --git a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java index e2d31966418..52e58a691ab 100644 --- a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java +++ b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java @@ -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) 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 6be8361cce3..51ff82208df 100644 --- a/jps-plugin/src/org/jetbrains/kotlin/jps/build/FSOperationsHelper.kt +++ b/jps-plugin/src/org/jetbrains/kotlin/jps/build/FSOperationsHelper.kt @@ -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) { 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(file, compileContext) + .single { sourceRoot -> sourceRoot.target == target } + + targetDirtyFiles._markDirty(file, root as JavaSourceRootDescriptor) } markFilesImpl(files, currentRound = true) { it.exists() } diff --git a/jps-plugin/testData/incremental/multiModule/multiplatform/custom/complementaryFiles/_dependencies.txt b/jps-plugin/testData/incremental/multiModule/multiplatform/custom/complementaryFiles/_dependencies.txt new file mode 100644 index 00000000000..4d7c19bc98d --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/multiplatform/custom/complementaryFiles/_dependencies.txt @@ -0,0 +1,4 @@ +c [sourceSetHolder] + +pJvm [compilationAndSourceSetHolder, jvm] +pJvm -> c [include] \ No newline at end of file diff --git a/jps-plugin/testData/incremental/multiModule/multiplatform/custom/complementaryFiles/build.log b/jps-plugin/testData/incremental/multiModule/multiplatform/custom/complementaryFiles/build.log new file mode 100644 index 00000000000..55fe16560c0 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/multiplatform/custom/complementaryFiles/build.log @@ -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 +------------------------------------------ \ No newline at end of file diff --git a/jps-plugin/testData/incremental/multiModule/multiplatform/custom/complementaryFiles/c_f.kt b/jps-plugin/testData/incremental/multiModule/multiplatform/custom/complementaryFiles/c_f.kt new file mode 100644 index 00000000000..8cd923f49e2 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/multiplatform/custom/complementaryFiles/c_f.kt @@ -0,0 +1,9 @@ +expect fun f() + +@ExperimentalMultiplatform +@OptionalExpectation +internal expect annotation class SharedImmutable() + +@ExperimentalMultiplatform +@SharedImmutable +val UNDEFINED = 1 \ No newline at end of file diff --git a/jps-plugin/testData/incremental/multiModule/multiplatform/custom/complementaryFiles/pJvm_fJvm.kt b/jps-plugin/testData/incremental/multiModule/multiplatform/custom/complementaryFiles/pJvm_fJvm.kt new file mode 100644 index 00000000000..28071449f08 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/multiplatform/custom/complementaryFiles/pJvm_fJvm.kt @@ -0,0 +1,3 @@ +actual fun f() = Unit + +fun x() = 1 \ No newline at end of file diff --git a/jps-plugin/testData/incremental/multiModule/multiplatform/custom/complementaryFiles/pJvm_fJvm.kt.new.1 b/jps-plugin/testData/incremental/multiModule/multiplatform/custom/complementaryFiles/pJvm_fJvm.kt.new.1 new file mode 100644 index 00000000000..882aadc875c --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/multiplatform/custom/complementaryFiles/pJvm_fJvm.kt.new.1 @@ -0,0 +1,3 @@ +actual fun f() = Unit + +fun x() = 2 \ No newline at end of file