From d18afff12b192561ab9bc262d8c38859df94ae27 Mon Sep 17 00:00:00 2001 From: Dmitriy Dolovov Date: Mon, 19 Feb 2024 22:47:02 +0100 Subject: [PATCH] [KLIB tool] "dump-metadata-signatures" command: use stable sorted order Print the signatures computed by the metadata always in stable sorted order. ^KT-62340 --- .../kotlin/cli/klib/SignaturePrinter.kt | 44 +++++++++++-------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/kotlin-native/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/SignaturePrinter.kt b/kotlin-native/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/SignaturePrinter.kt index db8f4901ef3..6fb52bc3161 100644 --- a/kotlin-native/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/SignaturePrinter.kt +++ b/kotlin-native/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/SignaturePrinter.kt @@ -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() { + val signatures: MutableSet = hashSetOf() - private inner class PrinterVisitor : DeclarationDescriptorVisitorEmptyBodies() { 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() } } }