diff --git a/build-common/test/org/jetbrains/kotlin/incremental/testingUtils/classFilesComparison.kt b/build-common/test/org/jetbrains/kotlin/incremental/testingUtils/classFilesComparison.kt index 962c62cc81d..3259d6a5529 100644 --- a/build-common/test/org/jetbrains/kotlin/incremental/testingUtils/classFilesComparison.kt +++ b/build-common/test/org/jetbrains/kotlin/incremental/testingUtils/classFilesComparison.kt @@ -20,9 +20,13 @@ import com.intellij.openapi.util.io.FileUtil import org.jetbrains.kotlin.incremental.LocalFileKotlinClass import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader import org.jetbrains.kotlin.metadata.DebugProtoBuf +import org.jetbrains.kotlin.metadata.js.DebugJsProtoBuf import org.jetbrains.kotlin.metadata.jvm.DebugJvmProtoBuf import org.jetbrains.kotlin.metadata.jvm.deserialization.BitEncoding import org.jetbrains.kotlin.protobuf.ExtensionRegistry +import org.jetbrains.kotlin.serialization.js.JsSerializerProtocol +import org.jetbrains.kotlin.utils.KotlinJavascriptMetadata +import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils import org.jetbrains.kotlin.utils.Printer import org.jetbrains.org.objectweb.asm.ClassReader import org.jetbrains.org.objectweb.asm.util.TraceClassVisitor @@ -34,6 +38,8 @@ import java.io.PrintWriter import java.io.StringWriter import java.util.* import java.util.zip.CRC32 +import java.util.zip.GZIPInputStream +import kotlin.comparisons.compareBy // Set this to true if you want to dump all bytecode (test will fail in this case) private val DUMP_ALL = System.getProperty("comparison.dump.all") == "true" @@ -162,6 +168,24 @@ private fun classFileToString(classFile: File): String { return out.toString() } +private fun metaJsToString(metaJsFile: File): String { + val out = StringWriter() + + val metadataList = arrayListOf() + KotlinJavascriptMetadataUtils.parseMetadata(metaJsFile.readText(), metadataList) + + for (metadata in metadataList) { + val (header, content) = GZIPInputStream(ByteArrayInputStream(metadata.body)).use { stream -> + DebugJsProtoBuf.Header.parseDelimitedFrom(stream, JsSerializerProtocol.extensionRegistry) to + DebugJsProtoBuf.Library.parseFrom(stream, JsSerializerProtocol.extensionRegistry) + } + out.write("\n------ header -----\n$header") + out.write("\n------ library -----\n$content") + } + + return out.toString() +} + private fun getExtensionRegistry(): ExtensionRegistry { val registry = ExtensionRegistry.newInstance()!! DebugJvmProtoBuf.registerAllExtensions(registry) @@ -173,6 +197,9 @@ private fun fileToStringRepresentation(file: File): String { file.name.endsWith(".class") -> { classFileToString(file) } + file.name.endsWith(KotlinJavascriptMetadataUtils.META_JS_SUFFIX) -> { + metaJsToString(file) + } else -> { file.readText() }