[KLIB tool] "dump-metadata-signatures" command: use stable sorted order

Print the signatures computed by the metadata always in stable sorted
order.

^KT-62340
This commit is contained in:
Dmitriy Dolovov
2024-02-19 22:47:02 +01:00
committed by Space Team
parent f6f04b209f
commit d18afff12b
@@ -2,23 +2,24 @@ package org.jetbrains.kotlin.cli.klib
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.impl.DeclarationDescriptorVisitorEmptyBodies
import org.jetbrains.kotlin.utils.Printer
import org.jetbrains.kotlin.utils.addIfNotNull
internal class SignaturePrinter(
out: Appendable,
private val output: Appendable,
private val signatureRenderer: KlibSignatureRenderer
) {
private val printer = Printer(out)
fun print(module: ModuleDescriptor) {
module.accept(PrinterVisitor(), Unit)
val collector = SignatureCollector()
module.accept(collector, Unit)
for (signature in collector.signatures.sorted()) {
output.appendLine(signature)
}
}
private fun Printer.printlnIfNotNull(line: String?) {
if (line != null) println(line)
}
private inner class SignatureCollector : DeclarationDescriptorVisitorEmptyBodies<Unit, Unit>() {
val signatures: MutableSet<String> = hashSetOf()
private inner class PrinterVisitor : DeclarationDescriptorVisitorEmptyBodies<Unit, Unit>() {
override fun visitModuleDeclaration(descriptor: ModuleDescriptor, data: Unit) {
descriptor.getPackageFragments().forEach { it.accept(this, data) }
}
@@ -28,27 +29,34 @@ internal class SignaturePrinter(
}
override fun visitClassDescriptor(descriptor: ClassDescriptor, data: Unit) {
printer.printlnIfNotNull(signatureRenderer.render(descriptor))
descriptor.constructors.forEach { it.accept(this, data) }
descriptor.unsubstitutedMemberScope.getContributedDescriptors().forEach { it.accept(this, data) }
extractSignatureFromDeclaration(descriptor) {
descriptor.constructors.forEach { it.accept(this, data) }
descriptor.unsubstitutedMemberScope.getContributedDescriptors().forEach { it.accept(this, data) }
}
}
override fun visitFunctionDescriptor(descriptor: FunctionDescriptor, data: Unit) {
printer.printlnIfNotNull(signatureRenderer.render(descriptor))
extractSignatureFromDeclaration(descriptor)
}
override fun visitPropertyDescriptor(descriptor: PropertyDescriptor, data: Unit) {
printer.printlnIfNotNull(signatureRenderer.render(descriptor))
descriptor.getter?.let { printer.printlnIfNotNull(signatureRenderer.render(it)) }
descriptor.setter?.let { printer.printlnIfNotNull(signatureRenderer.render(it)) }
extractSignatureFromDeclaration(descriptor) {
descriptor.getter?.let(::extractSignatureFromDeclaration)
descriptor.setter?.let(::extractSignatureFromDeclaration)
}
}
override fun visitConstructorDescriptor(descriptor: ConstructorDescriptor, data: Unit) {
printer.printlnIfNotNull(signatureRenderer.render(descriptor))
extractSignatureFromDeclaration(descriptor)
}
override fun visitTypeAliasDescriptor(descriptor: TypeAliasDescriptor, data: Unit) {
printer.printlnIfNotNull(signatureRenderer.render(descriptor))
extractSignatureFromDeclaration(descriptor)
}
private inline fun extractSignatureFromDeclaration(descriptor: DeclarationDescriptorWithVisibility, continuation: () -> Unit = {}) {
signatures.addIfNotNull(signatureRenderer.render(descriptor))
continuation()
}
}
}