diff --git a/kotlin-native/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/main.kt b/kotlin-native/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/main.kt index a6d82f26230..cafa2ab0320 100644 --- a/kotlin-native/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/main.kt +++ b/kotlin-native/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/main.kt @@ -72,7 +72,8 @@ fun printUsage() { Note that this command renders the signatures from the metadata. Signatures for certain declarations in the metadata and in IR may differ if compiler plugins (such as Compose) were applied during library compilation. - contents Dump the metadata of all public declarations in the library in the form of Kotlin-alike code + dump-metadata Dump the metadata of all public declarations in the library in the form of Kotlin-alike code + contents [DEPRECATED] Renamed to "dump-metadata". Please, use new command name and the options are: -repository [DEPRECATED] Usage of KLIB repositories will be dropped soon. See https://youtrack.jetbrains.com/issue/KT-61098 @@ -81,7 +82,7 @@ fun printUsage() { Render IR signatures of a specific version. By default, the most up-to-date signature version supported in the library is used. -print-signatures {true|false} - Print IR signature for every declaration (only for "contents" and "dump-ir" commands) + Print IR signature for every declaration (only for "dump-metadata" and "dump-ir" commands) """.trimIndent() ) } @@ -293,6 +294,11 @@ class Library(val libraryNameOrPath: String, val requestedRepository: String?) { } fun contents(output: Appendable, printSignatures: Boolean) { + logWarning("\"contents\" has been renamed to \"dump-metadata\"") + dumpMetadata(output, printSignatures) + } + + fun dumpMetadata(output: Appendable, printSignatures: Boolean) { val module = loadModule() val signatureRenderer = if (printSignatures) DefaultKlibSignatureRenderer("// Signature: ") else KlibSignatureRenderer.NO_SIGNATURE val printer = DeclarationPrinter(output, DefaultDeclarationHeaderRenderer, signatureRenderer) @@ -301,7 +307,7 @@ class Library(val libraryNameOrPath: String, val requestedRepository: String?) { } fun signatures(output: Appendable) { - logWarning("\"signatures\" is deprecated. Please, use \"dump-ir-signatures\" instead\n") + logWarning("\"signatures\" is deprecated. Please, use \"dump-ir-signatures\" instead") val module = loadModule() val printer = SignaturePrinter(output, DefaultKlibSignatureRenderer()) @@ -380,6 +386,7 @@ fun main(args: Array) { when (command.verb) { "dump-ir" -> library.ir(System.out, printSignatures) "dump-ir-signatures" -> library.dumpIrSignatures(System.out, signatureVersion) + "dump-metadata" -> library.dumpMetadata(System.out, printSignatures) "contents" -> library.contents(System.out, printSignatures) "signatures" -> library.signatures(System.out) "info" -> library.info() diff --git a/kotlin-native/klib/src/test/kotlin/org/jetbrains/kotlin/cli/klib/test/ContentsTest.kt b/kotlin-native/klib/src/test/kotlin/org/jetbrains/kotlin/cli/klib/test/DumpMetadataTest.kt similarity index 88% rename from kotlin-native/klib/src/test/kotlin/org/jetbrains/kotlin/cli/klib/test/ContentsTest.kt rename to kotlin-native/klib/src/test/kotlin/org/jetbrains/kotlin/cli/klib/test/DumpMetadataTest.kt index a66f7d1ab4c..42e59cb6e21 100644 --- a/kotlin-native/klib/src/test/kotlin/org/jetbrains/kotlin/cli/klib/test/ContentsTest.kt +++ b/kotlin-native/klib/src/test/kotlin/org/jetbrains/kotlin/cli/klib/test/DumpMetadataTest.kt @@ -12,21 +12,21 @@ import org.jetbrains.kotlin.konan.target.Distribution import org.jetbrains.kotlin.konan.target.HostManager import java.nio.file.Paths -class ContentsTest { +class DumpMetadataTest { private fun testLibrary(name: String) = LIBRARY_DIRECTORY.resolve("$name.klib").toFile().absolutePath - private fun klibContents(library: String, printOutput: Boolean = false, expected: () -> String) { + private fun dumpMetadata(library: String, printOutput: Boolean = false, expected: () -> String) { val output = StringBuilder() val lib = Library(library, null) - lib.contents(output, false) + lib.dumpMetadata(output, false) if (printOutput) { println(output.trim().toString()) } assertEquals( StringUtil.convertLineSeparators(expected()), StringUtil.convertLineSeparators(output.trim().toString()), - "klib contents test failed for library: $library" + "klib \"dump-metadata\" test failed for library: $library" ) } @@ -34,11 +34,11 @@ class ContentsTest { fun `Stdlib content should be printed without exceptions`() { val output = StringBuilder() val distributionPath = System.getProperty("konan.home") - Library(Distribution(distributionPath).stdlib, null).contents(output, false) + Library(Distribution(distributionPath).stdlib, null).dumpMetadata(output, false) } @Test - fun topLevelFunctions() = klibContents(testLibrary("TopLevelFunctions")) { + fun topLevelFunctions() = dumpMetadata(testLibrary("TopLevelFunctions")) { """ package { annotation class A constructor() : Annotation @@ -65,7 +65,7 @@ class ContentsTest { } @Test - fun constructors() = klibContents(testLibrary("Constructors")) { + fun constructors() = dumpMetadata(testLibrary("Constructors")) { """ package { annotation class A constructor() : Annotation @@ -95,7 +95,7 @@ class ContentsTest { } @Test - fun objects() = klibContents(testLibrary("Objects")) { + fun objects() = dumpMetadata(testLibrary("Objects")) { """ package { @@ -128,7 +128,7 @@ class ContentsTest { } @Test - fun classes() = klibContents(testLibrary("Classes")) { + fun classes() = dumpMetadata(testLibrary("Classes")) { """ package { @@ -193,7 +193,7 @@ class ContentsTest { } @Test - fun methodModality() = klibContents(testLibrary("MethodModality")) { + fun methodModality() = dumpMetadata(testLibrary("MethodModality")) { """ package { @@ -223,7 +223,7 @@ class ContentsTest { } @Test - fun functionModifiers() = klibContents(testLibrary("FunctionModifiers")) { + fun functionModifiers() = dumpMetadata(testLibrary("FunctionModifiers")) { """ package { @@ -242,7 +242,7 @@ class ContentsTest { @Test // TODO: Support enum entry methods in serialization/deserialization. - fun enum() = klibContents(testLibrary("Enum")) { + fun enum() = dumpMetadata(testLibrary("Enum")) { """ package { @@ -262,7 +262,7 @@ class ContentsTest { @Test // TODO: Support getter/setter annotations in serialization/deserialization. - fun accessors() = klibContents(testLibrary("Accessors")) { + fun accessors() = dumpMetadata(testLibrary("Accessors")) { """ package custom.pkg { annotation class A constructor() : Annotation @@ -287,7 +287,7 @@ class ContentsTest { } @Test - fun topLevelPropertiesCustomPackage() = klibContents(testLibrary("TopLevelPropertiesCustomPackage")) { + fun topLevelPropertiesCustomPackage() = dumpMetadata(testLibrary("TopLevelPropertiesCustomPackage")) { """ package custom.pkg { typealias MyTransformer = (String) -> Int @@ -300,7 +300,7 @@ class ContentsTest { } @Test - fun topLevelPropertiesRootPackage() = klibContents(testLibrary("TopLevelPropertiesRootPackage")) { + fun topLevelPropertiesRootPackage() = dumpMetadata(testLibrary("TopLevelPropertiesRootPackage")) { """ package { typealias MyTransformer = (String) -> Int @@ -313,7 +313,7 @@ class ContentsTest { } @Test - fun topLevelPropertiesWithClassesCustomPackage() = klibContents(testLibrary("TopLevelPropertiesWithClassesCustomPackage")) { + fun topLevelPropertiesWithClassesCustomPackage() = dumpMetadata(testLibrary("TopLevelPropertiesWithClassesCustomPackage")) { """ package custom.pkg { object Bar @@ -328,7 +328,7 @@ class ContentsTest { } @Test - fun topLevelPropertiesWithClassesRootPackage() = klibContents(testLibrary("TopLevelPropertiesWithClassesRootPackage")) { + fun topLevelPropertiesWithClassesRootPackage() = dumpMetadata(testLibrary("TopLevelPropertiesWithClassesRootPackage")) { """ package { object Bar diff --git a/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/AbstractNativeCInteropKT39120Test.kt b/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/AbstractNativeCInteropKT39120Test.kt index 82b92fdf51d..0d2ab0be384 100644 --- a/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/AbstractNativeCInteropKT39120Test.kt +++ b/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/AbstractNativeCInteropKT39120Test.kt @@ -16,7 +16,7 @@ import org.jetbrains.kotlin.konan.test.blackbox.support.settings.Timeouts import org.jetbrains.kotlin.konan.test.blackbox.support.util.DEFAULT_FILE_NAME import org.jetbrains.kotlin.konan.test.blackbox.support.util.DEFAULT_MODULE_NAME import org.jetbrains.kotlin.konan.test.blackbox.support.util.getAbsoluteFile -import org.jetbrains.kotlin.konan.test.blackbox.support.util.getContents +import org.jetbrains.kotlin.konan.test.blackbox.support.util.dumpMetadata import org.jetbrains.kotlin.test.services.JUnit5Assertions.assertEquals import org.junit.jupiter.api.Assumptions import org.junit.jupiter.api.Tag @@ -39,18 +39,18 @@ abstract class AbstractNativeCInteropKT39120Test : AbstractNativeCInteropBaseTes val includeFrameworkArgs = TestCompilerArgs("-compiler-option", "-F${testDataDir.canonicalPath}") val klib1: KLIB = cinteropToLibrary(targets, def1File, buildDir, includeFrameworkArgs).assertSuccess().resultingArtifact - val contents1 = klib1.getContents(kotlinNativeClassLoader.classLoader) + val metadata1 = klib1.dumpMetadata(kotlinNativeClassLoader.classLoader) val expectedFiltered1Output = golden1File.readText() - val actualFiltered1Output = filterContentsOutput(contents1, " pod.Version|POD|class Pod") + val actualFiltered1Output = filterContentsOutput(metadata1, " pod.Version|POD|class Pod") assertEquals(StringUtilRt.convertLineSeparators(expectedFiltered1Output), StringUtilRt.convertLineSeparators(actualFiltered1Output)) val cinterop2ExtraArgs = TestCompilerArgs("-l", klib1.klibFile.canonicalPath, "-compiler-option", "-fmodules") val klib2: KLIB = cinteropToLibrary(targets, def2File, buildDir, includeFrameworkArgs + cinterop2ExtraArgs).assertSuccess().resultingArtifact - val contents2 = klib2.getContents(kotlinNativeClassLoader.classLoader) + val metadata2 = klib2.dumpMetadata(kotlinNativeClassLoader.classLoader) val expectedFiltered2Output = golden2File.readText() - val actualFiltered2Output = filterContentsOutput(contents2, " pod.Version|POD|class Pod") + val actualFiltered2Output = filterContentsOutput(metadata2, " pod.Version|POD|class Pod") assertEquals(StringUtilRt.convertLineSeparators(expectedFiltered2Output), StringUtilRt.convertLineSeparators(actualFiltered2Output)) val ktFile = testPathFull.resolve(DEFAULT_FILE_NAME) diff --git a/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/AbstractNativeCInteropTest.kt b/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/AbstractNativeCInteropTest.kt index ec9f52013da..0c21c367790 100644 --- a/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/AbstractNativeCInteropTest.kt +++ b/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/AbstractNativeCInteropTest.kt @@ -13,7 +13,7 @@ import org.jetbrains.kotlin.konan.test.blackbox.support.TestCompilerArgs import org.jetbrains.kotlin.konan.test.blackbox.support.compilation.TestCompilationResult import org.jetbrains.kotlin.konan.test.blackbox.support.compilation.TestCompilationResult.Companion.assertSuccess import org.jetbrains.kotlin.konan.test.blackbox.support.util.getAbsoluteFile -import org.jetbrains.kotlin.konan.test.blackbox.support.util.getContents +import org.jetbrains.kotlin.konan.test.blackbox.support.util.dumpMetadata import org.jetbrains.kotlin.konan.util.CInteropHints import org.jetbrains.kotlin.test.services.JUnit5Assertions.assertEquals import org.jetbrains.kotlin.test.services.JUnit5Assertions.assertTrue @@ -103,7 +103,7 @@ abstract class AbstractNativeCInteropTest : AbstractNativeCInteropBaseTest() { "Test failed. CInterop compilation result was: $testCompilationResult" } } else { - val klibContents = testCompilationResult.assertSuccess().resultingArtifact.getContents(kotlinNativeClassLoader.classLoader) + val metadata = testCompilationResult.assertSuccess().resultingArtifact.dumpMetadata(kotlinNativeClassLoader.classLoader) .let { if (ignoreExperimentalForeignApi) { it.replace("@ExperimentalForeignApi ", "") @@ -112,7 +112,7 @@ abstract class AbstractNativeCInteropTest : AbstractNativeCInteropBaseTest() { } } val expectedContents = goldenFile.readText() - assertEquals(StringUtilRt.convertLineSeparators(expectedContents), StringUtilRt.convertLineSeparators(klibContents)) { + assertEquals(StringUtilRt.convertLineSeparators(expectedContents), StringUtilRt.convertLineSeparators(metadata)) { "Test failed. CInterop compilation result was: $testCompilationResult" } } diff --git a/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/AbstractNativeKlibDumpMetadataTest.kt b/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/AbstractNativeKlibDumpMetadataTest.kt index 59893a3ccd4..03089748343 100644 --- a/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/AbstractNativeKlibDumpMetadataTest.kt +++ b/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/AbstractNativeKlibDumpMetadataTest.kt @@ -16,7 +16,7 @@ import org.jetbrains.kotlin.konan.test.blackbox.support.runner.TestRunChecks import org.jetbrains.kotlin.konan.test.blackbox.support.settings.KotlinNativeClassLoader import org.jetbrains.kotlin.konan.test.blackbox.support.settings.Timeouts import org.jetbrains.kotlin.konan.test.blackbox.support.util.getAbsoluteFile -import org.jetbrains.kotlin.konan.test.blackbox.support.util.getContents +import org.jetbrains.kotlin.konan.test.blackbox.support.util.dumpMetadata import org.jetbrains.kotlin.test.services.JUnit5Assertions.assertEqualsToFile import org.junit.jupiter.api.Tag import java.io.File @@ -33,9 +33,9 @@ abstract class AbstractNativeKlibDumpMetadataTest : AbstractNativeSimpleTest() { val testCompilationResult: TestCompilationResult.Success = compileToLibrary(testCase) val kotlinNativeClassLoader = testRunSettings.get() - val klibContents = testCompilationResult.assertSuccess().resultingArtifact.getContents(kotlinNativeClassLoader.classLoader) - val klibContentsFiltered = filterContentsOutput(klibContents, linestoExclude = listOf("package test {", "}", "")) - assertEqualsToFile(File("${testPathFull.canonicalPath.substringBeforeLast(".")}.txt"), StringUtilRt.convertLineSeparators(klibContentsFiltered)) + val metadata = testCompilationResult.assertSuccess().resultingArtifact.dumpMetadata(kotlinNativeClassLoader.classLoader) + val metadataFiltered = filterContentsOutput(metadata, linestoExclude = listOf("package test {", "}", "")) + assertEqualsToFile(File("${testPathFull.canonicalPath.substringBeforeLast(".")}.txt"), StringUtilRt.convertLineSeparators(metadataFiltered)) } private fun generateTestCaseWithSingleSource(source: File, extraArgs: List): TestCase { diff --git a/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/support/util/TestCompilationArtifacts.kt b/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/support/util/TestCompilationArtifacts.kt index 01a8e08ddd2..61807cf8647 100644 --- a/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/support/util/TestCompilationArtifacts.kt +++ b/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/support/util/TestCompilationArtifacts.kt @@ -20,8 +20,8 @@ private fun invokeKlibTool(kotlinNativeClassLoader: ClassLoader, klibFile: File, } -internal fun TestCompilationArtifact.KLIB.getContents(kotlinNativeClassLoader: ClassLoader): String { - return invokeKlibTool(kotlinNativeClassLoader, klibFile, "contents", false) +internal fun TestCompilationArtifact.KLIB.dumpMetadata(kotlinNativeClassLoader: ClassLoader): String { + return invokeKlibTool(kotlinNativeClassLoader, klibFile, "dumpMetadata", /* printSignatures= */ false) } internal fun TestCompilationArtifact.KLIB.getIr(