[JS IR IC] Add Partial Linkage test
diff --git a/js/js.tests/test/org/jetbrains/kotlin/incremental/AbstractInvalidationTest.kt b/js/js.tests/test/org/jetbrains/kotlin/incremental/AbstractInvalidationTest.kt
index 236726a..48f5a40 100644
--- a/js/js.tests/test/org/jetbrains/kotlin/incremental/AbstractInvalidationTest.kt
+++ b/js/js.tests/test/org/jetbrains/kotlin/incremental/AbstractInvalidationTest.kt
@@ -12,7 +12,10 @@
 import com.intellij.psi.SingleRootFileViewProvider
 import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig
 import org.jetbrains.kotlin.backend.common.phaser.toPhaseMap
+import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
 import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport
+import org.jetbrains.kotlin.cli.common.messages.MessageRenderer
+import org.jetbrains.kotlin.cli.common.messages.PrintingMessageCollector
 import org.jetbrains.kotlin.cli.js.klib.generateIrForKlibSerialization
 import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
 import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
@@ -120,6 +123,7 @@
         copy.put(JSConfigurationKeys.MODULE_KIND, JS_MODULE_KIND)
         copy.put(JSConfigurationKeys.PROPERTY_LAZY_INITIALIZATION, true)
         copy.put(JSConfigurationKeys.SOURCE_MAP, true)
+        copy.put(JSConfigurationKeys.PARTIAL_LINKAGE, true)
 
         copy.languageVersionSettings = with(LanguageVersionSettingsBuilder()) {
             language.forEach {
diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsIrES6InvalidationTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsIrES6InvalidationTestGenerated.java
index 415c18f..08b1706 100644
--- a/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsIrES6InvalidationTestGenerated.java
+++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsIrES6InvalidationTestGenerated.java
@@ -300,6 +300,11 @@
         runTest("js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/");
     }
 
+    @TestMetadata("partialLinkage")
+    public void testPartialLinkage() throws Exception {
+        runTest("js/js.translator/testData/incremental/invalidation/partialLinkage/");
+    }
+
     @TestMetadata("privateDeclarationLeakThroughDefaultParam")
     public void testPrivateDeclarationLeakThroughDefaultParam() throws Exception {
         runTest("js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/");
diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsIrInvalidationTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsIrInvalidationTestGenerated.java
index 420db07..7a635ac 100644
--- a/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsIrInvalidationTestGenerated.java
+++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsIrInvalidationTestGenerated.java
@@ -300,6 +300,11 @@
         runTest("js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/");
     }
 
+    @TestMetadata("partialLinkage")
+    public void testPartialLinkage() throws Exception {
+        runTest("js/js.translator/testData/incremental/invalidation/partialLinkage/");
+    }
+
     @TestMetadata("privateDeclarationLeakThroughDefaultParam")
     public void testPrivateDeclarationLeakThroughDefaultParam() throws Exception {
         runTest("js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/");
diff --git a/js/js.translator/testData/incremental/invalidation/partialLinkage/lib1/l1.0.kt b/js/js.translator/testData/incremental/invalidation/partialLinkage/lib1/l1.0.kt
new file mode 100644
index 0000000..22669f4
--- /dev/null
+++ b/js/js.translator/testData/incremental/invalidation/partialLinkage/lib1/l1.0.kt
@@ -0,0 +1 @@
+fun foo() = 0
diff --git a/js/js.translator/testData/incremental/invalidation/partialLinkage/lib1/l1.1.kt b/js/js.translator/testData/incremental/invalidation/partialLinkage/lib1/l1.1.kt
new file mode 100644
index 0000000..0f63571
--- /dev/null
+++ b/js/js.translator/testData/incremental/invalidation/partialLinkage/lib1/l1.1.kt
@@ -0,0 +1 @@
+fun foo(x: Int) = x + 1
diff --git a/js/js.translator/testData/incremental/invalidation/partialLinkage/lib1/l1.2.kt b/js/js.translator/testData/incremental/invalidation/partialLinkage/lib1/l1.2.kt
new file mode 100644
index 0000000..07eb95e
--- /dev/null
+++ b/js/js.translator/testData/incremental/invalidation/partialLinkage/lib1/l1.2.kt
@@ -0,0 +1 @@
+fun foo() = 2
diff --git a/js/js.translator/testData/incremental/invalidation/partialLinkage/lib1/module.info b/js/js.translator/testData/incremental/invalidation/partialLinkage/lib1/module.info
new file mode 100644
index 0000000..89b531e
--- /dev/null
+++ b/js/js.translator/testData/incremental/invalidation/partialLinkage/lib1/module.info
@@ -0,0 +1,13 @@
+STEP 0:
+    modifications:
+        U : l1.0.kt -> l1.kt
+    added file: l1.kt
+STEP 1:
+    modifications:
+        U : l1.1.kt -> l1.kt
+    modified ir: l1.kt
+    updated exports: l1.kt
+STEP 2:
+    modifications:
+        U : l1.2.kt -> l1.kt
+    modified ir: l1.kt
diff --git a/js/js.translator/testData/incremental/invalidation/partialLinkage/main/m.kt b/js/js.translator/testData/incremental/invalidation/partialLinkage/main/m.kt
new file mode 100644
index 0000000..ce9d5a03
--- /dev/null
+++ b/js/js.translator/testData/incremental/invalidation/partialLinkage/main/m.kt
@@ -0,0 +1,8 @@
+fun box(stepId: Int): String {
+    val x = test()
+    when (stepId) {
+        in 0..2 -> if (stepId != x) return "Fail; got $x"
+        else -> return "Unknown"
+    }
+    return "OK"
+}
diff --git a/js/js.translator/testData/incremental/invalidation/partialLinkage/main/module.info b/js/js.translator/testData/incremental/invalidation/partialLinkage/main/module.info
new file mode 100644
index 0000000..7981283
--- /dev/null
+++ b/js/js.translator/testData/incremental/invalidation/partialLinkage/main/module.info
@@ -0,0 +1,12 @@
+STEP 0:
+    dependencies: lib1
+    modifications:
+        U : test.0.kt -> test.kt
+    added file: m.kt, test.kt
+STEP 1:
+    dependencies: lib1
+    rebuild klib: false
+    updated imports: test.kt
+STEP 2:
+    dependencies: lib1
+    rebuild klib: false
diff --git a/js/js.translator/testData/incremental/invalidation/partialLinkage/main/test.0.kt b/js/js.translator/testData/incremental/invalidation/partialLinkage/main/test.0.kt
new file mode 100644
index 0000000..b91367b
--- /dev/null
+++ b/js/js.translator/testData/incremental/invalidation/partialLinkage/main/test.0.kt
@@ -0,0 +1,7 @@
+fun test(): Int {
+    try {
+        return foo()
+    } catch (e: Error) {
+        return 1
+    }
+}
diff --git a/js/js.translator/testData/incremental/invalidation/partialLinkage/project.info b/js/js.translator/testData/incremental/invalidation/partialLinkage/project.info
new file mode 100644
index 0000000..48eccd6
--- /dev/null
+++ b/js/js.translator/testData/incremental/invalidation/partialLinkage/project.info
@@ -0,0 +1,8 @@
+MODULES: lib1, main
+
+STEP 0..1:
+    libs: lib1, main
+    dirty js: lib1, main
+STEP 2:
+    libs: lib1, main
+    dirty js: lib1