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.
This commit is contained in:
committed by
Dmitriy Novozhilov
parent
1deb317e0d
commit
f350e9dacb
+25
-19
@@ -151,29 +151,35 @@ private fun classFileToString(classFile: File): String {
|
|||||||
val traceVisitor = TraceClassVisitor(PrintWriter(out))
|
val traceVisitor = TraceClassVisitor(PrintWriter(out))
|
||||||
ClassReader(classFile.readBytes()).accept(traceVisitor, 0)
|
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
|
when (classHeader.kind) {
|
||||||
if (annotationDataEncoded != null) {
|
KotlinClassHeader.Kind.FILE_FACADE, KotlinClassHeader.Kind.CLASS, KotlinClassHeader.Kind.MULTIFILE_CLASS_PART -> {
|
||||||
ByteArrayInputStream(BitEncoding.decodeBytes(annotationDataEncoded)).use {
|
ByteArrayInputStream(BitEncoding.decodeBytes(classHeader.data!!)).use { input ->
|
||||||
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)}")
|
when (classHeader.kind) {
|
||||||
|
KotlinClassHeader.Kind.FILE_FACADE ->
|
||||||
if (!classHeader.metadataVersion.isCompatible()) {
|
out.write("\n------ file facade proto -----\n${DebugProtoBuf.Package.parseFrom(input, getExtensionRegistry())}")
|
||||||
error("Incompatible class ($classHeader): $classFile")
|
KotlinClassHeader.Kind.CLASS ->
|
||||||
}
|
out.write("\n------ class proto -----\n${DebugProtoBuf.Class.parseFrom(input, getExtensionRegistry())}")
|
||||||
|
KotlinClassHeader.Kind.MULTIFILE_CLASS_PART ->
|
||||||
when (classHeader.kind) {
|
out.write("\n------ multi-file part proto -----\n${DebugProtoBuf.Package.parseFrom(input, getExtensionRegistry())}")
|
||||||
KotlinClassHeader.Kind.FILE_FACADE ->
|
else -> error(classHeader.kind)
|
||||||
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()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
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()
|
return out.toString()
|
||||||
|
|||||||
Reference in New Issue
Block a user