[KLIB tool] Refactoring. Fix visibility, add comments, drop useless code

What's done:
- Reduce the visibility of all entities inside the module to `internal`
  or `private`. Only leave `fun main()` as `public` because it's the
  single legal entry point.
- Add comments to few classes related to "contents" command that they
  should be removed together with the command after 2.0.
- Drop useless `DeclarationHeaderRenderer` interface.
- Rename: KlibToolLinker -> KlibToolIrLinker

^KT-62340
This commit is contained in:
Dmitriy Dolovov
2024-02-16 12:09:40 +01:00
committed by Space Team
parent fd4f6c90c7
commit d4585ff3ce
4 changed files with 55 additions and 61 deletions
@@ -1,7 +0,0 @@
package org.jetbrains.kotlin.cli.klib
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
interface DeclarationHeaderRenderer {
fun render(descriptor: DeclarationDescriptor): String
}
@@ -7,9 +7,9 @@ import org.jetbrains.kotlin.descriptors.DescriptorVisibilities.INTERNAL
import org.jetbrains.kotlin.descriptors.impl.DeclarationDescriptorVisitorEmptyBodies
import org.jetbrains.kotlin.utils.Printer
// TODO: This class is used in dumping metadata by descriptors, "contents" command. Drop it after 2.0. KT-65380
internal class DeclarationPrinter(
out: Appendable,
private val headerRenderer: DeclarationHeaderRenderer,
private val signatureRenderer: KlibSignatureRenderer
) {
private val printer = Printer(out, 1, " ")
@@ -53,14 +53,14 @@ internal class DeclarationPrinter(
.filter { it.shouldBePrinted }
.sortedBy { it.name }
if (children.isNotEmpty()) {
printer.printWithBody(header = headerRenderer.render(descriptor)) {
printer.printWithBody(header = DefaultDeclarationHeaderRenderer.render(descriptor)) {
children.forEach { it.accept(this, data) }
}
}
}
override fun visitClassDescriptor(descriptor: ClassDescriptor, data: Unit) {
val header = headerRenderer.render(descriptor)
val header = DefaultDeclarationHeaderRenderer.render(descriptor)
val signature = signatureRenderer.render(descriptor)
val children = descriptor.unsubstitutedMemberScope.getContributedDescriptors().filter { it.shouldBePrinted }
@@ -76,19 +76,19 @@ internal class DeclarationPrinter(
}
override fun visitFunctionDescriptor(descriptor: FunctionDescriptor, data: Unit) {
printer.printPlain(header = headerRenderer.render(descriptor), signature = signatureRenderer.render(descriptor))
printer.printPlain(header = DefaultDeclarationHeaderRenderer.render(descriptor), signature = signatureRenderer.render(descriptor))
}
override fun visitPropertyDescriptor(descriptor: PropertyDescriptor, data: Unit) {
printer.printPlain(header = headerRenderer.render(descriptor), signature = signatureRenderer.render(descriptor))
printer.printPlain(header = DefaultDeclarationHeaderRenderer.render(descriptor), signature = signatureRenderer.render(descriptor))
descriptor.getter?.takeUnless { canSkipAccessor(it, descriptor) }?.let { getter ->
printer.pushIndent()
printer.printPlain(header = headerRenderer.render(getter), signature = signatureRenderer.render(getter))
printer.printPlain(header = DefaultDeclarationHeaderRenderer.render(getter), signature = signatureRenderer.render(getter))
printer.popIndent()
}
descriptor.setter?.takeUnless { canSkipAccessor(it, descriptor) }?.let { setter ->
printer.pushIndent()
printer.printPlain(header = headerRenderer.render(setter), signature = signatureRenderer.render(setter))
printer.printPlain(header = DefaultDeclarationHeaderRenderer.render(setter), signature = signatureRenderer.render(setter))
printer.popIndent()
}
}
@@ -98,11 +98,11 @@ internal class DeclarationPrinter(
}
override fun visitConstructorDescriptor(descriptor: ConstructorDescriptor, data: Unit) {
printer.printPlain(header = headerRenderer.render(descriptor), signature = signatureRenderer.render(descriptor))
printer.printPlain(header = DefaultDeclarationHeaderRenderer.render(descriptor), signature = signatureRenderer.render(descriptor))
}
override fun visitTypeAliasDescriptor(descriptor: TypeAliasDescriptor, data: Unit) {
printer.printPlain(header = headerRenderer.render(descriptor), signature = signatureRenderer.render(descriptor))
printer.printPlain(header = DefaultDeclarationHeaderRenderer.render(descriptor), signature = signatureRenderer.render(descriptor))
}
}
}
@@ -7,8 +7,9 @@ import org.jetbrains.kotlin.renderer.DescriptorRenderer
import org.jetbrains.kotlin.renderer.DescriptorRendererModifier
import org.jetbrains.kotlin.renderer.OverrideRenderingPolicy
object DefaultDeclarationHeaderRenderer : DeclarationHeaderRenderer {
override fun render(descriptor: DeclarationDescriptor): String = when (descriptor) {
// TODO: This class is used in dumping metadata by descriptors, "contents" command. Drop it after 2.0. KT-65380
internal object DefaultDeclarationHeaderRenderer {
fun render(descriptor: DeclarationDescriptor): String = when (descriptor) {
is PackageFragmentDescriptor -> render(descriptor)
is ClassifierDescriptorWithTypeParameters -> render(descriptor)
is PropertyAccessorDescriptor -> render(descriptor)
@@ -18,7 +18,6 @@ import org.jetbrains.kotlin.backend.konan.serialization.KonanManglerIr
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.builders.TranslationPluginContext
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
import org.jetbrains.kotlin.ir.types.IrTypeSystemContextImpl
import org.jetbrains.kotlin.ir.util.DumpIrTreeOptions
@@ -40,7 +39,7 @@ import java.io.File
import kotlin.system.exitProcess
import org.jetbrains.kotlin.konan.file.File as KFile
fun printUsage() {
private fun printUsage() {
println(
"""
Usage: klib <command> <library> [<option>]
@@ -98,7 +97,7 @@ private fun parseOptions(args: Array<String>): Map<String, List<String>> {
}
private class Command(args: Array<String>) {
internal class Command(args: Array<String>) {
init {
if (args.size < 2) {
printUsage()
@@ -132,20 +131,7 @@ private fun Command.parseSignatureVersion(): KotlinIrSignatureVersion? {
return signatureVersion
}
internal fun logWarning(text: String) {
println("warning: $text")
}
internal fun logError(text: String, withStacktrace: Boolean = false): Nothing {
if (withStacktrace)
error("error: $text")
else {
System.err.println("error: $text")
exitProcess(1)
}
}
object KlibToolLogger : Logger, IrMessageLogger {
internal object KlibToolLogger : Logger, IrMessageLogger {
override fun log(message: String) = println(message)
override fun warning(message: String) = logWarning(message)
override fun error(message: String) = logWarning(message)
@@ -162,7 +148,20 @@ object KlibToolLogger : Logger, IrMessageLogger {
}
}
val defaultRepository = KFile(DependencyDirectories.localKonanDir.resolve("klib").absolutePath)
internal fun logWarning(text: String) {
println("warning: $text")
}
internal fun logError(text: String, withStacktrace: Boolean = false): Nothing {
if (withStacktrace)
error("error: $text")
else {
System.err.println("error: $text")
exitProcess(1)
}
}
private val defaultRepository = KFile(DependencyDirectories.localKonanDir.resolve("klib").absolutePath)
private class KlibRepoDeprecationWarning {
private var alreadyLogged = false
@@ -175,11 +174,11 @@ private class KlibRepoDeprecationWarning {
}
}
class Library(val libraryNameOrPath: String, val requestedRepository: String?) {
internal class Library(val libraryNameOrPath: String, requestedRepository: String?) {
private val klibRepoDeprecationWarning = KlibRepoDeprecationWarning()
val repository = requestedRepository?.let {
private val repository = requestedRepository?.let {
klibRepoDeprecationWarning.logOnceIfNecessary() // Due to use of "-repository" option.
KFile(it)
} ?: defaultRepository
@@ -242,9 +241,11 @@ class Library(val libraryNameOrPath: String, val requestedRepository: String?) {
library?.libraryFile?.deleteRecursively()
}
class KlibToolLinker(
module: ModuleDescriptor, irBuiltIns: IrBuiltIns, symbolTable: SymbolTable
) : KotlinIrLinker(module, KlibToolLogger, irBuiltIns, symbolTable, emptyList()) {
class KlibToolIrLinker(
module: ModuleDescriptor,
irBuiltIns: IrBuiltIns,
symbolTable: SymbolTable
) : KotlinIrLinker(module, KlibToolLogger, irBuiltIns, symbolTable, exportedDependencies = emptyList()) {
override val fakeOverrideBuilder = IrLinkerFakeOverrideProvider(
linker = this,
symbolTable = symbolTable,
@@ -254,25 +255,23 @@ class Library(val libraryNameOrPath: String, val requestedRepository: String?) {
partialLinkageSupport = PartialLinkageSupportForLinker.DISABLED,
)
override val returnUnboundSymbolsIfSignatureNotFound: Boolean
get() = true
override val returnUnboundSymbolsIfSignatureNotFound get() = true
override val translationPluginContext: TranslationPluginContext
get() = TODO("Not needed for ir dumping")
override val translationPluginContext get() = TODO("Not needed for ir dumping")
override fun createModuleDeserializer(moduleDescriptor: ModuleDescriptor, klib: KotlinLibrary?, strategyResolver: (String) -> DeserializationStrategy): IrModuleDeserializer {
return KlibToolModuleDeserializer(
module = moduleDescriptor,
klib = klib ?: error("Expecting kotlin library for $moduleDescriptor"),
strategyResolver = strategyResolver
)
}
override fun createModuleDeserializer(
moduleDescriptor: ModuleDescriptor,
klib: KotlinLibrary?,
strategyResolver: (String) -> DeserializationStrategy
): IrModuleDeserializer = KlibToolModuleDeserializer(
module = moduleDescriptor,
klib = klib ?: error("Expecting kotlin library for $moduleDescriptor"),
strategyResolver = strategyResolver
)
override fun isBuiltInModule(moduleDescriptor: ModuleDescriptor): Boolean {
return false
}
override fun isBuiltInModule(moduleDescriptor: ModuleDescriptor) = false
inner class KlibToolModuleDeserializer(
private inner class KlibToolModuleDeserializer(
module: ModuleDescriptor,
klib: KotlinLibrary,
strategyResolver: (String) -> DeserializationStrategy
@@ -302,7 +301,7 @@ class Library(val libraryNameOrPath: String, val requestedRepository: String?) {
val typeTranslator = TypeTranslatorImpl(symbolTable, ModuleDescriptorLoader.languageVersionSettings, module)
val irBuiltIns = IrBuiltInsOverDescriptors(module.builtIns, typeTranslator, symbolTable)
val linker = KlibToolLinker(module, irBuiltIns, symbolTable)
val linker = KlibToolIrLinker(module, irBuiltIns, symbolTable)
module.allDependencyModules.forEach {
linker.deserializeOnlyHeaderModule(it, it.kotlinLibrary)
linker.resolveModuleDeserializer(it, null).init()
@@ -363,6 +362,7 @@ class Library(val libraryNameOrPath: String, val requestedRepository: String?) {
)
}
// TODO: This command is deprecated. Drop it after 2.0. KT-65380
fun contents(output: Appendable, printSignatures: Boolean, signatureVersion: KotlinIrSignatureVersion?) {
logWarning("\"contents\" has been renamed to \"dump-metadata\". Please, use new command name.")
val module = ModuleDescriptorLoader.load(libraryInRepoOrCurrentDir(repository, libraryNameOrPath))
@@ -370,7 +370,7 @@ class Library(val libraryNameOrPath: String, val requestedRepository: String?) {
DefaultKlibSignatureRenderer(signatureVersion, "// Signature: ")
else
KlibSignatureRenderer.NO_SIGNATURE
val printer = DeclarationPrinter(output, DefaultDeclarationHeaderRenderer, signatureRenderer)
val printer = DeclarationPrinter(output, signatureRenderer)
printer.print(module)
}
@@ -419,12 +419,12 @@ class Library(val libraryNameOrPath: String, val requestedRepository: String?) {
}
}
fun libraryInRepo(repository: KFile, name: String) =
private fun libraryInRepo(repository: KFile, name: String) =
resolverByName(listOf(repository.absolutePath), skipCurrentDir = true, logger = KlibToolLogger).resolve(name)
fun libraryInCurrentDir(name: String) = resolverByName(emptyList(), logger = KlibToolLogger).resolve(name)
private fun libraryInCurrentDir(name: String) = resolverByName(emptyList(), logger = KlibToolLogger).resolve(name)
fun libraryInRepoOrCurrentDir(repository: KFile, name: String) =
private fun libraryInRepoOrCurrentDir(repository: KFile, name: String) =
resolverByName(listOf(repository.absolutePath), logger = KlibToolLogger).resolve(name)
private enum class KnownOption(val option: String) {