[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.*
import org.jetbrains.kotlin.descriptors.impl.DeclarationDescriptorVisitorEmptyBodies import org.jetbrains.kotlin.descriptors.impl.DeclarationDescriptorVisitorEmptyBodies
import org.jetbrains.kotlin.utils.Printer import org.jetbrains.kotlin.utils.addIfNotNull
internal class SignaturePrinter( internal class SignaturePrinter(
out: Appendable, private val output: Appendable,
private val signatureRenderer: KlibSignatureRenderer private val signatureRenderer: KlibSignatureRenderer
) { ) {
private val printer = Printer(out)
fun print(module: ModuleDescriptor) { 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?) { private inner class SignatureCollector : DeclarationDescriptorVisitorEmptyBodies<Unit, Unit>() {
if (line != null) println(line) val signatures: MutableSet<String> = hashSetOf()
}
private inner class PrinterVisitor : DeclarationDescriptorVisitorEmptyBodies<Unit, Unit>() {
override fun visitModuleDeclaration(descriptor: ModuleDescriptor, data: Unit) { override fun visitModuleDeclaration(descriptor: ModuleDescriptor, data: Unit) {
descriptor.getPackageFragments().forEach { it.accept(this, data) } descriptor.getPackageFragments().forEach { it.accept(this, data) }
} }
@@ -28,27 +29,34 @@ internal class SignaturePrinter(
} }
override fun visitClassDescriptor(descriptor: ClassDescriptor, data: Unit) { override fun visitClassDescriptor(descriptor: ClassDescriptor, data: Unit) {
printer.printlnIfNotNull(signatureRenderer.render(descriptor)) extractSignatureFromDeclaration(descriptor) {
descriptor.constructors.forEach { it.accept(this, data) } descriptor.constructors.forEach { it.accept(this, data) }
descriptor.unsubstitutedMemberScope.getContributedDescriptors().forEach { it.accept(this, data) } descriptor.unsubstitutedMemberScope.getContributedDescriptors().forEach { it.accept(this, data) }
}
} }
override fun visitFunctionDescriptor(descriptor: FunctionDescriptor, data: Unit) { override fun visitFunctionDescriptor(descriptor: FunctionDescriptor, data: Unit) {
printer.printlnIfNotNull(signatureRenderer.render(descriptor)) extractSignatureFromDeclaration(descriptor)
} }
override fun visitPropertyDescriptor(descriptor: PropertyDescriptor, data: Unit) { override fun visitPropertyDescriptor(descriptor: PropertyDescriptor, data: Unit) {
printer.printlnIfNotNull(signatureRenderer.render(descriptor)) extractSignatureFromDeclaration(descriptor) {
descriptor.getter?.let { printer.printlnIfNotNull(signatureRenderer.render(it)) } descriptor.getter?.let(::extractSignatureFromDeclaration)
descriptor.setter?.let { printer.printlnIfNotNull(signatureRenderer.render(it)) } descriptor.setter?.let(::extractSignatureFromDeclaration)
}
} }
override fun visitConstructorDescriptor(descriptor: ConstructorDescriptor, data: Unit) { override fun visitConstructorDescriptor(descriptor: ConstructorDescriptor, data: Unit) {
printer.printlnIfNotNull(signatureRenderer.render(descriptor)) extractSignatureFromDeclaration(descriptor)
} }
override fun visitTypeAliasDescriptor(descriptor: TypeAliasDescriptor, data: Unit) { 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()
} }
} }
} }