diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/FileFingerprints.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/FileFingerprints.kt index 4871f1d17dd..c78fe107ee2 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/FileFingerprints.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/FileFingerprints.kt @@ -57,6 +57,10 @@ value class SerializedIrFileFingerprint private constructor(val fileFingerprint: constructor(file: SerializedIrFile) : this(calculateFileFingerprint(file)) constructor(lib: KotlinLibrary, fileIndex: Int) : this(calculateFileFingerprint(lib, fileIndex)) + + override fun toString(): String { + return fileFingerprint.toString() + } } @JvmInline @@ -96,6 +100,10 @@ value class SerializedKlibFingerprint(val klibFingerprint: FingerprintHash) { constructor(fileFingerprints: List) : this(fileFingerprints.calculateKlibFingerprint()) constructor(klibFile: File) : this(FingerprintHash(klibFile.calculateKlibHash())) + + override fun toString(): String { + return klibFingerprint.toString() + } } private const val FILE_FINGERPRINTS_SEPARATOR = " " diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt index 9410922000e..35f565f7afb 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt @@ -412,6 +412,36 @@ class Kotlin2JsIrGradlePluginIT : AbstractKotlin2JsGradlePluginIT(true) { build("compileDevelopmentExecutableKotlinJs") } } + + @DisplayName("klib fingerprints") + @GradleTest + fun testKlibFingerprints(gradleVersion: GradleVersion) { + project("kotlin2JsIrICProject", gradleVersion) { + val fingerprints = Array(2) { + build("compileDevelopmentExecutableKotlinJs") + + val manifestLines = projectPath.resolve("build/classes/kotlin/main/default/manifest").readLines() + val serializedKlibFingerprint = manifestLines.singleOrNull { it.startsWith("serializedKlibFingerprint=") } + assertNotNull(serializedKlibFingerprint) { "can not find serializedKlibFingerprint" } + assertTrue("bad serializedKlibFingerprint format '$serializedKlibFingerprint'") { + Regex("serializedKlibFingerprint=[a-z0-9]+\\.[a-z0-9]+").matches(serializedKlibFingerprint) + } + + val serializedIrFileFingerprints = manifestLines.singleOrNull { it.startsWith("serializedIrFileFingerprints=") } + assertNotNull(serializedIrFileFingerprints) { "can not find serializedIrFileFingerprints" } + assertTrue("bad serializedIrFileFingerprints format '$serializedIrFileFingerprints'") { + // kotlin2JsIrICProject has 2 files + Regex("serializedIrFileFingerprints=[a-z0-9]+\\.[a-z0-9]+ [a-z0-9]+\\.[a-z0-9]+").matches(serializedIrFileFingerprints) + } + + build("clean") + + serializedKlibFingerprint to serializedIrFileFingerprints + } + + assertEquals(fingerprints[0], fingerprints[1], "fingerprints must be stable") + } + } } @JsGradlePluginTests