[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.*
|
||||||
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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user