[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:
committed by
Space Team
parent
f6f04b209f
commit
d18afff12b
+26
-18
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user