DO_NOT_MERGE [JS] Break the order of dependencies in JS IC
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/CacheUpdater.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/CacheUpdater.kt
index 6533335..01e7928 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/CacheUpdater.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/CacheUpdater.kt
@@ -19,7 +19,7 @@
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.js.config.JSConfigurationKeys
import org.jetbrains.kotlin.library.KotlinLibrary
-import org.jetbrains.kotlin.library.metadata.resolver.TopologicalLibraryOrder
+import org.jetbrains.kotlin.library.isAnyPlatformStdlib
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.utils.memoryOptimizedFilter
import org.jetbrains.kotlin.utils.memoryOptimizedMap
@@ -134,8 +134,8 @@
private inner class CacheUpdaterInternal {
val signatureHashCalculator = IdSignatureHashCalculator(icHasher)
- // libraries in topological order: [stdlib, ..., main]
- val orderedLibraries = stopwatch.measure("Resolving and loading klib dependencies") {
+ // libraries in JS-specific order: [stdlib, <dependencies in CLI order>, main]
+ val orderedLibraries: List<KotlinLibrary> = stopwatch.measure("Resolving and loading klib dependencies") {
val zipAccessor = compilerConfiguration.get(JSConfigurationKeys.ZIP_FILE_SYSTEM_ACCESSOR)
val allResolvedDependencies = CommonKLibResolver.resolve(
allModules,
@@ -147,17 +147,20 @@
),
)
- allResolvedDependencies.getFullList(TopologicalLibraryOrder).let { resolvedLibraries ->
- val mainLibraryIndex = resolvedLibraries.indexOfLast {
- KotlinLibraryFile(it) == mainLibraryFile
- }.takeIf { it >= 0 } ?: notFoundIcError("main library", mainLibraryFile)
+ val resolvedLibraries: List<KotlinLibrary> = allResolvedDependencies
+ .getFullList()
+ .partition { it.isAnyPlatformStdlib }
+ .let { (stdlib, other) -> stdlib + other.reversed()}
- when (mainLibraryIndex) {
- resolvedLibraries.lastIndex -> resolvedLibraries
- else -> resolvedLibraries.filterIndexedTo(ArrayList(resolvedLibraries.size)) { index, _ ->
- index != mainLibraryIndex
- }.apply { add(resolvedLibraries[mainLibraryIndex]) }
- }
+ val mainLibraryIndex = resolvedLibraries.indexOfLast {
+ KotlinLibraryFile(it) == mainLibraryFile
+ }.takeIf { it >= 0 } ?: notFoundIcError("main library", mainLibraryFile)
+
+ when (mainLibraryIndex) {
+ resolvedLibraries.lastIndex -> resolvedLibraries
+ else -> resolvedLibraries.filterIndexedTo(ArrayList(resolvedLibraries.size)) { index, _ ->
+ index != mainLibraryIndex
+ }.apply { add(resolvedLibraries[mainLibraryIndex]) }
}
}
diff --git a/js/js.translator/testData/incremental/invalidation/typeScriptExportsPerModule/main/m.3.d.ts b/js/js.translator/testData/incremental/invalidation/typeScriptExportsPerModule/main/m.3.d.ts
index 55cfa8b..3157e94 100644
--- a/js/js.translator/testData/incremental/invalidation/typeScriptExportsPerModule/main/m.3.d.ts
+++ b/js/js.translator/testData/incremental/invalidation/typeScriptExportsPerModule/main/m.3.d.ts
@@ -1,8 +1,8 @@
type Nullable<T> = T | null | undefined
-export declare function bar(): number;
export declare class MyClass {
constructor(stepId: number);
get stepId(): number;
qux(): number;
}
+export declare function bar(): number;
export declare function box(stepId: number, isWasm: boolean): string;
\ No newline at end of file