From f350e9dacb1c4d5cfc632d0722df4193b04a0e83 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 13 Jan 2021 19:02:52 +0100 Subject: [PATCH] Fix rendering of metadata of multifile facades in classFilesComparison.kt Multifile facades (class files with header kind MULTIFILE_CLASS) have the list of their parts in the d1 field (KotlinClassHeader.data), not some byte-encoded protobuf message which this code was trying to deserialize previously. --- .../testingUtils/classFilesComparison.kt | 44 +++++++++++-------- 1 file changed, 25 insertions(+), 19 deletions(-) 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 237c037691e..d10b89f3cec 100644 --- a/build-common/test/org/jetbrains/kotlin/incremental/testingUtils/classFilesComparison.kt +++ b/build-common/test/org/jetbrains/kotlin/incremental/testingUtils/classFilesComparison.kt @@ -151,29 +151,35 @@ private fun classFileToString(classFile: File): String { val traceVisitor = TraceClassVisitor(PrintWriter(out)) ClassReader(classFile.readBytes()).accept(traceVisitor, 0) - val classHeader = LocalFileKotlinClass.create(classFile)?.classHeader + val classHeader = LocalFileKotlinClass.create(classFile)?.classHeader ?: return "" + if (!classHeader.metadataVersion.isCompatible()) { + error("Incompatible class ($classHeader): $classFile") + } - val annotationDataEncoded = classHeader?.data - if (annotationDataEncoded != null) { - ByteArrayInputStream(BitEncoding.decodeBytes(annotationDataEncoded)).use { - input -> + when (classHeader.kind) { + KotlinClassHeader.Kind.FILE_FACADE, KotlinClassHeader.Kind.CLASS, KotlinClassHeader.Kind.MULTIFILE_CLASS_PART -> { + ByteArrayInputStream(BitEncoding.decodeBytes(classHeader.data!!)).use { input -> + out.write("\n------ string table types proto -----\n${DebugJvmProtoBuf.StringTableTypes.parseDelimitedFrom(input)}") - out.write("\n------ string table types proto -----\n${DebugJvmProtoBuf.StringTableTypes.parseDelimitedFrom(input)}") - - if (!classHeader.metadataVersion.isCompatible()) { - error("Incompatible class ($classHeader): $classFile") - } - - when (classHeader.kind) { - KotlinClassHeader.Kind.FILE_FACADE -> - out.write("\n------ file facade proto -----\n${DebugProtoBuf.Package.parseFrom(input, getExtensionRegistry())}") - KotlinClassHeader.Kind.CLASS -> - out.write("\n------ class proto -----\n${DebugProtoBuf.Class.parseFrom(input, getExtensionRegistry())}") - KotlinClassHeader.Kind.MULTIFILE_CLASS_PART -> - out.write("\n------ multi-file part proto -----\n${DebugProtoBuf.Package.parseFrom(input, getExtensionRegistry())}") - else -> throw IllegalStateException() + when (classHeader.kind) { + KotlinClassHeader.Kind.FILE_FACADE -> + out.write("\n------ file facade proto -----\n${DebugProtoBuf.Package.parseFrom(input, getExtensionRegistry())}") + KotlinClassHeader.Kind.CLASS -> + out.write("\n------ class proto -----\n${DebugProtoBuf.Class.parseFrom(input, getExtensionRegistry())}") + KotlinClassHeader.Kind.MULTIFILE_CLASS_PART -> + out.write("\n------ multi-file part proto -----\n${DebugProtoBuf.Package.parseFrom(input, getExtensionRegistry())}") + else -> error(classHeader.kind) + } } } + KotlinClassHeader.Kind.MULTIFILE_CLASS -> { + out.write("\n------ multi-file facade data -----\n") + out.write(classHeader.data!!.joinToString("\n")) + } + KotlinClassHeader.Kind.SYNTHETIC_CLASS -> { + // Synthetic class has no metadata, thus there can be no differences in it. + } + KotlinClassHeader.Kind.UNKNOWN -> error("Should not meet unknown classes here: $classFile") } return out.toString()