[KLIB tool] Extract self-sufficient classes from main.kt to separate files
Classes extracted: - KlibToolArguments - KlibToolArgumentsParser - KlibToolLogger - KlibToolIrLinker ^KT-62340
This commit is contained in:
committed by
Space Team
parent
4fe8885376
commit
7aa106c3a0
@@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.cli.klib
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.library.KotlinIrSignatureVersion
|
||||||
|
|
||||||
|
internal class KlibToolArguments(
|
||||||
|
val commandName: String,
|
||||||
|
val libraryNameOrPath: String,
|
||||||
|
val repository: String?,
|
||||||
|
val printSignatures: Boolean,
|
||||||
|
val signatureVersion: KotlinIrSignatureVersion?,
|
||||||
|
)
|
||||||
+113
@@ -0,0 +1,113 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.cli.klib
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.library.KotlinIrSignatureVersion
|
||||||
|
import kotlin.system.exitProcess
|
||||||
|
|
||||||
|
internal class KlibToolArgumentsParser {
|
||||||
|
fun parseArguments(rawArgs: Array<String>): KlibToolArguments {
|
||||||
|
if (rawArgs.size < 2) {
|
||||||
|
printUsage()
|
||||||
|
exitProcess(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
val extraArgs: Map<ExtraOption, List<String>> = parseOptions(rawArgs.drop(2).toTypedArray<String>())
|
||||||
|
.entries
|
||||||
|
.mapNotNull { (option, values) ->
|
||||||
|
val knownOption = ExtraOption.parseOrNull(option)
|
||||||
|
if (knownOption == null) {
|
||||||
|
logWarning("Unrecognized command-line argument: $option")
|
||||||
|
return@mapNotNull null
|
||||||
|
}
|
||||||
|
knownOption to values
|
||||||
|
}.toMap()
|
||||||
|
|
||||||
|
val signatureVersion = extraArgs[ExtraOption.SIGNATURE_VERSION]?.last()?.let { rawSignatureVersion ->
|
||||||
|
rawSignatureVersion.toIntOrNull()?.let(::KotlinIrSignatureVersion)
|
||||||
|
?: logError("Invalid signature version: $rawSignatureVersion")
|
||||||
|
}
|
||||||
|
|
||||||
|
if (signatureVersion != null && signatureVersion !in KotlinIrSignatureVersion.CURRENTLY_SUPPORTED_VERSIONS)
|
||||||
|
logError("Unsupported signature version: ${signatureVersion.number}")
|
||||||
|
|
||||||
|
|
||||||
|
return KlibToolArguments(
|
||||||
|
commandName = rawArgs[0],
|
||||||
|
libraryNameOrPath = rawArgs[1],
|
||||||
|
repository = extraArgs[ExtraOption.REPOSITORY]?.last(),
|
||||||
|
printSignatures = extraArgs[ExtraOption.PRINT_SIGNATURES]?.last()?.toBoolean() == true,
|
||||||
|
signatureVersion,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun parseOptions(args: Array<String>): Map<String, List<String>> {
|
||||||
|
val options = mutableMapOf<String, MutableList<String>>()
|
||||||
|
for (index in args.indices step 2) {
|
||||||
|
val key = args[index]
|
||||||
|
if (key[0] != '-') {
|
||||||
|
logError("Expected a flag with initial dash: $key")
|
||||||
|
}
|
||||||
|
if (index + 1 == args.size) {
|
||||||
|
logError("Expected an value after $key")
|
||||||
|
}
|
||||||
|
val value = listOf(args[index + 1])
|
||||||
|
options[key]?.addAll(value) ?: options.put(key, value.toMutableList())
|
||||||
|
}
|
||||||
|
return options
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun printUsage() {
|
||||||
|
println(
|
||||||
|
"""
|
||||||
|
Usage: klib <command> <library> [<option>]
|
||||||
|
|
||||||
|
where the commands are:
|
||||||
|
info General information about the library
|
||||||
|
install [DEPRECATED] Local KLIB repositories to be dropped soon. See https://youtrack.jetbrains.com/issue/KT-61098
|
||||||
|
Install the library to the local repository.
|
||||||
|
remove [DEPRECATED] Local KLIB repositories to be dropped soon. See https://youtrack.jetbrains.com/issue/KT-61098
|
||||||
|
Remove the library from the local repository.
|
||||||
|
dump-abi Dump the ABI snapshot of the library. Each line in the snapshot corresponds exactly to one
|
||||||
|
declaration. Whenever an ABI-incompatible change happens to a declaration, this should
|
||||||
|
be visible in the corresponding line of the snapshot.
|
||||||
|
dump-ir Dump the intermediate representation (IR) of all declarations in the library. The output of this
|
||||||
|
command is intended to be used for debugging purposes only.
|
||||||
|
dump-ir-signatures Dump IR signatures of all non-private declarations in the library and all non-private declarations
|
||||||
|
consumed by this library (as two separate lists). This command relies purely on the data in IR.
|
||||||
|
dump-metadata-signatures Dump IR signatures of all non-private declarations in the library. Note, that this command renders
|
||||||
|
the signatures based on the library metadata. This is different from "dump-ir-signatures",
|
||||||
|
which renders signatures based on the IR. On practice, in most cases there is no difference
|
||||||
|
between output of these two commands. However, if IR transforming compiler plugins
|
||||||
|
(such as Compose) were used during compilation of the library, there would be different
|
||||||
|
signatures for patched declarations.
|
||||||
|
signatures [DEPRECATED] Renamed to "dump-metadata-signatures". Please, use new command name.
|
||||||
|
dump-metadata Dump the metadata of all declarations in the library. The output of this command is intended
|
||||||
|
to be used for debugging purposes only.
|
||||||
|
contents [DEPRECATED] Reworked and renamed to "dump-metadata". Please, use new command name.
|
||||||
|
|
||||||
|
and the options are:
|
||||||
|
-repository <path> [DEPRECATED] Local KLIB repositories to be dropped soon. See https://youtrack.jetbrains.com/issue/KT-61098
|
||||||
|
Work with the specified repository.
|
||||||
|
-signature-version {${KotlinIrSignatureVersion.CURRENTLY_SUPPORTED_VERSIONS.joinToString("|") { it.number.toString() }}}
|
||||||
|
Render IR signatures of a specific version. By default, the most up-to-date signature version
|
||||||
|
that is supported in the library is used.
|
||||||
|
-print-signatures {true|false}
|
||||||
|
Print IR signature for every declaration. Applicable only to "dump-metadata" and "dump-ir" commands.
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private enum class ExtraOption(val option: String) {
|
||||||
|
REPOSITORY("-repository"),
|
||||||
|
PRINT_SIGNATURES("-print-signatures"),
|
||||||
|
SIGNATURE_VERSION("-signature-version");
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
fun parseOrNull(option: String): ExtraOption? = entries.firstOrNull { it.option == option }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.cli.klib
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.backend.common.linkage.partial.PartialLinkageSupportForLinker
|
||||||
|
import org.jetbrains.kotlin.backend.common.overrides.IrLinkerFakeOverrideProvider
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.BasicIrModuleDeserializer
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.DeserializationStrategy
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.IrModuleDeserializer
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.KotlinIrLinker
|
||||||
|
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.types.IrTypeSystemContextImpl
|
||||||
|
import org.jetbrains.kotlin.ir.util.SymbolTable
|
||||||
|
import org.jetbrains.kotlin.library.KotlinAbiVersion
|
||||||
|
import org.jetbrains.kotlin.library.KotlinLibrary
|
||||||
|
|
||||||
|
internal class KlibToolIrLinker(
|
||||||
|
module: ModuleDescriptor,
|
||||||
|
irBuiltIns: IrBuiltIns,
|
||||||
|
symbolTable: SymbolTable
|
||||||
|
) : KotlinIrLinker(module, KlibToolLogger, irBuiltIns, symbolTable, exportedDependencies = emptyList()) {
|
||||||
|
override val fakeOverrideBuilder = IrLinkerFakeOverrideProvider(
|
||||||
|
linker = this,
|
||||||
|
symbolTable = symbolTable,
|
||||||
|
mangler = KonanManglerIr,
|
||||||
|
typeSystem = IrTypeSystemContextImpl(builtIns),
|
||||||
|
friendModules = emptyMap(),
|
||||||
|
partialLinkageSupport = PartialLinkageSupportForLinker.DISABLED,
|
||||||
|
)
|
||||||
|
|
||||||
|
override val returnUnboundSymbolsIfSignatureNotFound get() = true
|
||||||
|
|
||||||
|
override val translationPluginContext get() = TODO("Not needed for ir dumping")
|
||||||
|
|
||||||
|
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) = false
|
||||||
|
|
||||||
|
private inner class KlibToolModuleDeserializer(
|
||||||
|
module: ModuleDescriptor,
|
||||||
|
klib: KotlinLibrary,
|
||||||
|
strategyResolver: (String) -> DeserializationStrategy
|
||||||
|
) : BasicIrModuleDeserializer(
|
||||||
|
this,
|
||||||
|
module,
|
||||||
|
klib,
|
||||||
|
strategyResolver,
|
||||||
|
klib.versions.abiVersion ?: KotlinAbiVersion.CURRENT
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.cli.klib
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.ir.util.IrMessageLogger
|
||||||
|
import org.jetbrains.kotlin.util.Logger
|
||||||
|
import kotlin.system.exitProcess
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
@Deprecated(Logger.FATAL_DEPRECATION_MESSAGE, ReplaceWith(Logger.FATAL_REPLACEMENT))
|
||||||
|
override fun fatal(message: String) = logError(message, withStacktrace = true)
|
||||||
|
|
||||||
|
override fun report(severity: IrMessageLogger.Severity, message: String, location: IrMessageLogger.Location?) {
|
||||||
|
when (severity) {
|
||||||
|
IrMessageLogger.Severity.INFO -> log(message)
|
||||||
|
IrMessageLogger.Severity.WARNING -> warning(message)
|
||||||
|
IrMessageLogger.Severity.ERROR -> error(message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,182 +6,30 @@
|
|||||||
package org.jetbrains.kotlin.cli.klib
|
package org.jetbrains.kotlin.cli.klib
|
||||||
|
|
||||||
// TODO: Extract `library` package as a shared jar?
|
// TODO: Extract `library` package as a shared jar?
|
||||||
import org.jetbrains.kotlin.backend.common.linkage.partial.PartialLinkageSupportForLinker
|
|
||||||
import org.jetbrains.kotlin.backend.common.overrides.IrLinkerFakeOverrideProvider
|
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.BasicIrModuleDeserializer
|
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.DeserializationStrategy
|
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.IrModuleDeserializer
|
import org.jetbrains.kotlin.backend.common.serialization.IrModuleDeserializer
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.KotlinIrLinker
|
|
||||||
import org.jetbrains.kotlin.backend.konan.serialization.KonanIdSignaturer
|
import org.jetbrains.kotlin.backend.konan.serialization.KonanIdSignaturer
|
||||||
import org.jetbrains.kotlin.backend.konan.serialization.KonanManglerDesc
|
import org.jetbrains.kotlin.backend.konan.serialization.KonanManglerDesc
|
||||||
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.ObsoleteDescriptorBasedAPI
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
|
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
|
||||||
import org.jetbrains.kotlin.ir.types.IrTypeSystemContextImpl
|
|
||||||
import org.jetbrains.kotlin.ir.util.DumpIrTreeOptions
|
import org.jetbrains.kotlin.ir.util.DumpIrTreeOptions
|
||||||
import org.jetbrains.kotlin.ir.util.IrMessageLogger
|
|
||||||
import org.jetbrains.kotlin.ir.util.SymbolTable
|
import org.jetbrains.kotlin.ir.util.SymbolTable
|
||||||
import org.jetbrains.kotlin.ir.util.dump
|
import org.jetbrains.kotlin.ir.util.dump
|
||||||
import org.jetbrains.kotlin.konan.library.KonanLibrary
|
import org.jetbrains.kotlin.konan.library.KonanLibrary
|
||||||
import org.jetbrains.kotlin.konan.library.resolverByName
|
import org.jetbrains.kotlin.konan.library.resolverByName
|
||||||
import org.jetbrains.kotlin.konan.util.DependencyDirectories
|
import org.jetbrains.kotlin.konan.util.DependencyDirectories
|
||||||
import org.jetbrains.kotlin.library.*
|
import org.jetbrains.kotlin.library.KLIB_FILE_EXTENSION_WITH_DOT
|
||||||
|
import org.jetbrains.kotlin.library.KotlinIrSignatureVersion
|
||||||
|
import org.jetbrains.kotlin.library.KotlinLibrary
|
||||||
import org.jetbrains.kotlin.library.abi.*
|
import org.jetbrains.kotlin.library.abi.*
|
||||||
import org.jetbrains.kotlin.library.metadata.kotlinLibrary
|
import org.jetbrains.kotlin.library.metadata.kotlinLibrary
|
||||||
import org.jetbrains.kotlin.library.metadata.parseModuleHeader
|
import org.jetbrains.kotlin.library.metadata.parseModuleHeader
|
||||||
|
import org.jetbrains.kotlin.library.unpackZippedKonanLibraryTo
|
||||||
import org.jetbrains.kotlin.psi2ir.descriptors.IrBuiltInsOverDescriptors
|
import org.jetbrains.kotlin.psi2ir.descriptors.IrBuiltInsOverDescriptors
|
||||||
import org.jetbrains.kotlin.psi2ir.generators.TypeTranslatorImpl
|
import org.jetbrains.kotlin.psi2ir.generators.TypeTranslatorImpl
|
||||||
import org.jetbrains.kotlin.util.Logger
|
|
||||||
import org.jetbrains.kotlin.util.removeSuffixIfPresent
|
import org.jetbrains.kotlin.util.removeSuffixIfPresent
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import kotlin.system.exitProcess
|
|
||||||
import org.jetbrains.kotlin.konan.file.File as KFile
|
import org.jetbrains.kotlin.konan.file.File as KFile
|
||||||
|
|
||||||
internal class KlibToolArgumentsParser {
|
|
||||||
fun parseArguments(rawArgs: Array<String>): KlibToolArguments {
|
|
||||||
if (rawArgs.size < 2) {
|
|
||||||
printUsage()
|
|
||||||
exitProcess(0)
|
|
||||||
}
|
|
||||||
|
|
||||||
val extraArgs: Map<ExtraOption, List<String>> = parseOptions(rawArgs.drop(2).toTypedArray<String>())
|
|
||||||
.entries
|
|
||||||
.mapNotNull { (option, values) ->
|
|
||||||
val knownOption = ExtraOption.parseOrNull(option)
|
|
||||||
if (knownOption == null) {
|
|
||||||
logWarning("Unrecognized command-line argument: $option")
|
|
||||||
return@mapNotNull null
|
|
||||||
}
|
|
||||||
knownOption to values
|
|
||||||
}.toMap()
|
|
||||||
|
|
||||||
val signatureVersion = extraArgs[ExtraOption.SIGNATURE_VERSION]?.last()?.let { rawSignatureVersion ->
|
|
||||||
rawSignatureVersion.toIntOrNull()?.let(::KotlinIrSignatureVersion)
|
|
||||||
?: logError("Invalid signature version: $rawSignatureVersion")
|
|
||||||
}
|
|
||||||
|
|
||||||
if (signatureVersion != null && signatureVersion !in KotlinIrSignatureVersion.CURRENTLY_SUPPORTED_VERSIONS)
|
|
||||||
logError("Unsupported signature version: ${signatureVersion.number}")
|
|
||||||
|
|
||||||
|
|
||||||
return KlibToolArguments(
|
|
||||||
commandName = rawArgs[0],
|
|
||||||
libraryNameOrPath = rawArgs[1],
|
|
||||||
repository = extraArgs[ExtraOption.REPOSITORY]?.last(),
|
|
||||||
printSignatures = extraArgs[ExtraOption.PRINT_SIGNATURES]?.last()?.toBoolean() == true,
|
|
||||||
signatureVersion,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun parseOptions(args: Array<String>): Map<String, List<String>> {
|
|
||||||
val options = mutableMapOf<String, MutableList<String>>()
|
|
||||||
for (index in args.indices step 2) {
|
|
||||||
val key = args[index]
|
|
||||||
if (key[0] != '-') {
|
|
||||||
logError("Expected a flag with initial dash: $key")
|
|
||||||
}
|
|
||||||
if (index + 1 == args.size) {
|
|
||||||
logError("Expected an value after $key")
|
|
||||||
}
|
|
||||||
val value = listOf(args[index + 1])
|
|
||||||
options[key]?.addAll(value) ?: options.put(key, value.toMutableList())
|
|
||||||
}
|
|
||||||
return options
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun printUsage() {
|
|
||||||
println(
|
|
||||||
"""
|
|
||||||
Usage: klib <command> <library> [<option>]
|
|
||||||
|
|
||||||
where the commands are:
|
|
||||||
info General information about the library
|
|
||||||
install [DEPRECATED] Local KLIB repositories to be dropped soon. See https://youtrack.jetbrains.com/issue/KT-61098
|
|
||||||
Install the library to the local repository.
|
|
||||||
remove [DEPRECATED] Local KLIB repositories to be dropped soon. See https://youtrack.jetbrains.com/issue/KT-61098
|
|
||||||
Remove the library from the local repository.
|
|
||||||
dump-abi Dump the ABI snapshot of the library. Each line in the snapshot corresponds exactly to one
|
|
||||||
declaration. Whenever an ABI-incompatible change happens to a declaration, this should
|
|
||||||
be visible in the corresponding line of the snapshot.
|
|
||||||
dump-ir Dump the intermediate representation (IR) of all declarations in the library. The output of this
|
|
||||||
command is intended to be used for debugging purposes only.
|
|
||||||
dump-ir-signatures Dump IR signatures of all non-private declarations in the library and all non-private declarations
|
|
||||||
consumed by this library (as two separate lists). This command relies purely on the data in IR.
|
|
||||||
dump-metadata-signatures Dump IR signatures of all non-private declarations in the library. Note, that this command renders
|
|
||||||
the signatures based on the library metadata. This is different from "dump-ir-signatures",
|
|
||||||
which renders signatures based on the IR. On practice, in most cases there is no difference
|
|
||||||
between output of these two commands. However, if IR transforming compiler plugins
|
|
||||||
(such as Compose) were used during compilation of the library, there would be different
|
|
||||||
signatures for patched declarations.
|
|
||||||
signatures [DEPRECATED] Renamed to "dump-metadata-signatures". Please, use new command name.
|
|
||||||
dump-metadata Dump the metadata of all declarations in the library. The output of this command is intended
|
|
||||||
to be used for debugging purposes only.
|
|
||||||
contents [DEPRECATED] Reworked and renamed to "dump-metadata". Please, use new command name.
|
|
||||||
|
|
||||||
and the options are:
|
|
||||||
-repository <path> [DEPRECATED] Local KLIB repositories to be dropped soon. See https://youtrack.jetbrains.com/issue/KT-61098
|
|
||||||
Work with the specified repository.
|
|
||||||
-signature-version {${KotlinIrSignatureVersion.CURRENTLY_SUPPORTED_VERSIONS.joinToString("|") { it.number.toString() }}}
|
|
||||||
Render IR signatures of a specific version. By default, the most up-to-date signature version
|
|
||||||
that is supported in the library is used.
|
|
||||||
-print-signatures {true|false}
|
|
||||||
Print IR signature for every declaration. Applicable only to "dump-metadata" and "dump-ir" commands.
|
|
||||||
""".trimIndent()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal class KlibToolArguments(
|
|
||||||
val commandName: String,
|
|
||||||
val libraryNameOrPath: String,
|
|
||||||
val repository: String?,
|
|
||||||
val printSignatures: Boolean,
|
|
||||||
val signatureVersion: KotlinIrSignatureVersion?,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
private enum class ExtraOption(val option: String) {
|
|
||||||
REPOSITORY("-repository"),
|
|
||||||
PRINT_SIGNATURES("-print-signatures"),
|
|
||||||
SIGNATURE_VERSION("-signature-version");
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
fun parseOrNull(option: String): ExtraOption? = entries.firstOrNull { it.option == option }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
|
||||||
|
|
||||||
@Deprecated(Logger.FATAL_DEPRECATION_MESSAGE, ReplaceWith(Logger.FATAL_REPLACEMENT))
|
|
||||||
override fun fatal(message: String) = logError(message, withStacktrace = true)
|
|
||||||
|
|
||||||
override fun report(severity: IrMessageLogger.Severity, message: String, location: IrMessageLogger.Location?) {
|
|
||||||
when (severity) {
|
|
||||||
IrMessageLogger.Severity.INFO -> log(message)
|
|
||||||
IrMessageLogger.Severity.WARNING -> warning(message)
|
|
||||||
IrMessageLogger.Severity.ERROR -> error(message)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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 val defaultRepository = KFile(DependencyDirectories.localKonanDir.resolve("klib").absolutePath)
|
||||||
|
|
||||||
private class KlibRepoDeprecationWarning {
|
private class KlibRepoDeprecationWarning {
|
||||||
@@ -262,49 +110,6 @@ internal class Library(val libraryNameOrPath: String, requestedRepository: Strin
|
|||||||
library?.libraryFile?.deleteRecursively()
|
library?.libraryFile?.deleteRecursively()
|
||||||
}
|
}
|
||||||
|
|
||||||
class KlibToolIrLinker(
|
|
||||||
module: ModuleDescriptor,
|
|
||||||
irBuiltIns: IrBuiltIns,
|
|
||||||
symbolTable: SymbolTable
|
|
||||||
) : KotlinIrLinker(module, KlibToolLogger, irBuiltIns, symbolTable, exportedDependencies = emptyList()) {
|
|
||||||
override val fakeOverrideBuilder = IrLinkerFakeOverrideProvider(
|
|
||||||
linker = this,
|
|
||||||
symbolTable = symbolTable,
|
|
||||||
mangler = KonanManglerIr,
|
|
||||||
typeSystem = IrTypeSystemContextImpl(builtIns),
|
|
||||||
friendModules = emptyMap(),
|
|
||||||
partialLinkageSupport = PartialLinkageSupportForLinker.DISABLED,
|
|
||||||
)
|
|
||||||
|
|
||||||
override val returnUnboundSymbolsIfSignatureNotFound get() = true
|
|
||||||
|
|
||||||
override val translationPluginContext get() = TODO("Not needed for ir dumping")
|
|
||||||
|
|
||||||
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) = false
|
|
||||||
|
|
||||||
private inner class KlibToolModuleDeserializer(
|
|
||||||
module: ModuleDescriptor,
|
|
||||||
klib: KotlinLibrary,
|
|
||||||
strategyResolver: (String) -> DeserializationStrategy
|
|
||||||
) : BasicIrModuleDeserializer(
|
|
||||||
this,
|
|
||||||
module,
|
|
||||||
klib,
|
|
||||||
strategyResolver,
|
|
||||||
klib.versions.abiVersion ?: KotlinAbiVersion.CURRENT
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||||
fun dumpIr(output: Appendable, printSignatures: Boolean, signatureVersion: KotlinIrSignatureVersion?) {
|
fun dumpIr(output: Appendable, printSignatures: Boolean, signatureVersion: KotlinIrSignatureVersion?) {
|
||||||
val library = libraryInRepoOrCurrentDir(repository, libraryNameOrPath)
|
val library = libraryInRepoOrCurrentDir(repository, libraryNameOrPath)
|
||||||
|
|||||||
Reference in New Issue
Block a user