From fefe6e3d2ef21d99689d5f78718f4e0132944562 Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Tue, 30 Apr 2024 13:45:05 +0200 Subject: [PATCH 1/6] Use declaration kind to sort Klib dump --- .../kotlin/api/klib/KlibAbiDumpFileMerger.kt | 112 +++++++++++++++++- src/test/kotlin/tests/KlibAbiMergingTest.kt | 41 +++++++ src/test/kotlin/tests/KlibDumpTest.kt | 8 +- .../merge/diverging/linuxArm64.extracted.api | 2 +- src/test/resources/merge/diverging/merged.abi | 2 +- .../merge/diverging/merged_with_aliases.abi | 2 +- .../merged_with_aliases_and_custom_names.abi | 2 +- src/test/resources/merge/guess/common.api | 2 +- src/test/resources/merge/guess/guessed.api | 4 +- .../merge/idempotent/bcv-klib-test.abi | 2 +- src/test/resources/merge/identical/merged.abi | 2 +- .../withoutLinuxAll.abi | 2 +- .../withoutLinuxArm64.abi | 2 +- .../resources/merge/webTargets/js.ext.abi | 2 +- .../resources/merge/webTargets/merged.abi | 2 +- .../resources/merge/webTargets/wasmJs.ext.abi | 2 +- .../merge/webTargets/wasmWasi.ext.abi | 2 +- 17 files changed, 170 insertions(+), 21 deletions(-) diff --git a/src/main/kotlin/api/klib/KlibAbiDumpFileMerger.kt b/src/main/kotlin/api/klib/KlibAbiDumpFileMerger.kt index 529c670f..37304cc1 100644 --- a/src/main/kotlin/api/klib/KlibAbiDumpFileMerger.kt +++ b/src/main/kotlin/api/klib/KlibAbiDumpFileMerger.kt @@ -145,7 +145,9 @@ internal class KlibAbiDumpMerger { while (lines.hasNext()) { val line = lines.peek()!! - if (line.isEmpty()) { lines.next(); continue } + if (line.isEmpty()) { + lines.next(); continue + } // TODO: wrap the line and cache the depth inside that wrapper? val lineDepth = line.depth() when { @@ -487,6 +489,7 @@ internal class KlibAbiDumpMerger { * declarations. */ internal class DeclarationContainer(val text: String, val parent: DeclarationContainer? = null) { + val type: DeclarationType? = if (text.isNotBlank()) DeclarationType.parseFromDeclaration(text) else null val targets: MutableSet = mutableSetOf() val children: MutableMap = mutableMapOf() var delimiter: String? = null @@ -627,9 +630,33 @@ private object DeclarationsComparator : Comparator { return this.mapTo(mutableListOf()) { it.toString() }.apply { sort() } } + private fun compareStructurally(lhs: DeclarationContainer, rhs: DeclarationContainer): Int { + require(lhs.parent === rhs.parent) + + val isTopLevel = lhs.parent?.parent == null + + fun extractOrderMod(c: DeclarationContainer): Int { + val ord = if (isTopLevel) { + c.type?.topLevelOrder + } else { + c.type?.nestedOrder + } + return ord ?: DeclarationType.last + } + + val lhsOrderMod = extractOrderMod(lhs) + val rhsOrderMod = extractOrderMod(rhs) + + return if (lhsOrderMod == rhsOrderMod) { + lhs.text.compareTo(rhs.text) + } else { + lhsOrderMod.compareTo(rhsOrderMod) + } + } + override fun compare(c0: DeclarationContainer, c1: DeclarationContainer): Int { return if (c0.targets == c1.targets) { - c0.text.compareTo(c1.text) + compareStructurally(c0, c1) } else { if (c0.targets.size == c1.targets.size) { val c0targets = c0.targets.serializeAndSort().iterator() @@ -766,3 +793,84 @@ internal class KlibsTargetsFormatter(klibDump: KlibAbiDumpMerger) { ) } } + +internal enum class DeclarationType(val topLevelOrder: Int, val nestedOrder: Int) { + Class(3, 9), + Object(4, 10), + Interface(2, 8), + EnumClass(1, 7), + AnnotationClass(0, 6), + Function(8, 5), + Constructor(100000, 0), + ConstVal(5, 2), + Val(6, 3), + Var(7, 4), + EnumEntry(100000, 1), + Unknown(100000, 100000); + + companion object { + const val last: Int = 100000 + + fun parseFromDeclaration(decl: String): DeclarationType { + val scanner = Scanner(decl.trim()) + while (scanner.hasNext()) { + when (val part = scanner.next()) { + "final", "open", "abstract", "sealed", "suspend", "inline", "inner", "value" -> { + /* do nothing; we only need declaration type info (i.e., class, function, property, etc.) */ + continue + } + + "enum" -> { + when (val next = scanner.next()) { + "entry" -> return EnumEntry + "class" -> return EnumClass + else -> throw IllegalStateException("Unexpected token '$next' after '$part'") + } + } + + "constructor" -> return Constructor + "val" -> return Val + "const" -> { + val type = ConstVal + check(scanner.next() == "val") { "expected 'val'" } + return type + } + + "var" -> return Var + "interface" -> return Interface + "annotation" -> { + val type = AnnotationClass + check(scanner.next() == "class") { "expected 'class'" } + return type + } + + "class" -> return Class + "object" -> return Object + "fun" -> { + val next = scanner.next() + when (next) { + "class" -> return Class + "interface" -> return Interface + "object" -> return Object + + "enum" -> { + val type = EnumClass + check(scanner.next() == "class") { "expected 'class'" } + return type + } + + "annotation" -> { + val type = AnnotationClass + check(scanner.next() == "class") { "expected 'class'" } + return type + } + + else -> return Function + } + } + } + } + return Unknown + } + } +} diff --git a/src/test/kotlin/tests/KlibAbiMergingTest.kt b/src/test/kotlin/tests/KlibAbiMergingTest.kt index 0c557530..d3784d1c 100644 --- a/src/test/kotlin/tests/KlibAbiMergingTest.kt +++ b/src/test/kotlin/tests/KlibAbiMergingTest.kt @@ -5,6 +5,7 @@ package tests +import kotlinx.validation.api.klib.DeclarationType import kotlinx.validation.api.klib.KlibAbiDumpMerger import kotlinx.validation.api.klib.KlibTarget import org.junit.Rule @@ -360,4 +361,44 @@ class KlibAbiMergingTest { Files.readAllLines(dump.toPath()).asSequence() ) } + + @Test + fun parseDeclarationType() { + val declarations = mapOf( + "abstract class examples.classes/AC { // examples.classes/AC|null[0]" to DeclarationType.Class, + "final class examples.classes/C { // examples.classes/C|null[0]" to DeclarationType.Class, + "final inner class Inner { // examples.classes/Outer.Nested.Inner|null[0]" to DeclarationType.Class, + "open annotation class examples.classes/A : kotlin/Annotation { // examples.classes/A|null[0]" to DeclarationType.AnnotationClass, + "final object examples.classes/O // examples.classes/O|null[0]" to DeclarationType.Object, + "abstract interface examples.classes/I // examples.classes/I|null[0]" to DeclarationType.Interface, + "final value class classifiers.test/ValueClass { // classifiers.test/ValueClass|null[0]" to DeclarationType.Class, + "abstract fun interface classifiers.test/FunctionInterface { // classifiers.test/FunctionInterface|null[0]" to DeclarationType.Interface, + "final enum class examples.classes/E : kotlin/Enum { // examples.classes/E|null[0]" to DeclarationType.EnumClass, + + "constructor (kotlin/Int) // examples.classes/D.|(kotlin.Int){}[0]" to DeclarationType.Constructor, + + "final fun (): kotlin.enums/EnumEntries // examples.classes/E.entries.|#static(){}[0]" to DeclarationType.Function, + "final fun values(): kotlin/Array // examples.classes/E.values|values#static(){}[0]" to DeclarationType.Function, + "open fun o(): kotlin/Int // examples.classes/OC.o|o(){}[0]" to DeclarationType.Function, + "final inline fun examples.classes/testInlineFun() // examples.classes/testInlineFun|testInlineFun(){}[0]" to DeclarationType.Function, + "final fun <#A: kotlin/Any?> examples.classes/consume(#A) // examples.classes/consume|consume(0:0){0§}[0]" to DeclarationType.Function, + "abstract fun a() // examples.classes/AC.a|a(){}[0]" to DeclarationType.Function, + "final fun (kotlin/Int).callables.test/regularFun(): kotlin/String // callables.test/regularFun|regularFun@kotlin.Int(){}[0]" to DeclarationType.Function, + "final fun context(kotlin/Number) (kotlin/Number).callables.test/regularFun(): kotlin/String // callables.test/regularFun|regularFun!kotlin.Int@kotlin.Number(){}[0]" to DeclarationType.Function, + + "final val entries // examples.classes/E.entries|#static{}entries[0]" to DeclarationType.Val, + "final const val examples.classes/con // examples.classes/con|{}con[0]" to DeclarationType.ConstVal, + "final var examples.classes/r // examples.classes/r|{}r[0]" to DeclarationType.Var, + + "enum entry A // examples.classes/E.A|null[0]" to DeclarationType.EnumEntry, + + "" to DeclarationType.Unknown, + " " to DeclarationType.Unknown, + "\t" to DeclarationType.Unknown + ) + + declarations.forEach { (line, expectedType) -> + assertEquals(expectedType, DeclarationType.parseFromDeclaration(line), "Mismatch for line: '$line'") + } + } } diff --git a/src/test/kotlin/tests/KlibDumpTest.kt b/src/test/kotlin/tests/KlibDumpTest.kt index 7915e4df..d691aa0e 100644 --- a/src/test/kotlin/tests/KlibDumpTest.kt +++ b/src/test/kotlin/tests/KlibDumpTest.kt @@ -48,9 +48,9 @@ private val mergedLinuxDump = """ // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(kotlin.Int){}[0] - final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] final val value // org.example/ShardedClass.value|{}value[0] final fun (): kotlin/Int // org.example/ShardedClass.value.|(){}[0] + final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] } final fun org.example/ShardedClass(kotlin/Int, kotlin/Float, kotlin/Long): org.example/ShardedClass // org.example/ShardedClass|ShardedClass(kotlin.Int;kotlin.Float;kotlin.Long){}[0] @@ -112,9 +112,9 @@ private val mergedLinuxDumpWithCustomName = """ // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(kotlin.Int){}[0] - final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] final val value // org.example/ShardedClass.value|{}value[0] final fun (): kotlin/Int // org.example/ShardedClass.value.|(){}[0] + final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] } final fun org.example/ShardedClass(kotlin/Int, kotlin/Float, kotlin/Long): org.example/ShardedClass // org.example/ShardedClass|ShardedClass(kotlin.Int;kotlin.Float;kotlin.Long){}[0] @@ -562,9 +562,9 @@ class KlibDumpTest { // Library unique name: final class org.different.pack/BuildConfig { // org.different.pack/BuildConfig|null[0] constructor () // org.different.pack/BuildConfig.|(){}[0] - final fun f1(): kotlin/Int // org.different.pack/BuildConfig.f1|f1(){}[0] final val p1 // org.different.pack/BuildConfig.p1|{}p1[0] final fun (): kotlin/Int // org.different.pack/BuildConfig.p1.|(){}[0] + final fun f1(): kotlin/Int // org.different.pack/BuildConfig.f1|f1(){}[0] } // Targets: [androidNativeArm64] final fun (org.different.pack/BuildConfig).org.different.pack/linuxArm64Specific(): kotlin/Int // org.different.pack/linuxArm64Specific|linuxArm64Specific@org.different.pack.BuildConfig(){}[0] @@ -590,9 +590,9 @@ class KlibDumpTest { // Library unique name: final class org.different.pack/BuildConfig { // org.different.pack/BuildConfig|null[0] constructor () // org.different.pack/BuildConfig.|(){}[0] - final fun f1(): kotlin/Int // org.different.pack/BuildConfig.f1|f1(){}[0] final val p1 // org.different.pack/BuildConfig.p1|{}p1[0] final fun (): kotlin/Int // org.different.pack/BuildConfig.p1.|(){}[0] + final fun f1(): kotlin/Int // org.different.pack/BuildConfig.f1|f1(){}[0] } // Targets: [androidNative, linux] final fun (org.different.pack/BuildConfig).org.different.pack/linuxArm64Specific3(): kotlin/Int // org.different.pack/linuxArm64Specific3|linuxArm64Specific@org.different.pack.BuildConfig(){}[0] diff --git a/src/test/resources/merge/diverging/linuxArm64.extracted.api b/src/test/resources/merge/diverging/linuxArm64.extracted.api index f0b0753b..f072ce93 100644 --- a/src/test/resources/merge/diverging/linuxArm64.extracted.api +++ b/src/test/resources/merge/diverging/linuxArm64.extracted.api @@ -8,9 +8,9 @@ // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(kotlin.Int){}[0] - final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] final val value // org.example/ShardedClass.value|{}value[0] final fun (): kotlin/Int // org.example/ShardedClass.value.|(){}[0] + final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] } final fun (kotlin/Long).org.example/add(kotlin/Long): kotlin/Long // org.example/add|add@kotlin.Long(kotlin.Long){}[0] final fun org.example/ShardedClass(kotlin/Int, kotlin/Float, kotlin/Long): org.example/ShardedClass // org.example/ShardedClass|ShardedClass(kotlin.Int;kotlin.Float;kotlin.Long){}[0] diff --git a/src/test/resources/merge/diverging/merged.abi b/src/test/resources/merge/diverging/merged.abi index de31ec4a..b0c5389e 100644 --- a/src/test/resources/merge/diverging/merged.abi +++ b/src/test/resources/merge/diverging/merged.abi @@ -9,9 +9,9 @@ // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(kotlin.Int){}[0] - final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] final val value // org.example/ShardedClass.value|{}value[0] final fun (): kotlin/Int // org.example/ShardedClass.value.|(){}[0] + final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] } final fun org.example/ShardedClass(kotlin/Int, kotlin/Float, kotlin/Long): org.example/ShardedClass // org.example/ShardedClass|ShardedClass(kotlin.Int;kotlin.Float;kotlin.Long){}[0] // Targets: [linux] diff --git a/src/test/resources/merge/diverging/merged_with_aliases.abi b/src/test/resources/merge/diverging/merged_with_aliases.abi index de31ec4a..b0c5389e 100644 --- a/src/test/resources/merge/diverging/merged_with_aliases.abi +++ b/src/test/resources/merge/diverging/merged_with_aliases.abi @@ -9,9 +9,9 @@ // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(kotlin.Int){}[0] - final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] final val value // org.example/ShardedClass.value|{}value[0] final fun (): kotlin/Int // org.example/ShardedClass.value.|(){}[0] + final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] } final fun org.example/ShardedClass(kotlin/Int, kotlin/Float, kotlin/Long): org.example/ShardedClass // org.example/ShardedClass|ShardedClass(kotlin.Int;kotlin.Float;kotlin.Long){}[0] // Targets: [linux] diff --git a/src/test/resources/merge/diverging/merged_with_aliases_and_custom_names.abi b/src/test/resources/merge/diverging/merged_with_aliases_and_custom_names.abi index 1013b501..d32c129d 100644 --- a/src/test/resources/merge/diverging/merged_with_aliases_and_custom_names.abi +++ b/src/test/resources/merge/diverging/merged_with_aliases_and_custom_names.abi @@ -9,9 +9,9 @@ // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(kotlin.Int){}[0] - final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] final val value // org.example/ShardedClass.value|{}value[0] final fun (): kotlin/Int // org.example/ShardedClass.value.|(){}[0] + final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] } final fun org.example/ShardedClass(kotlin/Int, kotlin/Float, kotlin/Long): org.example/ShardedClass // org.example/ShardedClass|ShardedClass(kotlin.Int;kotlin.Float;kotlin.Long){}[0] // Targets: [linux] diff --git a/src/test/resources/merge/guess/common.api b/src/test/resources/merge/guess/common.api index b2823f75..00aa80c7 100644 --- a/src/test/resources/merge/guess/common.api +++ b/src/test/resources/merge/guess/common.api @@ -8,7 +8,7 @@ // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(kotlin.Int){}[0] - final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] final val value // org.example/ShardedClass.value|{}value[0] final fun (): kotlin/Int // org.example/ShardedClass.value.|(){}[0] + final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] } diff --git a/src/test/resources/merge/guess/guessed.api b/src/test/resources/merge/guess/guessed.api index ebed8a76..87f9ad2a 100644 --- a/src/test/resources/merge/guess/guessed.api +++ b/src/test/resources/merge/guess/guessed.api @@ -8,10 +8,10 @@ // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(kotlin.Int){}[0] - final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] - final fun addNarrow(kotlin/Int): kotlin/Int // org.example/ShardedClass.addNarrow|addNarrow(kotlin.Int){}[0] final val value // org.example/ShardedClass.value|{}value[0] final fun (): kotlin/Int // org.example/ShardedClass.value.|(){}[0] + final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] + final fun addNarrow(kotlin/Int): kotlin/Int // org.example/ShardedClass.addNarrow|addNarrow(kotlin.Int){}[0] } final fun (org.example/X).org.example/add(org.example/X): org.example/X // org.example/add|add@org.example.X(org.example.X){}[0] final fun org.example/add(org.example/X, org.example/X): org.example/X // org.example/add|add(org.example.X;org.example.X){}[0] diff --git a/src/test/resources/merge/idempotent/bcv-klib-test.abi b/src/test/resources/merge/idempotent/bcv-klib-test.abi index 7a81715c..b136a18c 100644 --- a/src/test/resources/merge/idempotent/bcv-klib-test.abi +++ b/src/test/resources/merge/idempotent/bcv-klib-test.abi @@ -11,9 +11,9 @@ // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(kotlin.Int){}[0] - final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] final val value // org.example/ShardedClass.value|{}value[0] final fun (): kotlin/Int // org.example/ShardedClass.value.|(){}[0] + final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] } final fun org.example/ShardedClass(kotlin/Int, kotlin/Float, kotlin/Long): org.example/ShardedClass // org.example/ShardedClass|ShardedClass(kotlin.Int;kotlin.Float;kotlin.Long){}[0] // Targets: [apple] diff --git a/src/test/resources/merge/identical/merged.abi b/src/test/resources/merge/identical/merged.abi index 27a1c6d6..af419f65 100644 --- a/src/test/resources/merge/identical/merged.abi +++ b/src/test/resources/merge/identical/merged.abi @@ -8,8 +8,8 @@ // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(kotlin.Int){}[0] - final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] final val value // org.example/ShardedClass.value|{}value[0] final fun (): kotlin/Int // org.example/ShardedClass.value.|(){}[0] + final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] } final fun org.example/ShardedClass(kotlin/Int, kotlin/Float, kotlin/Long): org.example/ShardedClass // org.example/ShardedClass|ShardedClass(kotlin.Int;kotlin.Float;kotlin.Long){}[0] diff --git a/src/test/resources/merge/parseNarrowChildrenDecls/withoutLinuxAll.abi b/src/test/resources/merge/parseNarrowChildrenDecls/withoutLinuxAll.abi index 07552376..c6af23ea 100644 --- a/src/test/resources/merge/parseNarrowChildrenDecls/withoutLinuxAll.abi +++ b/src/test/resources/merge/parseNarrowChildrenDecls/withoutLinuxAll.abi @@ -8,7 +8,7 @@ // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(kotlin.Int){}[0] - final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] final val value // org.example/ShardedClass.value|{}value[0] final fun (): kotlin/Int // org.example/ShardedClass.value.|(){}[0] + final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] } diff --git a/src/test/resources/merge/parseNarrowChildrenDecls/withoutLinuxArm64.abi b/src/test/resources/merge/parseNarrowChildrenDecls/withoutLinuxArm64.abi index f8ae14ba..6bc939e0 100644 --- a/src/test/resources/merge/parseNarrowChildrenDecls/withoutLinuxArm64.abi +++ b/src/test/resources/merge/parseNarrowChildrenDecls/withoutLinuxArm64.abi @@ -8,9 +8,9 @@ // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(kotlin.Int){}[0] - final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] final val value // org.example/ShardedClass.value|{}value[0] final fun (): kotlin/Int // org.example/ShardedClass.value.|(){}[0] + final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] // Targets: [linuxX64] final fun addNarrow(kotlin/Int): kotlin/Int // org.example/ShardedClass.addNarrow|addNarrow(kotlin.Int){}[0] } diff --git a/src/test/resources/merge/webTargets/js.ext.abi b/src/test/resources/merge/webTargets/js.ext.abi index fdb21462..a26ddda5 100644 --- a/src/test/resources/merge/webTargets/js.ext.abi +++ b/src/test/resources/merge/webTargets/js.ext.abi @@ -8,8 +8,8 @@ // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(kotlin.Int){}[0] - final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] final val value // org.example/ShardedClass.value|{}value[0] final fun (): kotlin/Int // org.example/ShardedClass.value.|(){}[0] + final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] } final fun org.example/ShardedClass(kotlin/Int, kotlin/Float, kotlin/Long): org.example/ShardedClass // org.example/ShardedClass|ShardedClass(kotlin.Int;kotlin.Float;kotlin.Long){}[0] diff --git a/src/test/resources/merge/webTargets/merged.abi b/src/test/resources/merge/webTargets/merged.abi index 29f24c8f..2ca57e8c 100644 --- a/src/test/resources/merge/webTargets/merged.abi +++ b/src/test/resources/merge/webTargets/merged.abi @@ -8,8 +8,8 @@ // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(kotlin.Int){}[0] - final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] final val value // org.example/ShardedClass.value|{}value[0] final fun (): kotlin/Int // org.example/ShardedClass.value.|(){}[0] + final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] } final fun org.example/ShardedClass(kotlin/Int, kotlin/Float, kotlin/Long): org.example/ShardedClass // org.example/ShardedClass|ShardedClass(kotlin.Int;kotlin.Float;kotlin.Long){}[0] diff --git a/src/test/resources/merge/webTargets/wasmJs.ext.abi b/src/test/resources/merge/webTargets/wasmJs.ext.abi index 44cb7a7f..295270dd 100644 --- a/src/test/resources/merge/webTargets/wasmJs.ext.abi +++ b/src/test/resources/merge/webTargets/wasmJs.ext.abi @@ -8,8 +8,8 @@ // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(kotlin.Int){}[0] - final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] final val value // org.example/ShardedClass.value|{}value[0] final fun (): kotlin/Int // org.example/ShardedClass.value.|(){}[0] + final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] } final fun org.example/ShardedClass(kotlin/Int, kotlin/Float, kotlin/Long): org.example/ShardedClass // org.example/ShardedClass|ShardedClass(kotlin.Int;kotlin.Float;kotlin.Long){}[0] diff --git a/src/test/resources/merge/webTargets/wasmWasi.ext.abi b/src/test/resources/merge/webTargets/wasmWasi.ext.abi index 6e7083ed..e9332540 100644 --- a/src/test/resources/merge/webTargets/wasmWasi.ext.abi +++ b/src/test/resources/merge/webTargets/wasmWasi.ext.abi @@ -8,8 +8,8 @@ // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(kotlin.Int){}[0] - final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] final val value // org.example/ShardedClass.value|{}value[0] final fun (): kotlin/Int // org.example/ShardedClass.value.|(){}[0] + final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] } final fun org.example/ShardedClass(kotlin/Int, kotlin/Float, kotlin/Long): org.example/ShardedClass // org.example/ShardedClass|ShardedClass(kotlin.Int;kotlin.Float;kotlin.Long){}[0] From e440e9544a7482b9305e134d1d9122449b848942 Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Tue, 30 Apr 2024 13:49:56 +0200 Subject: [PATCH 2/6] Copy merged declaration instead of moving it --- src/main/kotlin/api/klib/KlibAbiDumpFileMerger.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/api/klib/KlibAbiDumpFileMerger.kt b/src/main/kotlin/api/klib/KlibAbiDumpFileMerger.kt index 37304cc1..26b1ccf2 100644 --- a/src/main/kotlin/api/klib/KlibAbiDumpFileMerger.kt +++ b/src/main/kotlin/api/klib/KlibAbiDumpFileMerger.kt @@ -560,7 +560,9 @@ internal class DeclarationContainer(val text: String, val parent: DeclarationCon targets.addAll(other.targets) other.children.forEach { otherChild -> when (val child = children[otherChild.key]) { - null -> children[otherChild.key] = otherChild.value + null -> { + children[otherChild.key] = otherChild.value.deepCopy(this) + } else -> child.mergeTargetSpecific(otherChild.value) } } From 2ad512d87da63916902e4ceaeb21477011fcd27f Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Tue, 30 Apr 2024 17:40:05 +0200 Subject: [PATCH 3/6] Updated samples --- src/test/kotlin/samples/KlibDumpSamples.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/kotlin/samples/KlibDumpSamples.kt b/src/test/kotlin/samples/KlibDumpSamples.kt index f3cf5e01..b44368f4 100644 --- a/src/test/kotlin/samples/KlibDumpSamples.kt +++ b/src/test/kotlin/samples/KlibDumpSamples.kt @@ -87,9 +87,9 @@ class KlibDumpSamples { // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(kotlin.Int){}[0] - final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] final val value // org.example/ShardedClass.value|{}value[0] final fun (): kotlin/Int // org.example/ShardedClass.value.|(){}[0] + final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] } // Targets: [linuxX64] final fun org.example/ShardedClass(kotlin/Int, kotlin/Float, kotlin/Long): org.example/ShardedClass // org.example/ShardedClass|ShardedClass(kotlin.Int;kotlin.Float;kotlin.Long){}[0] @@ -155,9 +155,9 @@ class KlibDumpSamples { // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(kotlin.Int){}[0] - final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] final val value // org.example/ShardedClass.value|{}value[0] final fun (): kotlin/Int // org.example/ShardedClass.value.|(){}[0] + final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] } // Targets: [linuxX64.linuxX86_64] final fun org.example/ShardedClass(kotlin/Int, kotlin/Float, kotlin/Long): org.example/ShardedClass // org.example/ShardedClass|ShardedClass(kotlin.Int;kotlin.Float;kotlin.Long){}[0] @@ -177,9 +177,9 @@ class KlibDumpSamples { // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(kotlin.Int){}[0] - final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] final val value // org.example/ShardedClass.value|{}value[0] final fun (): kotlin/Int // org.example/ShardedClass.value.|(){}[0] + final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] } """.trimIndent(), filteredDumpContent) @@ -281,8 +281,8 @@ class KlibDumpSamples { // - Show declarations: true // Library unique name: - abstract class examples.classes/NewKlass // examples.classes/NewKlass|null[0] abstract interface examples.classes/Iface // examples.classes/Iface|null[0] + abstract class examples.classes/NewKlass // examples.classes/NewKlass|null[0] """.trimIndent(), inferredDumpContent) From fa3288a17aa2cc65f4c09b2b10bde7c6a0ff7b07 Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Tue, 30 Apr 2024 18:12:36 +0200 Subject: [PATCH 4/6] Updated integration tests --- .../examples/classes/AnotherBuildConfig.klib.clash.dump | 2 +- .../examples/classes/AnotherBuildConfig.klib.custom.dump | 2 +- .../resources/examples/classes/AnotherBuildConfig.klib.dump | 2 +- .../classes/AnotherBuildConfig.klib.linuxX64Only.dump | 2 +- .../examples/classes/AnotherBuildConfig.klib.web.dump | 2 +- .../classes/AnotherBuildConfigLinux.klib.grouping.dump | 2 +- .../classes/AnotherBuildConfigLinuxArm64Extra.klib.dump | 2 +- .../examples/classes/AnotherBuildConfigModified.klib.dump | 4 ++-- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.clash.dump b/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.clash.dump index 78f09cea..ce0a113b 100644 --- a/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.clash.dump +++ b/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.clash.dump @@ -9,9 +9,9 @@ // Library unique name: final class org.different.pack/BuildConfig { // org.different.pack/BuildConfig|null[0] constructor () // org.different.pack/BuildConfig.|(){}[0] - final fun f1(): kotlin/Int // org.different.pack/BuildConfig.f1|f1(){}[0] final val p1 // org.different.pack/BuildConfig.p1|{}p1[0] final fun (): kotlin/Int // org.different.pack/BuildConfig.p1.|(){}[0] + final fun f1(): kotlin/Int // org.different.pack/BuildConfig.f1|f1(){}[0] } // Targets: [linux] final fun (org.different.pack/BuildConfig).org.different.pack/linuxArm64Specific(): kotlin/Int // org.different.pack/linuxArm64Specific|linuxArm64Specific@org.different.pack.BuildConfig(){}[0] diff --git a/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.custom.dump b/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.custom.dump index 1adbdac8..59a51635 100644 --- a/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.custom.dump +++ b/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.custom.dump @@ -8,7 +8,7 @@ // Library unique name: final class org.different.pack/BuildConfig { // org.different.pack/BuildConfig|null[0] constructor () // org.different.pack/BuildConfig.|(){}[0] - final fun f1(): kotlin/Int // org.different.pack/BuildConfig.f1|f1(){}[0] final val p1 // org.different.pack/BuildConfig.p1|{}p1[0] final fun (): kotlin/Int // org.different.pack/BuildConfig.p1.|(){}[0] + final fun f1(): kotlin/Int // org.different.pack/BuildConfig.f1|f1(){}[0] } diff --git a/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.dump b/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.dump index 9511bef9..5410116e 100644 --- a/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.dump +++ b/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.dump @@ -8,7 +8,7 @@ // Library unique name: final class org.different.pack/BuildConfig { // org.different.pack/BuildConfig|null[0] constructor () // org.different.pack/BuildConfig.|(){}[0] - final fun f1(): kotlin/Int // org.different.pack/BuildConfig.f1|f1(){}[0] final val p1 // org.different.pack/BuildConfig.p1|{}p1[0] final fun (): kotlin/Int // org.different.pack/BuildConfig.p1.|(){}[0] + final fun f1(): kotlin/Int // org.different.pack/BuildConfig.f1|f1(){}[0] } diff --git a/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.linuxX64Only.dump b/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.linuxX64Only.dump index 7c6117d7..0105c1b9 100644 --- a/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.linuxX64Only.dump +++ b/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.linuxX64Only.dump @@ -8,7 +8,7 @@ // Library unique name: final class org.different.pack/BuildConfig { // org.different.pack/BuildConfig|null[0] constructor () // org.different.pack/BuildConfig.|(){}[0] - final fun f1(): kotlin/Int // org.different.pack/BuildConfig.f1|f1(){}[0] final val p1 // org.different.pack/BuildConfig.p1|{}p1[0] final fun (): kotlin/Int // org.different.pack/BuildConfig.p1.|(){}[0] + final fun f1(): kotlin/Int // org.different.pack/BuildConfig.f1|f1(){}[0] } diff --git a/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.web.dump b/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.web.dump index bebc349d..d3c64a98 100644 --- a/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.web.dump +++ b/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.web.dump @@ -8,7 +8,7 @@ // Library unique name: final class org.different.pack/BuildConfig { // org.different.pack/BuildConfig|null[0] constructor () // org.different.pack/BuildConfig.|(){}[0] - final fun f1(): kotlin/Int // org.different.pack/BuildConfig.f1|f1(){}[0] final val p1 // org.different.pack/BuildConfig.p1|{}p1[0] final fun (): kotlin/Int // org.different.pack/BuildConfig.p1.|(){}[0] + final fun f1(): kotlin/Int // org.different.pack/BuildConfig.f1|f1(){}[0] } diff --git a/src/functionalTest/resources/examples/classes/AnotherBuildConfigLinux.klib.grouping.dump b/src/functionalTest/resources/examples/classes/AnotherBuildConfigLinux.klib.grouping.dump index f67ac443..987ffa33 100644 --- a/src/functionalTest/resources/examples/classes/AnotherBuildConfigLinux.klib.grouping.dump +++ b/src/functionalTest/resources/examples/classes/AnotherBuildConfigLinux.klib.grouping.dump @@ -9,9 +9,9 @@ // Library unique name: final class org.different.pack/BuildConfig { // org.different.pack/BuildConfig|null[0] constructor () // org.different.pack/BuildConfig.|(){}[0] - final fun f1(): kotlin/Int // org.different.pack/BuildConfig.f1|f1(){}[0] final val p1 // org.different.pack/BuildConfig.p1|{}p1[0] final fun (): kotlin/Int // org.different.pack/BuildConfig.p1.|(){}[0] + final fun f1(): kotlin/Int // org.different.pack/BuildConfig.f1|f1(){}[0] } // Targets: [linux] final fun (org.different.pack/BuildConfig).org.different.pack/linuxArm64Specific(): kotlin/Int // org.different.pack/linuxArm64Specific|linuxArm64Specific@org.different.pack.BuildConfig(){}[0] diff --git a/src/functionalTest/resources/examples/classes/AnotherBuildConfigLinuxArm64Extra.klib.dump b/src/functionalTest/resources/examples/classes/AnotherBuildConfigLinuxArm64Extra.klib.dump index 20292d7e..6a15bd92 100644 --- a/src/functionalTest/resources/examples/classes/AnotherBuildConfigLinuxArm64Extra.klib.dump +++ b/src/functionalTest/resources/examples/classes/AnotherBuildConfigLinuxArm64Extra.klib.dump @@ -8,9 +8,9 @@ // Library unique name: final class org.different.pack/BuildConfig { // org.different.pack/BuildConfig|null[0] constructor () // org.different.pack/BuildConfig.|(){}[0] - final fun f1(): kotlin/Int // org.different.pack/BuildConfig.f1|f1(){}[0] final val p1 // org.different.pack/BuildConfig.p1|{}p1[0] final fun (): kotlin/Int // org.different.pack/BuildConfig.p1.|(){}[0] + final fun f1(): kotlin/Int // org.different.pack/BuildConfig.f1|f1(){}[0] } // Targets: [linuxArm64] final fun (org.different.pack/BuildConfig).org.different.pack/linuxArm64Specific(): kotlin/Int // org.different.pack/linuxArm64Specific|linuxArm64Specific@org.different.pack.BuildConfig(){}[0] diff --git a/src/functionalTest/resources/examples/classes/AnotherBuildConfigModified.klib.dump b/src/functionalTest/resources/examples/classes/AnotherBuildConfigModified.klib.dump index 75eb66b2..a4d9ebc4 100644 --- a/src/functionalTest/resources/examples/classes/AnotherBuildConfigModified.klib.dump +++ b/src/functionalTest/resources/examples/classes/AnotherBuildConfigModified.klib.dump @@ -8,8 +8,8 @@ // Library unique name: final class org.different.pack/BuildConfig { // org.different.pack/BuildConfig|null[0] constructor () // org.different.pack/BuildConfig.|(){}[0] - final fun f1(): kotlin/Int // org.different.pack/BuildConfig.f1|f1(){}[0] - final fun f2(): kotlin/Int // org.different.pack/BuildConfig.f2|f2(){}[0] final val p1 // org.different.pack/BuildConfig.p1|{}p1[0] final fun (): kotlin/Int // org.different.pack/BuildConfig.p1.|(){}[0] + final fun f1(): kotlin/Int // org.different.pack/BuildConfig.f1|f1(){}[0] + final fun f2(): kotlin/Int // org.different.pack/BuildConfig.f2|f2(){}[0] } From 41770ebd8d887bee9a97abe02b3a269e7ff0b290 Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Mon, 27 May 2024 10:22:20 +0200 Subject: [PATCH 5/6] Updated top-level decls test data --- .../TopLevelDeclarations.klib.all.dump | 116 +++++++++--------- .../classes/TopLevelDeclarations.klib.dump | 116 +++++++++--------- .../TopLevelDeclarations.klib.unsup.dump | 116 +++++++++--------- .../classes/TopLevelDeclarations.klib.v1.dump | 116 +++++++++--------- ...lDeclarations.klib.with.guessed.linux.dump | 116 +++++++++--------- .../TopLevelDeclarations.klib.with.linux.dump | 116 +++++++++--------- 6 files changed, 348 insertions(+), 348 deletions(-) diff --git a/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.all.dump b/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.all.dump index 05aa3cd6..afe408a1 100644 --- a/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.all.dump +++ b/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.all.dump @@ -6,31 +6,58 @@ // - Show declarations: true // Library unique name: -abstract class examples.classes/AC { // examples.classes/AC|null[0] - abstract fun a() // examples.classes/AC.a|a(){}[0] - constructor () // examples.classes/AC.|(){}[0] - final fun b() // examples.classes/AC.b|b(){}[0] +open annotation class examples.classes/A : kotlin/Annotation { // examples.classes/A|null[0] + constructor () // examples.classes/A.|(){}[0] +} +open annotation class examples.classes/AA : kotlin/Annotation { // examples.classes/AA|null[0] + constructor () // examples.classes/AA.|(){}[0] +} +open annotation class examples.classes/AAA : kotlin/Annotation { // examples.classes/AAA|null[0] + constructor () // examples.classes/AAA.|(){}[0] +} +final enum class examples.classes/E : kotlin/Enum { // examples.classes/E|null[0] + enum entry A // examples.classes/E.A|null[0] + enum entry B // examples.classes/E.B|null[0] + enum entry C // examples.classes/E.C|null[0] + final val entries // examples.classes/E.entries|#static{}entries[0] + final fun (): kotlin.enums/EnumEntries // examples.classes/E.entries.|#static(){}[0] + final fun valueOf(kotlin/String): examples.classes/E // examples.classes/E.valueOf|valueOf#static(kotlin.String){}[0] + final fun values(): kotlin/Array // examples.classes/E.values|values#static(){}[0] +} +final enum class examples.classes/EE : kotlin/Enum { // examples.classes/EE|null[0] + enum entry AA // examples.classes/EE.AA|null[0] + enum entry BB // examples.classes/EE.BB|null[0] + enum entry CC // examples.classes/EE.CC|null[0] + final val entries // examples.classes/EE.entries|#static{}entries[0] + final fun (): kotlin.enums/EnumEntries // examples.classes/EE.entries.|#static(){}[0] + final fun valueOf(kotlin/String): examples.classes/EE // examples.classes/EE.valueOf|valueOf#static(kotlin.String){}[0] + final fun values(): kotlin/Array // examples.classes/EE.values|values#static(){}[0] } abstract fun interface examples.classes/FI { // examples.classes/FI|null[0] abstract fun a() // examples.classes/FI.a|a(){}[0] } abstract interface examples.classes/I // examples.classes/I|null[0] abstract interface examples.classes/II // examples.classes/II|null[0] +abstract class examples.classes/AC { // examples.classes/AC|null[0] + constructor () // examples.classes/AC.|(){}[0] + abstract fun a() // examples.classes/AC.a|a(){}[0] + final fun b() // examples.classes/AC.b|b(){}[0] +} final class examples.classes/C { // examples.classes/C|null[0] constructor (kotlin/Any) // examples.classes/C.|(kotlin.Any){}[0] - final fun m() // examples.classes/C.m|m(){}[0] final val v // examples.classes/C.v|{}v[0] final fun (): kotlin/Any // examples.classes/C.v.|(){}[0] + final fun m() // examples.classes/C.m|m(){}[0] } final class examples.classes/D { // examples.classes/D|null[0] constructor (kotlin/Int) // examples.classes/D.|(kotlin.Int){}[0] + final val x // examples.classes/D.x|{}x[0] + final fun (): kotlin/Int // examples.classes/D.x.|(){}[0] final fun component1(): kotlin/Int // examples.classes/D.component1|component1(){}[0] final fun copy(kotlin/Int =...): examples.classes/D // examples.classes/D.copy|copy(kotlin.Int){}[0] final fun equals(kotlin/Any?): kotlin/Boolean // examples.classes/D.equals|equals(kotlin.Any?){}[0] final fun hashCode(): kotlin/Int // examples.classes/D.hashCode|hashCode(){}[0] final fun toString(): kotlin/String // examples.classes/D.toString|toString(){}[0] - final val x // examples.classes/D.x|{}x[0] - final fun (): kotlin/Int // examples.classes/D.x.|(){}[0] } final class examples.classes/IC : examples.classes/II { // examples.classes/IC|null[0] constructor () // examples.classes/IC.|(){}[0] @@ -43,10 +70,10 @@ final class examples.classes/Outer { // examples.classes/Outer|null[0] enum entry A // examples.classes/Outer.Nested.NE.A|null[0] enum entry B // examples.classes/Outer.Nested.NE.B|null[0] enum entry C // examples.classes/Outer.Nested.NE.C|null[0] - final fun valueOf(kotlin/String): examples.classes/Outer.Nested.NE // examples.classes/Outer.Nested.NE.valueOf|valueOf#static(kotlin.String){}[0] - final fun values(): kotlin/Array // examples.classes/Outer.Nested.NE.values|values#static(){}[0] final val entries // examples.classes/Outer.Nested.NE.entries|#static{}entries[0] final fun (): kotlin.enums/EnumEntries // examples.classes/Outer.Nested.NE.entries.|#static(){}[0] + final fun valueOf(kotlin/String): examples.classes/Outer.Nested.NE // examples.classes/Outer.Nested.NE.valueOf|valueOf#static(kotlin.String){}[0] + final fun values(): kotlin/Array // examples.classes/Outer.Nested.NE.values|values#static(){}[0] } final inner class Inner { // examples.classes/Outer.Nested.Inner|null[0] constructor () // examples.classes/Outer.Nested.Inner.|(){}[0] @@ -56,59 +83,10 @@ final class examples.classes/Outer { // examples.classes/Outer|null[0] } } } -final const val examples.classes/con // examples.classes/con|{}con[0] - final fun (): kotlin/String // examples.classes/con.|(){}[0] -final const val examples.classes/intCon // examples.classes/intCon|{}intCon[0] - final fun (): kotlin/Int // examples.classes/intCon.|(){}[0] -final enum class examples.classes/E : kotlin/Enum { // examples.classes/E|null[0] - enum entry A // examples.classes/E.A|null[0] - enum entry B // examples.classes/E.B|null[0] - enum entry C // examples.classes/E.C|null[0] - final fun valueOf(kotlin/String): examples.classes/E // examples.classes/E.valueOf|valueOf#static(kotlin.String){}[0] - final fun values(): kotlin/Array // examples.classes/E.values|values#static(){}[0] - final val entries // examples.classes/E.entries|#static{}entries[0] - final fun (): kotlin.enums/EnumEntries // examples.classes/E.entries.|#static(){}[0] -} -final enum class examples.classes/EE : kotlin/Enum { // examples.classes/EE|null[0] - enum entry AA // examples.classes/EE.AA|null[0] - enum entry BB // examples.classes/EE.BB|null[0] - enum entry CC // examples.classes/EE.CC|null[0] - final fun valueOf(kotlin/String): examples.classes/EE // examples.classes/EE.valueOf|valueOf#static(kotlin.String){}[0] - final fun values(): kotlin/Array // examples.classes/EE.values|values#static(){}[0] - final val entries // examples.classes/EE.entries|#static{}entries[0] - final fun (): kotlin.enums/EnumEntries // examples.classes/EE.entries.|#static(){}[0] -} -final fun <#A: kotlin/Any?> examples.classes/consume(#A) // examples.classes/consume|consume(0:0){0§}[0] -final fun examples.classes/testFun(): kotlin/Int // examples.classes/testFun|testFun(){}[0] -final inline fun examples.classes/testInlineFun() // examples.classes/testInlineFun|testInlineFun(){}[0] -final object examples.classes/O // examples.classes/O|null[0] -final object examples.classes/OO // examples.classes/OO|null[0] -final val examples.classes/a // examples.classes/a|{}a[0] - final fun (): kotlin/Any // examples.classes/a.|(){}[0] -final val examples.classes/i // examples.classes/i|{}i[0] - final fun (): kotlin/Int // examples.classes/i.|(){}[0] -final val examples.classes/l // examples.classes/l|{}l[0] - final fun (): kotlin/Long // examples.classes/l.|(){}[0] -final var examples.classes/d // examples.classes/d|{}d[0] - final fun (): kotlin/Double // examples.classes/d.|(){}[0] - final fun (kotlin/Double) // examples.classes/d.|(kotlin.Double){}[0] -final var examples.classes/r // examples.classes/r|{}r[0] - final fun (): kotlin/Float // examples.classes/r.|(){}[0] - final fun (kotlin/Float) // examples.classes/r.|(kotlin.Float){}[0] -open annotation class examples.classes/A : kotlin/Annotation { // examples.classes/A|null[0] - constructor () // examples.classes/A.|(){}[0] -} -open annotation class examples.classes/AA : kotlin/Annotation { // examples.classes/AA|null[0] - constructor () // examples.classes/AA.|(){}[0] -} -open annotation class examples.classes/AAA : kotlin/Annotation { // examples.classes/AAA|null[0] - constructor () // examples.classes/AAA.|(){}[0] -} open class examples.classes/OC { // examples.classes/OC|null[0] constructor (kotlin/Int) // examples.classes/OC.|(kotlin.Int){}[0] constructor (kotlin/Long) // examples.classes/OC.|(kotlin.Long){}[0] constructor (kotlin/String) // examples.classes/OC.|(kotlin.String){}[0] - final fun c() // examples.classes/OC.c|c(){}[0] final val ix // examples.classes/OC.ix|{}ix[0] final fun (): kotlin/Int // examples.classes/OC.ix.|(){}[0] final val iy // examples.classes/OC.iy|{}iy[0] @@ -124,5 +102,27 @@ open class examples.classes/OC { // examples.classes/OC|null[0] final var z // examples.classes/OC.z|{}z[0] final fun (): kotlin/Int // examples.classes/OC.z.|(){}[0] final fun (kotlin/Int) // examples.classes/OC.z.|(kotlin.Int){}[0] + final fun c() // examples.classes/OC.c|c(){}[0] open fun o(): kotlin/Int // examples.classes/OC.o|o(){}[0] } +final object examples.classes/O // examples.classes/O|null[0] +final object examples.classes/OO // examples.classes/OO|null[0] +final const val examples.classes/con // examples.classes/con|{}con[0] + final fun (): kotlin/String // examples.classes/con.|(){}[0] +final const val examples.classes/intCon // examples.classes/intCon|{}intCon[0] + final fun (): kotlin/Int // examples.classes/intCon.|(){}[0] +final val examples.classes/a // examples.classes/a|{}a[0] + final fun (): kotlin/Any // examples.classes/a.|(){}[0] +final val examples.classes/i // examples.classes/i|{}i[0] + final fun (): kotlin/Int // examples.classes/i.|(){}[0] +final val examples.classes/l // examples.classes/l|{}l[0] + final fun (): kotlin/Long // examples.classes/l.|(){}[0] +final var examples.classes/d // examples.classes/d|{}d[0] + final fun (): kotlin/Double // examples.classes/d.|(){}[0] + final fun (kotlin/Double) // examples.classes/d.|(kotlin.Double){}[0] +final var examples.classes/r // examples.classes/r|{}r[0] + final fun (): kotlin/Float // examples.classes/r.|(){}[0] + final fun (kotlin/Float) // examples.classes/r.|(kotlin.Float){}[0] +final fun <#A: kotlin/Any?> examples.classes/consume(#A) // examples.classes/consume|consume(0:0){0§}[0] +final fun examples.classes/testFun(): kotlin/Int // examples.classes/testFun|testFun(){}[0] +final inline fun examples.classes/testInlineFun() // examples.classes/testInlineFun|testInlineFun(){}[0] diff --git a/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.dump b/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.dump index fdc5d282..39dcdc04 100644 --- a/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.dump +++ b/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.dump @@ -6,31 +6,58 @@ // - Show declarations: true // Library unique name: -abstract class examples.classes/AC { // examples.classes/AC|null[0] - abstract fun a() // examples.classes/AC.a|a(){}[0] - constructor () // examples.classes/AC.|(){}[0] - final fun b() // examples.classes/AC.b|b(){}[0] +open annotation class examples.classes/A : kotlin/Annotation { // examples.classes/A|null[0] + constructor () // examples.classes/A.|(){}[0] +} +open annotation class examples.classes/AA : kotlin/Annotation { // examples.classes/AA|null[0] + constructor () // examples.classes/AA.|(){}[0] +} +open annotation class examples.classes/AAA : kotlin/Annotation { // examples.classes/AAA|null[0] + constructor () // examples.classes/AAA.|(){}[0] +} +final enum class examples.classes/E : kotlin/Enum { // examples.classes/E|null[0] + enum entry A // examples.classes/E.A|null[0] + enum entry B // examples.classes/E.B|null[0] + enum entry C // examples.classes/E.C|null[0] + final val entries // examples.classes/E.entries|#static{}entries[0] + final fun (): kotlin.enums/EnumEntries // examples.classes/E.entries.|#static(){}[0] + final fun valueOf(kotlin/String): examples.classes/E // examples.classes/E.valueOf|valueOf#static(kotlin.String){}[0] + final fun values(): kotlin/Array // examples.classes/E.values|values#static(){}[0] +} +final enum class examples.classes/EE : kotlin/Enum { // examples.classes/EE|null[0] + enum entry AA // examples.classes/EE.AA|null[0] + enum entry BB // examples.classes/EE.BB|null[0] + enum entry CC // examples.classes/EE.CC|null[0] + final val entries // examples.classes/EE.entries|#static{}entries[0] + final fun (): kotlin.enums/EnumEntries // examples.classes/EE.entries.|#static(){}[0] + final fun valueOf(kotlin/String): examples.classes/EE // examples.classes/EE.valueOf|valueOf#static(kotlin.String){}[0] + final fun values(): kotlin/Array // examples.classes/EE.values|values#static(){}[0] } abstract fun interface examples.classes/FI { // examples.classes/FI|null[0] abstract fun a() // examples.classes/FI.a|a(){}[0] } abstract interface examples.classes/I // examples.classes/I|null[0] abstract interface examples.classes/II // examples.classes/II|null[0] +abstract class examples.classes/AC { // examples.classes/AC|null[0] + constructor () // examples.classes/AC.|(){}[0] + abstract fun a() // examples.classes/AC.a|a(){}[0] + final fun b() // examples.classes/AC.b|b(){}[0] +} final class examples.classes/C { // examples.classes/C|null[0] constructor (kotlin/Any) // examples.classes/C.|(kotlin.Any){}[0] - final fun m() // examples.classes/C.m|m(){}[0] final val v // examples.classes/C.v|{}v[0] final fun (): kotlin/Any // examples.classes/C.v.|(){}[0] + final fun m() // examples.classes/C.m|m(){}[0] } final class examples.classes/D { // examples.classes/D|null[0] constructor (kotlin/Int) // examples.classes/D.|(kotlin.Int){}[0] + final val x // examples.classes/D.x|{}x[0] + final fun (): kotlin/Int // examples.classes/D.x.|(){}[0] final fun component1(): kotlin/Int // examples.classes/D.component1|component1(){}[0] final fun copy(kotlin/Int =...): examples.classes/D // examples.classes/D.copy|copy(kotlin.Int){}[0] final fun equals(kotlin/Any?): kotlin/Boolean // examples.classes/D.equals|equals(kotlin.Any?){}[0] final fun hashCode(): kotlin/Int // examples.classes/D.hashCode|hashCode(){}[0] final fun toString(): kotlin/String // examples.classes/D.toString|toString(){}[0] - final val x // examples.classes/D.x|{}x[0] - final fun (): kotlin/Int // examples.classes/D.x.|(){}[0] } final class examples.classes/IC : examples.classes/II { // examples.classes/IC|null[0] constructor () // examples.classes/IC.|(){}[0] @@ -43,10 +70,10 @@ final class examples.classes/Outer { // examples.classes/Outer|null[0] enum entry A // examples.classes/Outer.Nested.NE.A|null[0] enum entry B // examples.classes/Outer.Nested.NE.B|null[0] enum entry C // examples.classes/Outer.Nested.NE.C|null[0] - final fun valueOf(kotlin/String): examples.classes/Outer.Nested.NE // examples.classes/Outer.Nested.NE.valueOf|valueOf#static(kotlin.String){}[0] - final fun values(): kotlin/Array // examples.classes/Outer.Nested.NE.values|values#static(){}[0] final val entries // examples.classes/Outer.Nested.NE.entries|#static{}entries[0] final fun (): kotlin.enums/EnumEntries // examples.classes/Outer.Nested.NE.entries.|#static(){}[0] + final fun valueOf(kotlin/String): examples.classes/Outer.Nested.NE // examples.classes/Outer.Nested.NE.valueOf|valueOf#static(kotlin.String){}[0] + final fun values(): kotlin/Array // examples.classes/Outer.Nested.NE.values|values#static(){}[0] } final inner class Inner { // examples.classes/Outer.Nested.Inner|null[0] constructor () // examples.classes/Outer.Nested.Inner.|(){}[0] @@ -56,59 +83,10 @@ final class examples.classes/Outer { // examples.classes/Outer|null[0] } } } -final const val examples.classes/con // examples.classes/con|{}con[0] - final fun (): kotlin/String // examples.classes/con.|(){}[0] -final const val examples.classes/intCon // examples.classes/intCon|{}intCon[0] - final fun (): kotlin/Int // examples.classes/intCon.|(){}[0] -final enum class examples.classes/E : kotlin/Enum { // examples.classes/E|null[0] - enum entry A // examples.classes/E.A|null[0] - enum entry B // examples.classes/E.B|null[0] - enum entry C // examples.classes/E.C|null[0] - final fun valueOf(kotlin/String): examples.classes/E // examples.classes/E.valueOf|valueOf#static(kotlin.String){}[0] - final fun values(): kotlin/Array // examples.classes/E.values|values#static(){}[0] - final val entries // examples.classes/E.entries|#static{}entries[0] - final fun (): kotlin.enums/EnumEntries // examples.classes/E.entries.|#static(){}[0] -} -final enum class examples.classes/EE : kotlin/Enum { // examples.classes/EE|null[0] - enum entry AA // examples.classes/EE.AA|null[0] - enum entry BB // examples.classes/EE.BB|null[0] - enum entry CC // examples.classes/EE.CC|null[0] - final fun valueOf(kotlin/String): examples.classes/EE // examples.classes/EE.valueOf|valueOf#static(kotlin.String){}[0] - final fun values(): kotlin/Array // examples.classes/EE.values|values#static(){}[0] - final val entries // examples.classes/EE.entries|#static{}entries[0] - final fun (): kotlin.enums/EnumEntries // examples.classes/EE.entries.|#static(){}[0] -} -final fun <#A: kotlin/Any?> examples.classes/consume(#A) // examples.classes/consume|consume(0:0){0§}[0] -final fun examples.classes/testFun(): kotlin/Int // examples.classes/testFun|testFun(){}[0] -final inline fun examples.classes/testInlineFun() // examples.classes/testInlineFun|testInlineFun(){}[0] -final object examples.classes/O // examples.classes/O|null[0] -final object examples.classes/OO // examples.classes/OO|null[0] -final val examples.classes/a // examples.classes/a|{}a[0] - final fun (): kotlin/Any // examples.classes/a.|(){}[0] -final val examples.classes/i // examples.classes/i|{}i[0] - final fun (): kotlin/Int // examples.classes/i.|(){}[0] -final val examples.classes/l // examples.classes/l|{}l[0] - final fun (): kotlin/Long // examples.classes/l.|(){}[0] -final var examples.classes/d // examples.classes/d|{}d[0] - final fun (): kotlin/Double // examples.classes/d.|(){}[0] - final fun (kotlin/Double) // examples.classes/d.|(kotlin.Double){}[0] -final var examples.classes/r // examples.classes/r|{}r[0] - final fun (): kotlin/Float // examples.classes/r.|(){}[0] - final fun (kotlin/Float) // examples.classes/r.|(kotlin.Float){}[0] -open annotation class examples.classes/A : kotlin/Annotation { // examples.classes/A|null[0] - constructor () // examples.classes/A.|(){}[0] -} -open annotation class examples.classes/AA : kotlin/Annotation { // examples.classes/AA|null[0] - constructor () // examples.classes/AA.|(){}[0] -} -open annotation class examples.classes/AAA : kotlin/Annotation { // examples.classes/AAA|null[0] - constructor () // examples.classes/AAA.|(){}[0] -} open class examples.classes/OC { // examples.classes/OC|null[0] constructor (kotlin/Int) // examples.classes/OC.|(kotlin.Int){}[0] constructor (kotlin/Long) // examples.classes/OC.|(kotlin.Long){}[0] constructor (kotlin/String) // examples.classes/OC.|(kotlin.String){}[0] - final fun c() // examples.classes/OC.c|c(){}[0] final val ix // examples.classes/OC.ix|{}ix[0] final fun (): kotlin/Int // examples.classes/OC.ix.|(){}[0] final val iy // examples.classes/OC.iy|{}iy[0] @@ -124,5 +102,27 @@ open class examples.classes/OC { // examples.classes/OC|null[0] final var z // examples.classes/OC.z|{}z[0] final fun (): kotlin/Int // examples.classes/OC.z.|(){}[0] final fun (kotlin/Int) // examples.classes/OC.z.|(kotlin.Int){}[0] + final fun c() // examples.classes/OC.c|c(){}[0] open fun o(): kotlin/Int // examples.classes/OC.o|o(){}[0] } +final object examples.classes/O // examples.classes/O|null[0] +final object examples.classes/OO // examples.classes/OO|null[0] +final const val examples.classes/con // examples.classes/con|{}con[0] + final fun (): kotlin/String // examples.classes/con.|(){}[0] +final const val examples.classes/intCon // examples.classes/intCon|{}intCon[0] + final fun (): kotlin/Int // examples.classes/intCon.|(){}[0] +final val examples.classes/a // examples.classes/a|{}a[0] + final fun (): kotlin/Any // examples.classes/a.|(){}[0] +final val examples.classes/i // examples.classes/i|{}i[0] + final fun (): kotlin/Int // examples.classes/i.|(){}[0] +final val examples.classes/l // examples.classes/l|{}l[0] + final fun (): kotlin/Long // examples.classes/l.|(){}[0] +final var examples.classes/d // examples.classes/d|{}d[0] + final fun (): kotlin/Double // examples.classes/d.|(){}[0] + final fun (kotlin/Double) // examples.classes/d.|(kotlin.Double){}[0] +final var examples.classes/r // examples.classes/r|{}r[0] + final fun (): kotlin/Float // examples.classes/r.|(){}[0] + final fun (kotlin/Float) // examples.classes/r.|(kotlin.Float){}[0] +final fun <#A: kotlin/Any?> examples.classes/consume(#A) // examples.classes/consume|consume(0:0){0§}[0] +final fun examples.classes/testFun(): kotlin/Int // examples.classes/testFun|testFun(){}[0] +final inline fun examples.classes/testInlineFun() // examples.classes/testInlineFun|testInlineFun(){}[0] diff --git a/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.unsup.dump b/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.unsup.dump index f40c1eff..24e2e99e 100644 --- a/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.unsup.dump +++ b/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.unsup.dump @@ -6,31 +6,58 @@ // - Show declarations: true // Library unique name: -abstract class examples.classes/AC { // examples.classes/AC|null[0] - abstract fun a() // examples.classes/AC.a|a(){}[0] - constructor () // examples.classes/AC.|(){}[0] - final fun b() // examples.classes/AC.b|b(){}[0] +open annotation class examples.classes/A : kotlin/Annotation { // examples.classes/A|null[0] + constructor () // examples.classes/A.|(){}[0] +} +open annotation class examples.classes/AA : kotlin/Annotation { // examples.classes/AA|null[0] + constructor () // examples.classes/AA.|(){}[0] +} +open annotation class examples.classes/AAA : kotlin/Annotation { // examples.classes/AAA|null[0] + constructor () // examples.classes/AAA.|(){}[0] +} +final enum class examples.classes/E : kotlin/Enum { // examples.classes/E|null[0] + enum entry A // examples.classes/E.A|null[0] + enum entry B // examples.classes/E.B|null[0] + enum entry C // examples.classes/E.C|null[0] + final val entries // examples.classes/E.entries|#static{}entries[0] + final fun (): kotlin.enums/EnumEntries // examples.classes/E.entries.|#static(){}[0] + final fun valueOf(kotlin/String): examples.classes/E // examples.classes/E.valueOf|valueOf#static(kotlin.String){}[0] + final fun values(): kotlin/Array // examples.classes/E.values|values#static(){}[0] +} +final enum class examples.classes/EE : kotlin/Enum { // examples.classes/EE|null[0] + enum entry AA // examples.classes/EE.AA|null[0] + enum entry BB // examples.classes/EE.BB|null[0] + enum entry CC // examples.classes/EE.CC|null[0] + final val entries // examples.classes/EE.entries|#static{}entries[0] + final fun (): kotlin.enums/EnumEntries // examples.classes/EE.entries.|#static(){}[0] + final fun valueOf(kotlin/String): examples.classes/EE // examples.classes/EE.valueOf|valueOf#static(kotlin.String){}[0] + final fun values(): kotlin/Array // examples.classes/EE.values|values#static(){}[0] } abstract fun interface examples.classes/FI { // examples.classes/FI|null[0] abstract fun a() // examples.classes/FI.a|a(){}[0] } abstract interface examples.classes/I // examples.classes/I|null[0] abstract interface examples.classes/II // examples.classes/II|null[0] +abstract class examples.classes/AC { // examples.classes/AC|null[0] + constructor () // examples.classes/AC.|(){}[0] + abstract fun a() // examples.classes/AC.a|a(){}[0] + final fun b() // examples.classes/AC.b|b(){}[0] +} final class examples.classes/C { // examples.classes/C|null[0] constructor (kotlin/Any) // examples.classes/C.|(kotlin.Any){}[0] - final fun m() // examples.classes/C.m|m(){}[0] final val v // examples.classes/C.v|{}v[0] final fun (): kotlin/Any // examples.classes/C.v.|(){}[0] + final fun m() // examples.classes/C.m|m(){}[0] } final class examples.classes/D { // examples.classes/D|null[0] constructor (kotlin/Int) // examples.classes/D.|(kotlin.Int){}[0] + final val x // examples.classes/D.x|{}x[0] + final fun (): kotlin/Int // examples.classes/D.x.|(){}[0] final fun component1(): kotlin/Int // examples.classes/D.component1|component1(){}[0] final fun copy(kotlin/Int =...): examples.classes/D // examples.classes/D.copy|copy(kotlin.Int){}[0] final fun equals(kotlin/Any?): kotlin/Boolean // examples.classes/D.equals|equals(kotlin.Any?){}[0] final fun hashCode(): kotlin/Int // examples.classes/D.hashCode|hashCode(){}[0] final fun toString(): kotlin/String // examples.classes/D.toString|toString(){}[0] - final val x // examples.classes/D.x|{}x[0] - final fun (): kotlin/Int // examples.classes/D.x.|(){}[0] } final class examples.classes/IC : examples.classes/II { // examples.classes/IC|null[0] constructor () // examples.classes/IC.|(){}[0] @@ -43,10 +70,10 @@ final class examples.classes/Outer { // examples.classes/Outer|null[0] enum entry A // examples.classes/Outer.Nested.NE.A|null[0] enum entry B // examples.classes/Outer.Nested.NE.B|null[0] enum entry C // examples.classes/Outer.Nested.NE.C|null[0] - final fun valueOf(kotlin/String): examples.classes/Outer.Nested.NE // examples.classes/Outer.Nested.NE.valueOf|valueOf#static(kotlin.String){}[0] - final fun values(): kotlin/Array // examples.classes/Outer.Nested.NE.values|values#static(){}[0] final val entries // examples.classes/Outer.Nested.NE.entries|#static{}entries[0] final fun (): kotlin.enums/EnumEntries // examples.classes/Outer.Nested.NE.entries.|#static(){}[0] + final fun valueOf(kotlin/String): examples.classes/Outer.Nested.NE // examples.classes/Outer.Nested.NE.valueOf|valueOf#static(kotlin.String){}[0] + final fun values(): kotlin/Array // examples.classes/Outer.Nested.NE.values|values#static(){}[0] } final inner class Inner { // examples.classes/Outer.Nested.Inner|null[0] constructor () // examples.classes/Outer.Nested.Inner.|(){}[0] @@ -56,59 +83,10 @@ final class examples.classes/Outer { // examples.classes/Outer|null[0] } } } -final const val examples.classes/con // examples.classes/con|{}con[0] - final fun (): kotlin/String // examples.classes/con.|(){}[0] -final const val examples.classes/intCon // examples.classes/intCon|{}intCon[0] - final fun (): kotlin/Int // examples.classes/intCon.|(){}[0] -final enum class examples.classes/E : kotlin/Enum { // examples.classes/E|null[0] - enum entry A // examples.classes/E.A|null[0] - enum entry B // examples.classes/E.B|null[0] - enum entry C // examples.classes/E.C|null[0] - final fun valueOf(kotlin/String): examples.classes/E // examples.classes/E.valueOf|valueOf#static(kotlin.String){}[0] - final fun values(): kotlin/Array // examples.classes/E.values|values#static(){}[0] - final val entries // examples.classes/E.entries|#static{}entries[0] - final fun (): kotlin.enums/EnumEntries // examples.classes/E.entries.|#static(){}[0] -} -final enum class examples.classes/EE : kotlin/Enum { // examples.classes/EE|null[0] - enum entry AA // examples.classes/EE.AA|null[0] - enum entry BB // examples.classes/EE.BB|null[0] - enum entry CC // examples.classes/EE.CC|null[0] - final fun valueOf(kotlin/String): examples.classes/EE // examples.classes/EE.valueOf|valueOf#static(kotlin.String){}[0] - final fun values(): kotlin/Array // examples.classes/EE.values|values#static(){}[0] - final val entries // examples.classes/EE.entries|#static{}entries[0] - final fun (): kotlin.enums/EnumEntries // examples.classes/EE.entries.|#static(){}[0] -} -final fun <#A: kotlin/Any?> examples.classes/consume(#A) // examples.classes/consume|consume(0:0){0§}[0] -final fun examples.classes/testFun(): kotlin/Int // examples.classes/testFun|testFun(){}[0] -final inline fun examples.classes/testInlineFun() // examples.classes/testInlineFun|testInlineFun(){}[0] -final object examples.classes/O // examples.classes/O|null[0] -final object examples.classes/OO // examples.classes/OO|null[0] -final val examples.classes/a // examples.classes/a|{}a[0] - final fun (): kotlin/Any // examples.classes/a.|(){}[0] -final val examples.classes/i // examples.classes/i|{}i[0] - final fun (): kotlin/Int // examples.classes/i.|(){}[0] -final val examples.classes/l // examples.classes/l|{}l[0] - final fun (): kotlin/Long // examples.classes/l.|(){}[0] -final var examples.classes/d // examples.classes/d|{}d[0] - final fun (): kotlin/Double // examples.classes/d.|(){}[0] - final fun (kotlin/Double) // examples.classes/d.|(kotlin.Double){}[0] -final var examples.classes/r // examples.classes/r|{}r[0] - final fun (): kotlin/Float // examples.classes/r.|(){}[0] - final fun (kotlin/Float) // examples.classes/r.|(kotlin.Float){}[0] -open annotation class examples.classes/A : kotlin/Annotation { // examples.classes/A|null[0] - constructor () // examples.classes/A.|(){}[0] -} -open annotation class examples.classes/AA : kotlin/Annotation { // examples.classes/AA|null[0] - constructor () // examples.classes/AA.|(){}[0] -} -open annotation class examples.classes/AAA : kotlin/Annotation { // examples.classes/AAA|null[0] - constructor () // examples.classes/AAA.|(){}[0] -} open class examples.classes/OC { // examples.classes/OC|null[0] constructor (kotlin/Int) // examples.classes/OC.|(kotlin.Int){}[0] constructor (kotlin/Long) // examples.classes/OC.|(kotlin.Long){}[0] constructor (kotlin/String) // examples.classes/OC.|(kotlin.String){}[0] - final fun c() // examples.classes/OC.c|c(){}[0] final val ix // examples.classes/OC.ix|{}ix[0] final fun (): kotlin/Int // examples.classes/OC.ix.|(){}[0] final val iy // examples.classes/OC.iy|{}iy[0] @@ -124,5 +102,27 @@ open class examples.classes/OC { // examples.classes/OC|null[0] final var z // examples.classes/OC.z|{}z[0] final fun (): kotlin/Int // examples.classes/OC.z.|(){}[0] final fun (kotlin/Int) // examples.classes/OC.z.|(kotlin.Int){}[0] + final fun c() // examples.classes/OC.c|c(){}[0] open fun o(): kotlin/Int // examples.classes/OC.o|o(){}[0] } +final object examples.classes/O // examples.classes/O|null[0] +final object examples.classes/OO // examples.classes/OO|null[0] +final const val examples.classes/con // examples.classes/con|{}con[0] + final fun (): kotlin/String // examples.classes/con.|(){}[0] +final const val examples.classes/intCon // examples.classes/intCon|{}intCon[0] + final fun (): kotlin/Int // examples.classes/intCon.|(){}[0] +final val examples.classes/a // examples.classes/a|{}a[0] + final fun (): kotlin/Any // examples.classes/a.|(){}[0] +final val examples.classes/i // examples.classes/i|{}i[0] + final fun (): kotlin/Int // examples.classes/i.|(){}[0] +final val examples.classes/l // examples.classes/l|{}l[0] + final fun (): kotlin/Long // examples.classes/l.|(){}[0] +final var examples.classes/d // examples.classes/d|{}d[0] + final fun (): kotlin/Double // examples.classes/d.|(){}[0] + final fun (kotlin/Double) // examples.classes/d.|(kotlin.Double){}[0] +final var examples.classes/r // examples.classes/r|{}r[0] + final fun (): kotlin/Float // examples.classes/r.|(){}[0] + final fun (kotlin/Float) // examples.classes/r.|(kotlin.Float){}[0] +final fun <#A: kotlin/Any?> examples.classes/consume(#A) // examples.classes/consume|consume(0:0){0§}[0] +final fun examples.classes/testFun(): kotlin/Int // examples.classes/testFun|testFun(){}[0] +final inline fun examples.classes/testInlineFun() // examples.classes/testInlineFun|testInlineFun(){}[0] diff --git a/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.v1.dump b/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.v1.dump index 661d87fd..cefb125a 100644 --- a/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.v1.dump +++ b/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.v1.dump @@ -6,31 +6,58 @@ // - Show declarations: true // Library unique name: -abstract class examples.classes/AC { // examples.classes/AC|null[0] - abstract fun a() // examples.classes/AC.a|-4432112437378250461[0] - constructor () // examples.classes/AC.|-5645683436151566731[0] - final fun b() // examples.classes/AC.b|4789657038926421504[0] +open annotation class examples.classes/A : kotlin/Annotation { // examples.classes/A|null[0] + constructor () // examples.classes/A.|-5645683436151566731[0] +} +open annotation class examples.classes/AA : kotlin/Annotation { // examples.classes/AA|null[0] + constructor () // examples.classes/AA.|-5645683436151566731[0] +} +open annotation class examples.classes/AAA : kotlin/Annotation { // examples.classes/AAA|null[0] + constructor () // examples.classes/AAA.|-5645683436151566731[0] +} +final enum class examples.classes/E : kotlin/Enum { // examples.classes/E|null[0] + enum entry A // examples.classes/E.A|null[0] + enum entry B // examples.classes/E.B|null[0] + enum entry C // examples.classes/E.C|null[0] + final val entries // examples.classes/E.entries|-5134227801081826149[0] + final fun (): kotlin.enums/EnumEntries // examples.classes/E.entries.|-6068527377476727729[0] + final fun valueOf(kotlin/String): examples.classes/E // examples.classes/E.valueOf|-4683474617854611729[0] + final fun values(): kotlin/Array // examples.classes/E.values|-8715569000920726747[0] +} +final enum class examples.classes/EE : kotlin/Enum { // examples.classes/EE|null[0] + enum entry AA // examples.classes/EE.AA|null[0] + enum entry BB // examples.classes/EE.BB|null[0] + enum entry CC // examples.classes/EE.CC|null[0] + final val entries // examples.classes/EE.entries|-5134227801081826149[0] + final fun (): kotlin.enums/EnumEntries // examples.classes/EE.entries.|-6068527377476727729[0] + final fun valueOf(kotlin/String): examples.classes/EE // examples.classes/EE.valueOf|-4683474617854611729[0] + final fun values(): kotlin/Array // examples.classes/EE.values|-8715569000920726747[0] } abstract fun interface examples.classes/FI { // examples.classes/FI|null[0] abstract fun a() // examples.classes/FI.a|-4432112437378250461[0] } abstract interface examples.classes/I // examples.classes/I|null[0] abstract interface examples.classes/II // examples.classes/II|null[0] +abstract class examples.classes/AC { // examples.classes/AC|null[0] + constructor () // examples.classes/AC.|-5645683436151566731[0] + abstract fun a() // examples.classes/AC.a|-4432112437378250461[0] + final fun b() // examples.classes/AC.b|4789657038926421504[0] +} final class examples.classes/C { // examples.classes/C|null[0] constructor (kotlin/Any) // examples.classes/C.|4518179880532599055[0] - final fun m() // examples.classes/C.m|-1029306787563722981[0] final val v // examples.classes/C.v|138869847852828796[0] final fun (): kotlin/Any // examples.classes/C.v.|4964732996156868941[0] + final fun m() // examples.classes/C.m|-1029306787563722981[0] } final class examples.classes/D { // examples.classes/D|null[0] constructor (kotlin/Int) // examples.classes/D.|-5182794243525578284[0] + final val x // examples.classes/D.x|-8060530855978347579[0] + final fun (): kotlin/Int // examples.classes/D.x.|1482705010654679335[0] final fun component1(): kotlin/Int // examples.classes/D.component1|162597135895221648[0] final fun copy(kotlin/Int =...): examples.classes/D // examples.classes/D.copy|-6971662324481626298[0] final fun equals(kotlin/Any?): kotlin/Boolean // examples.classes/D.equals|4638265728071529943[0] final fun hashCode(): kotlin/Int // examples.classes/D.hashCode|3409210261493131192[0] final fun toString(): kotlin/String // examples.classes/D.toString|-1522858123163872138[0] - final val x // examples.classes/D.x|-8060530855978347579[0] - final fun (): kotlin/Int // examples.classes/D.x.|1482705010654679335[0] } final class examples.classes/IC : examples.classes/II { // examples.classes/IC|null[0] constructor () // examples.classes/IC.|-5645683436151566731[0] @@ -43,10 +70,10 @@ final class examples.classes/Outer { // examples.classes/Outer|null[0] enum entry A // examples.classes/Outer.Nested.NE.A|null[0] enum entry B // examples.classes/Outer.Nested.NE.B|null[0] enum entry C // examples.classes/Outer.Nested.NE.C|null[0] - final fun valueOf(kotlin/String): examples.classes/Outer.Nested.NE // examples.classes/Outer.Nested.NE.valueOf|-4683474617854611729[0] - final fun values(): kotlin/Array // examples.classes/Outer.Nested.NE.values|-8715569000920726747[0] final val entries // examples.classes/Outer.Nested.NE.entries|-5134227801081826149[0] final fun (): kotlin.enums/EnumEntries // examples.classes/Outer.Nested.NE.entries.|-6068527377476727729[0] + final fun valueOf(kotlin/String): examples.classes/Outer.Nested.NE // examples.classes/Outer.Nested.NE.valueOf|-4683474617854611729[0] + final fun values(): kotlin/Array // examples.classes/Outer.Nested.NE.values|-8715569000920726747[0] } final inner class Inner { // examples.classes/Outer.Nested.Inner|null[0] constructor () // examples.classes/Outer.Nested.Inner.|-5645683436151566731[0] @@ -56,59 +83,10 @@ final class examples.classes/Outer { // examples.classes/Outer|null[0] } } } -final const val examples.classes/con // examples.classes/con|-2899158152154217071[0] - final fun (): kotlin/String // examples.classes/con.|-2604863570302238407[0] -final const val examples.classes/intCon // examples.classes/intCon|-4533540985615038728[0] - final fun (): kotlin/Int // examples.classes/intCon.|-7661624206875263703[0] -final enum class examples.classes/E : kotlin/Enum { // examples.classes/E|null[0] - enum entry A // examples.classes/E.A|null[0] - enum entry B // examples.classes/E.B|null[0] - enum entry C // examples.classes/E.C|null[0] - final fun valueOf(kotlin/String): examples.classes/E // examples.classes/E.valueOf|-4683474617854611729[0] - final fun values(): kotlin/Array // examples.classes/E.values|-8715569000920726747[0] - final val entries // examples.classes/E.entries|-5134227801081826149[0] - final fun (): kotlin.enums/EnumEntries // examples.classes/E.entries.|-6068527377476727729[0] -} -final enum class examples.classes/EE : kotlin/Enum { // examples.classes/EE|null[0] - enum entry AA // examples.classes/EE.AA|null[0] - enum entry BB // examples.classes/EE.BB|null[0] - enum entry CC // examples.classes/EE.CC|null[0] - final fun valueOf(kotlin/String): examples.classes/EE // examples.classes/EE.valueOf|-4683474617854611729[0] - final fun values(): kotlin/Array // examples.classes/EE.values|-8715569000920726747[0] - final val entries // examples.classes/EE.entries|-5134227801081826149[0] - final fun (): kotlin.enums/EnumEntries // examples.classes/EE.entries.|-6068527377476727729[0] -} -final fun <#A: kotlin/Any?> examples.classes/consume(#A) // examples.classes/consume|8042761629495509481[0] -final fun examples.classes/testFun(): kotlin/Int // examples.classes/testFun|6322333980269160703[0] -final inline fun examples.classes/testInlineFun() // examples.classes/testInlineFun|-9193388292326484960[0] -final object examples.classes/O // examples.classes/O|null[0] -final object examples.classes/OO // examples.classes/OO|null[0] -final val examples.classes/a // examples.classes/a|-1200697420457237799[0] - final fun (): kotlin/Any // examples.classes/a.|6785176174175479410[0] -final val examples.classes/i // examples.classes/i|5014384761142332495[0] - final fun (): kotlin/Int // examples.classes/i.|6945482638966853621[0] -final val examples.classes/l // examples.classes/l|3307215303229595169[0] - final fun (): kotlin/Long // examples.classes/l.|3795442967620585[0] -final var examples.classes/d // examples.classes/d|5174763769109925331[0] - final fun (): kotlin/Double // examples.classes/d.|-6701718004621354461[0] - final fun (kotlin/Double) // examples.classes/d.|-6916287485929380915[0] -final var examples.classes/r // examples.classes/r|-8117627916896159533[0] - final fun (): kotlin/Float // examples.classes/r.|-7424184448774736572[0] - final fun (kotlin/Float) // examples.classes/r.|9171637170963327464[0] -open annotation class examples.classes/A : kotlin/Annotation { // examples.classes/A|null[0] - constructor () // examples.classes/A.|-5645683436151566731[0] -} -open annotation class examples.classes/AA : kotlin/Annotation { // examples.classes/AA|null[0] - constructor () // examples.classes/AA.|-5645683436151566731[0] -} -open annotation class examples.classes/AAA : kotlin/Annotation { // examples.classes/AAA|null[0] - constructor () // examples.classes/AAA.|-5645683436151566731[0] -} open class examples.classes/OC { // examples.classes/OC|null[0] constructor (kotlin/Int) // examples.classes/OC.|-5182794243525578284[0] constructor (kotlin/Long) // examples.classes/OC.|5217973964116651322[0] constructor (kotlin/String) // examples.classes/OC.|1280618353163213788[0] - final fun c() // examples.classes/OC.c|-2724918380551733646[0] final val ix // examples.classes/OC.ix|5586787718776183610[0] final fun (): kotlin/Int // examples.classes/OC.ix.|6412451035637198934[0] final val iy // examples.classes/OC.iy|-4863546984470764583[0] @@ -124,5 +102,27 @@ open class examples.classes/OC { // examples.classes/OC|null[0] final var z // examples.classes/OC.z|7549650372729116193[0] final fun (): kotlin/Int // examples.classes/OC.z.|4925813204745917177[0] final fun (kotlin/Int) // examples.classes/OC.z.|8486465404430625584[0] + final fun c() // examples.classes/OC.c|-2724918380551733646[0] open fun o(): kotlin/Int // examples.classes/OC.o|-3264635847192431671[0] } +final object examples.classes/O // examples.classes/O|null[0] +final object examples.classes/OO // examples.classes/OO|null[0] +final const val examples.classes/con // examples.classes/con|-2899158152154217071[0] + final fun (): kotlin/String // examples.classes/con.|-2604863570302238407[0] +final const val examples.classes/intCon // examples.classes/intCon|-4533540985615038728[0] + final fun (): kotlin/Int // examples.classes/intCon.|-7661624206875263703[0] +final val examples.classes/a // examples.classes/a|-1200697420457237799[0] + final fun (): kotlin/Any // examples.classes/a.|6785176174175479410[0] +final val examples.classes/i // examples.classes/i|5014384761142332495[0] + final fun (): kotlin/Int // examples.classes/i.|6945482638966853621[0] +final val examples.classes/l // examples.classes/l|3307215303229595169[0] + final fun (): kotlin/Long // examples.classes/l.|3795442967620585[0] +final var examples.classes/d // examples.classes/d|5174763769109925331[0] + final fun (): kotlin/Double // examples.classes/d.|-6701718004621354461[0] + final fun (kotlin/Double) // examples.classes/d.|-6916287485929380915[0] +final var examples.classes/r // examples.classes/r|-8117627916896159533[0] + final fun (): kotlin/Float // examples.classes/r.|-7424184448774736572[0] + final fun (kotlin/Float) // examples.classes/r.|9171637170963327464[0] +final fun <#A: kotlin/Any?> examples.classes/consume(#A) // examples.classes/consume|8042761629495509481[0] +final fun examples.classes/testFun(): kotlin/Int // examples.classes/testFun|6322333980269160703[0] +final inline fun examples.classes/testInlineFun() // examples.classes/testInlineFun|-9193388292326484960[0] diff --git a/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.with.guessed.linux.dump b/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.with.guessed.linux.dump index cfcf695d..952ad9f5 100644 --- a/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.with.guessed.linux.dump +++ b/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.with.guessed.linux.dump @@ -6,31 +6,58 @@ // - Show declarations: true // Library unique name: -abstract class examples.classes/AC { // examples.classes/AC|null[0] - abstract fun a() // examples.classes/AC.a|a(){}[0] - constructor () // examples.classes/AC.|(){}[0] - final fun b() // examples.classes/AC.b|b(){}[0] +open annotation class examples.classes/A : kotlin/Annotation { // examples.classes/A|null[0] + constructor () // examples.classes/A.|(){}[0] +} +open annotation class examples.classes/AA : kotlin/Annotation { // examples.classes/AA|null[0] + constructor () // examples.classes/AA.|(){}[0] +} +open annotation class examples.classes/AAA : kotlin/Annotation { // examples.classes/AAA|null[0] + constructor () // examples.classes/AAA.|(){}[0] +} +final enum class examples.classes/E : kotlin/Enum { // examples.classes/E|null[0] + enum entry A // examples.classes/E.A|null[0] + enum entry B // examples.classes/E.B|null[0] + enum entry C // examples.classes/E.C|null[0] + final val entries // examples.classes/E.entries|#static{}entries[0] + final fun (): kotlin.enums/EnumEntries // examples.classes/E.entries.|#static(){}[0] + final fun valueOf(kotlin/String): examples.classes/E // examples.classes/E.valueOf|valueOf#static(kotlin.String){}[0] + final fun values(): kotlin/Array // examples.classes/E.values|values#static(){}[0] +} +final enum class examples.classes/EE : kotlin/Enum { // examples.classes/EE|null[0] + enum entry AA // examples.classes/EE.AA|null[0] + enum entry BB // examples.classes/EE.BB|null[0] + enum entry CC // examples.classes/EE.CC|null[0] + final val entries // examples.classes/EE.entries|#static{}entries[0] + final fun (): kotlin.enums/EnumEntries // examples.classes/EE.entries.|#static(){}[0] + final fun valueOf(kotlin/String): examples.classes/EE // examples.classes/EE.valueOf|valueOf#static(kotlin.String){}[0] + final fun values(): kotlin/Array // examples.classes/EE.values|values#static(){}[0] } abstract fun interface examples.classes/FI { // examples.classes/FI|null[0] abstract fun a() // examples.classes/FI.a|a(){}[0] } abstract interface examples.classes/I // examples.classes/I|null[0] abstract interface examples.classes/II // examples.classes/II|null[0] +abstract class examples.classes/AC { // examples.classes/AC|null[0] + constructor () // examples.classes/AC.|(){}[0] + abstract fun a() // examples.classes/AC.a|a(){}[0] + final fun b() // examples.classes/AC.b|b(){}[0] +} final class examples.classes/C { // examples.classes/C|null[0] constructor (kotlin/Any) // examples.classes/C.|(kotlin.Any){}[0] - final fun m() // examples.classes/C.m|m(){}[0] final val v // examples.classes/C.v|{}v[0] final fun (): kotlin/Any // examples.classes/C.v.|(){}[0] + final fun m() // examples.classes/C.m|m(){}[0] } final class examples.classes/D { // examples.classes/D|null[0] constructor (kotlin/Int) // examples.classes/D.|(kotlin.Int){}[0] + final val x // examples.classes/D.x|{}x[0] + final fun (): kotlin/Int // examples.classes/D.x.|(){}[0] final fun component1(): kotlin/Int // examples.classes/D.component1|component1(){}[0] final fun copy(kotlin/Int =...): examples.classes/D // examples.classes/D.copy|copy(kotlin.Int){}[0] final fun equals(kotlin/Any?): kotlin/Boolean // examples.classes/D.equals|equals(kotlin.Any?){}[0] final fun hashCode(): kotlin/Int // examples.classes/D.hashCode|hashCode(){}[0] final fun toString(): kotlin/String // examples.classes/D.toString|toString(){}[0] - final val x // examples.classes/D.x|{}x[0] - final fun (): kotlin/Int // examples.classes/D.x.|(){}[0] } final class examples.classes/IC : examples.classes/II { // examples.classes/IC|null[0] constructor () // examples.classes/IC.|(){}[0] @@ -43,10 +70,10 @@ final class examples.classes/Outer { // examples.classes/Outer|null[0] enum entry A // examples.classes/Outer.Nested.NE.A|null[0] enum entry B // examples.classes/Outer.Nested.NE.B|null[0] enum entry C // examples.classes/Outer.Nested.NE.C|null[0] - final fun valueOf(kotlin/String): examples.classes/Outer.Nested.NE // examples.classes/Outer.Nested.NE.valueOf|valueOf#static(kotlin.String){}[0] - final fun values(): kotlin/Array // examples.classes/Outer.Nested.NE.values|values#static(){}[0] final val entries // examples.classes/Outer.Nested.NE.entries|#static{}entries[0] final fun (): kotlin.enums/EnumEntries // examples.classes/Outer.Nested.NE.entries.|#static(){}[0] + final fun valueOf(kotlin/String): examples.classes/Outer.Nested.NE // examples.classes/Outer.Nested.NE.valueOf|valueOf#static(kotlin.String){}[0] + final fun values(): kotlin/Array // examples.classes/Outer.Nested.NE.values|values#static(){}[0] } final inner class Inner { // examples.classes/Outer.Nested.Inner|null[0] constructor () // examples.classes/Outer.Nested.Inner.|(){}[0] @@ -56,59 +83,10 @@ final class examples.classes/Outer { // examples.classes/Outer|null[0] } } } -final const val examples.classes/con // examples.classes/con|{}con[0] - final fun (): kotlin/String // examples.classes/con.|(){}[0] -final const val examples.classes/intCon // examples.classes/intCon|{}intCon[0] - final fun (): kotlin/Int // examples.classes/intCon.|(){}[0] -final enum class examples.classes/E : kotlin/Enum { // examples.classes/E|null[0] - enum entry A // examples.classes/E.A|null[0] - enum entry B // examples.classes/E.B|null[0] - enum entry C // examples.classes/E.C|null[0] - final fun valueOf(kotlin/String): examples.classes/E // examples.classes/E.valueOf|valueOf#static(kotlin.String){}[0] - final fun values(): kotlin/Array // examples.classes/E.values|values#static(){}[0] - final val entries // examples.classes/E.entries|#static{}entries[0] - final fun (): kotlin.enums/EnumEntries // examples.classes/E.entries.|#static(){}[0] -} -final enum class examples.classes/EE : kotlin/Enum { // examples.classes/EE|null[0] - enum entry AA // examples.classes/EE.AA|null[0] - enum entry BB // examples.classes/EE.BB|null[0] - enum entry CC // examples.classes/EE.CC|null[0] - final fun valueOf(kotlin/String): examples.classes/EE // examples.classes/EE.valueOf|valueOf#static(kotlin.String){}[0] - final fun values(): kotlin/Array // examples.classes/EE.values|values#static(){}[0] - final val entries // examples.classes/EE.entries|#static{}entries[0] - final fun (): kotlin.enums/EnumEntries // examples.classes/EE.entries.|#static(){}[0] -} -final fun <#A: kotlin/Any?> examples.classes/consume(#A) // examples.classes/consume|consume(0:0){0§}[0] -final fun examples.classes/testFun(): kotlin/Int // examples.classes/testFun|testFun(){}[0] -final inline fun examples.classes/testInlineFun() // examples.classes/testInlineFun|testInlineFun(){}[0] -final object examples.classes/O // examples.classes/O|null[0] -final object examples.classes/OO // examples.classes/OO|null[0] -final val examples.classes/a // examples.classes/a|{}a[0] - final fun (): kotlin/Any // examples.classes/a.|(){}[0] -final val examples.classes/i // examples.classes/i|{}i[0] - final fun (): kotlin/Int // examples.classes/i.|(){}[0] -final val examples.classes/l // examples.classes/l|{}l[0] - final fun (): kotlin/Long // examples.classes/l.|(){}[0] -final var examples.classes/d // examples.classes/d|{}d[0] - final fun (): kotlin/Double // examples.classes/d.|(){}[0] - final fun (kotlin/Double) // examples.classes/d.|(kotlin.Double){}[0] -final var examples.classes/r // examples.classes/r|{}r[0] - final fun (): kotlin/Float // examples.classes/r.|(){}[0] - final fun (kotlin/Float) // examples.classes/r.|(kotlin.Float){}[0] -open annotation class examples.classes/A : kotlin/Annotation { // examples.classes/A|null[0] - constructor () // examples.classes/A.|(){}[0] -} -open annotation class examples.classes/AA : kotlin/Annotation { // examples.classes/AA|null[0] - constructor () // examples.classes/AA.|(){}[0] -} -open annotation class examples.classes/AAA : kotlin/Annotation { // examples.classes/AAA|null[0] - constructor () // examples.classes/AAA.|(){}[0] -} open class examples.classes/OC { // examples.classes/OC|null[0] constructor (kotlin/Int) // examples.classes/OC.|(kotlin.Int){}[0] constructor (kotlin/Long) // examples.classes/OC.|(kotlin.Long){}[0] constructor (kotlin/String) // examples.classes/OC.|(kotlin.String){}[0] - final fun c() // examples.classes/OC.c|c(){}[0] final val ix // examples.classes/OC.ix|{}ix[0] final fun (): kotlin/Int // examples.classes/OC.ix.|(){}[0] final val iy // examples.classes/OC.iy|{}iy[0] @@ -124,5 +102,27 @@ open class examples.classes/OC { // examples.classes/OC|null[0] final var z // examples.classes/OC.z|{}z[0] final fun (): kotlin/Int // examples.classes/OC.z.|(){}[0] final fun (kotlin/Int) // examples.classes/OC.z.|(kotlin.Int){}[0] + final fun c() // examples.classes/OC.c|c(){}[0] open fun o(): kotlin/Int // examples.classes/OC.o|o(){}[0] } +final object examples.classes/O // examples.classes/O|null[0] +final object examples.classes/OO // examples.classes/OO|null[0] +final const val examples.classes/con // examples.classes/con|{}con[0] + final fun (): kotlin/String // examples.classes/con.|(){}[0] +final const val examples.classes/intCon // examples.classes/intCon|{}intCon[0] + final fun (): kotlin/Int // examples.classes/intCon.|(){}[0] +final val examples.classes/a // examples.classes/a|{}a[0] + final fun (): kotlin/Any // examples.classes/a.|(){}[0] +final val examples.classes/i // examples.classes/i|{}i[0] + final fun (): kotlin/Int // examples.classes/i.|(){}[0] +final val examples.classes/l // examples.classes/l|{}l[0] + final fun (): kotlin/Long // examples.classes/l.|(){}[0] +final var examples.classes/d // examples.classes/d|{}d[0] + final fun (): kotlin/Double // examples.classes/d.|(){}[0] + final fun (kotlin/Double) // examples.classes/d.|(kotlin.Double){}[0] +final var examples.classes/r // examples.classes/r|{}r[0] + final fun (): kotlin/Float // examples.classes/r.|(){}[0] + final fun (kotlin/Float) // examples.classes/r.|(kotlin.Float){}[0] +final fun <#A: kotlin/Any?> examples.classes/consume(#A) // examples.classes/consume|consume(0:0){0§}[0] +final fun examples.classes/testFun(): kotlin/Int // examples.classes/testFun|testFun(){}[0] +final inline fun examples.classes/testInlineFun() // examples.classes/testInlineFun|testInlineFun(){}[0] diff --git a/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.with.linux.dump b/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.with.linux.dump index fdc5d282..39dcdc04 100644 --- a/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.with.linux.dump +++ b/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.with.linux.dump @@ -6,31 +6,58 @@ // - Show declarations: true // Library unique name: -abstract class examples.classes/AC { // examples.classes/AC|null[0] - abstract fun a() // examples.classes/AC.a|a(){}[0] - constructor () // examples.classes/AC.|(){}[0] - final fun b() // examples.classes/AC.b|b(){}[0] +open annotation class examples.classes/A : kotlin/Annotation { // examples.classes/A|null[0] + constructor () // examples.classes/A.|(){}[0] +} +open annotation class examples.classes/AA : kotlin/Annotation { // examples.classes/AA|null[0] + constructor () // examples.classes/AA.|(){}[0] +} +open annotation class examples.classes/AAA : kotlin/Annotation { // examples.classes/AAA|null[0] + constructor () // examples.classes/AAA.|(){}[0] +} +final enum class examples.classes/E : kotlin/Enum { // examples.classes/E|null[0] + enum entry A // examples.classes/E.A|null[0] + enum entry B // examples.classes/E.B|null[0] + enum entry C // examples.classes/E.C|null[0] + final val entries // examples.classes/E.entries|#static{}entries[0] + final fun (): kotlin.enums/EnumEntries // examples.classes/E.entries.|#static(){}[0] + final fun valueOf(kotlin/String): examples.classes/E // examples.classes/E.valueOf|valueOf#static(kotlin.String){}[0] + final fun values(): kotlin/Array // examples.classes/E.values|values#static(){}[0] +} +final enum class examples.classes/EE : kotlin/Enum { // examples.classes/EE|null[0] + enum entry AA // examples.classes/EE.AA|null[0] + enum entry BB // examples.classes/EE.BB|null[0] + enum entry CC // examples.classes/EE.CC|null[0] + final val entries // examples.classes/EE.entries|#static{}entries[0] + final fun (): kotlin.enums/EnumEntries // examples.classes/EE.entries.|#static(){}[0] + final fun valueOf(kotlin/String): examples.classes/EE // examples.classes/EE.valueOf|valueOf#static(kotlin.String){}[0] + final fun values(): kotlin/Array // examples.classes/EE.values|values#static(){}[0] } abstract fun interface examples.classes/FI { // examples.classes/FI|null[0] abstract fun a() // examples.classes/FI.a|a(){}[0] } abstract interface examples.classes/I // examples.classes/I|null[0] abstract interface examples.classes/II // examples.classes/II|null[0] +abstract class examples.classes/AC { // examples.classes/AC|null[0] + constructor () // examples.classes/AC.|(){}[0] + abstract fun a() // examples.classes/AC.a|a(){}[0] + final fun b() // examples.classes/AC.b|b(){}[0] +} final class examples.classes/C { // examples.classes/C|null[0] constructor (kotlin/Any) // examples.classes/C.|(kotlin.Any){}[0] - final fun m() // examples.classes/C.m|m(){}[0] final val v // examples.classes/C.v|{}v[0] final fun (): kotlin/Any // examples.classes/C.v.|(){}[0] + final fun m() // examples.classes/C.m|m(){}[0] } final class examples.classes/D { // examples.classes/D|null[0] constructor (kotlin/Int) // examples.classes/D.|(kotlin.Int){}[0] + final val x // examples.classes/D.x|{}x[0] + final fun (): kotlin/Int // examples.classes/D.x.|(){}[0] final fun component1(): kotlin/Int // examples.classes/D.component1|component1(){}[0] final fun copy(kotlin/Int =...): examples.classes/D // examples.classes/D.copy|copy(kotlin.Int){}[0] final fun equals(kotlin/Any?): kotlin/Boolean // examples.classes/D.equals|equals(kotlin.Any?){}[0] final fun hashCode(): kotlin/Int // examples.classes/D.hashCode|hashCode(){}[0] final fun toString(): kotlin/String // examples.classes/D.toString|toString(){}[0] - final val x // examples.classes/D.x|{}x[0] - final fun (): kotlin/Int // examples.classes/D.x.|(){}[0] } final class examples.classes/IC : examples.classes/II { // examples.classes/IC|null[0] constructor () // examples.classes/IC.|(){}[0] @@ -43,10 +70,10 @@ final class examples.classes/Outer { // examples.classes/Outer|null[0] enum entry A // examples.classes/Outer.Nested.NE.A|null[0] enum entry B // examples.classes/Outer.Nested.NE.B|null[0] enum entry C // examples.classes/Outer.Nested.NE.C|null[0] - final fun valueOf(kotlin/String): examples.classes/Outer.Nested.NE // examples.classes/Outer.Nested.NE.valueOf|valueOf#static(kotlin.String){}[0] - final fun values(): kotlin/Array // examples.classes/Outer.Nested.NE.values|values#static(){}[0] final val entries // examples.classes/Outer.Nested.NE.entries|#static{}entries[0] final fun (): kotlin.enums/EnumEntries // examples.classes/Outer.Nested.NE.entries.|#static(){}[0] + final fun valueOf(kotlin/String): examples.classes/Outer.Nested.NE // examples.classes/Outer.Nested.NE.valueOf|valueOf#static(kotlin.String){}[0] + final fun values(): kotlin/Array // examples.classes/Outer.Nested.NE.values|values#static(){}[0] } final inner class Inner { // examples.classes/Outer.Nested.Inner|null[0] constructor () // examples.classes/Outer.Nested.Inner.|(){}[0] @@ -56,59 +83,10 @@ final class examples.classes/Outer { // examples.classes/Outer|null[0] } } } -final const val examples.classes/con // examples.classes/con|{}con[0] - final fun (): kotlin/String // examples.classes/con.|(){}[0] -final const val examples.classes/intCon // examples.classes/intCon|{}intCon[0] - final fun (): kotlin/Int // examples.classes/intCon.|(){}[0] -final enum class examples.classes/E : kotlin/Enum { // examples.classes/E|null[0] - enum entry A // examples.classes/E.A|null[0] - enum entry B // examples.classes/E.B|null[0] - enum entry C // examples.classes/E.C|null[0] - final fun valueOf(kotlin/String): examples.classes/E // examples.classes/E.valueOf|valueOf#static(kotlin.String){}[0] - final fun values(): kotlin/Array // examples.classes/E.values|values#static(){}[0] - final val entries // examples.classes/E.entries|#static{}entries[0] - final fun (): kotlin.enums/EnumEntries // examples.classes/E.entries.|#static(){}[0] -} -final enum class examples.classes/EE : kotlin/Enum { // examples.classes/EE|null[0] - enum entry AA // examples.classes/EE.AA|null[0] - enum entry BB // examples.classes/EE.BB|null[0] - enum entry CC // examples.classes/EE.CC|null[0] - final fun valueOf(kotlin/String): examples.classes/EE // examples.classes/EE.valueOf|valueOf#static(kotlin.String){}[0] - final fun values(): kotlin/Array // examples.classes/EE.values|values#static(){}[0] - final val entries // examples.classes/EE.entries|#static{}entries[0] - final fun (): kotlin.enums/EnumEntries // examples.classes/EE.entries.|#static(){}[0] -} -final fun <#A: kotlin/Any?> examples.classes/consume(#A) // examples.classes/consume|consume(0:0){0§}[0] -final fun examples.classes/testFun(): kotlin/Int // examples.classes/testFun|testFun(){}[0] -final inline fun examples.classes/testInlineFun() // examples.classes/testInlineFun|testInlineFun(){}[0] -final object examples.classes/O // examples.classes/O|null[0] -final object examples.classes/OO // examples.classes/OO|null[0] -final val examples.classes/a // examples.classes/a|{}a[0] - final fun (): kotlin/Any // examples.classes/a.|(){}[0] -final val examples.classes/i // examples.classes/i|{}i[0] - final fun (): kotlin/Int // examples.classes/i.|(){}[0] -final val examples.classes/l // examples.classes/l|{}l[0] - final fun (): kotlin/Long // examples.classes/l.|(){}[0] -final var examples.classes/d // examples.classes/d|{}d[0] - final fun (): kotlin/Double // examples.classes/d.|(){}[0] - final fun (kotlin/Double) // examples.classes/d.|(kotlin.Double){}[0] -final var examples.classes/r // examples.classes/r|{}r[0] - final fun (): kotlin/Float // examples.classes/r.|(){}[0] - final fun (kotlin/Float) // examples.classes/r.|(kotlin.Float){}[0] -open annotation class examples.classes/A : kotlin/Annotation { // examples.classes/A|null[0] - constructor () // examples.classes/A.|(){}[0] -} -open annotation class examples.classes/AA : kotlin/Annotation { // examples.classes/AA|null[0] - constructor () // examples.classes/AA.|(){}[0] -} -open annotation class examples.classes/AAA : kotlin/Annotation { // examples.classes/AAA|null[0] - constructor () // examples.classes/AAA.|(){}[0] -} open class examples.classes/OC { // examples.classes/OC|null[0] constructor (kotlin/Int) // examples.classes/OC.|(kotlin.Int){}[0] constructor (kotlin/Long) // examples.classes/OC.|(kotlin.Long){}[0] constructor (kotlin/String) // examples.classes/OC.|(kotlin.String){}[0] - final fun c() // examples.classes/OC.c|c(){}[0] final val ix // examples.classes/OC.ix|{}ix[0] final fun (): kotlin/Int // examples.classes/OC.ix.|(){}[0] final val iy // examples.classes/OC.iy|{}iy[0] @@ -124,5 +102,27 @@ open class examples.classes/OC { // examples.classes/OC|null[0] final var z // examples.classes/OC.z|{}z[0] final fun (): kotlin/Int // examples.classes/OC.z.|(){}[0] final fun (kotlin/Int) // examples.classes/OC.z.|(kotlin.Int){}[0] + final fun c() // examples.classes/OC.c|c(){}[0] open fun o(): kotlin/Int // examples.classes/OC.o|o(){}[0] } +final object examples.classes/O // examples.classes/O|null[0] +final object examples.classes/OO // examples.classes/OO|null[0] +final const val examples.classes/con // examples.classes/con|{}con[0] + final fun (): kotlin/String // examples.classes/con.|(){}[0] +final const val examples.classes/intCon // examples.classes/intCon|{}intCon[0] + final fun (): kotlin/Int // examples.classes/intCon.|(){}[0] +final val examples.classes/a // examples.classes/a|{}a[0] + final fun (): kotlin/Any // examples.classes/a.|(){}[0] +final val examples.classes/i // examples.classes/i|{}i[0] + final fun (): kotlin/Int // examples.classes/i.|(){}[0] +final val examples.classes/l // examples.classes/l|{}l[0] + final fun (): kotlin/Long // examples.classes/l.|(){}[0] +final var examples.classes/d // examples.classes/d|{}d[0] + final fun (): kotlin/Double // examples.classes/d.|(){}[0] + final fun (kotlin/Double) // examples.classes/d.|(kotlin.Double){}[0] +final var examples.classes/r // examples.classes/r|{}r[0] + final fun (): kotlin/Float // examples.classes/r.|(){}[0] + final fun (kotlin/Float) // examples.classes/r.|(kotlin.Float){}[0] +final fun <#A: kotlin/Any?> examples.classes/consume(#A) // examples.classes/consume|consume(0:0){0§}[0] +final fun examples.classes/testFun(): kotlin/Int // examples.classes/testFun|testFun(){}[0] +final inline fun examples.classes/testInlineFun() // examples.classes/testInlineFun|testInlineFun(){}[0] From ae345450ad41d06df225a7595f8553eb3804962e Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Mon, 10 Jun 2024 13:42:58 +0200 Subject: [PATCH 6/6] Add a test explicitly verifying declarations ordering --- src/test/kotlin/tests/KlibDumpTest.kt | 138 ++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) diff --git a/src/test/kotlin/tests/KlibDumpTest.kt b/src/test/kotlin/tests/KlibDumpTest.kt index d691aa0e..cd107088 100644 --- a/src/test/kotlin/tests/KlibDumpTest.kt +++ b/src/test/kotlin/tests/KlibDumpTest.kt @@ -656,4 +656,142 @@ class KlibDumpTest { tempFile.readText(Charsets.US_ASCII) ) } + + @Test + fun declarationsOrdering() { + val dump = KlibDump.from(asFile(""" + // Klib ABI Dump + // Targets: [iosArm64, iosX64, js] + // Rendering settings: + // - Signature version: 2 + // - Show manifest properties: true + // - Show declarations: true + + // Library unique name: + final const val c/con // c/con|{}con[0] + final fun (): kotlin/String // c/con.|(){}[0] + final class cls/D // cls/D|null[0] + final fun f/b: kotlin/Int // f/b|b(){}[0] + abstract interface an.iface/I // an.iface/I|null[0] + final const val c/acon // c/acon|{}acon[0] + final fun (): kotlin/String // c/acon.|(){}[0] + abstract class cls/C // cls/C|null[0] + final fun f/a: kotlin/Int // f/a|a(){}[0] + open annotation class ann/B : kotlin/Annotation { // ann/B|null[0] + constructor () // ann/B.|(){}[0] + } + final var v/e // v/e|{}d[0] + final fun (): kotlin/Double // v/d.|(){}[0] + final fun (kotlin/Double) // v/e.|(kotlin.Double){}[0] + final class cls/B { // cls/B|null[0] + final fun b(): kotlin/Int // cls/B.b|b(){}[0] + final var aaa // cls/B.aaa|{}aaa[0] + final fun (kotlin/Int) // cls/B.aaa.|(kotlin.Int){}[0] + final fun (): kotlin/Int // cls/B.aaa.|(){}[0] + final val y // cls/B.y|{}y[0] + final fun (): kotlin/Int // cls/B.y.|(){}[0] + final var yy // cls/B.yy|{}yy[0] + final fun (): kotlin/Int // cls/B.yy.|(){}[0] + final fun (kotlin/Int) // cls/B.yy.|(kotlin.Int){}[0] + final inner class I2 // cls/B.I2|null[0] + final inner class I1 // cls/B.I1|null[0] + final fun a(): kotlin/Int // cls/B.a|a(){}[0] + final class N // cls/B.N|null[0] + final class A // cls/B.A|null[0] + final val x // cls/B.x|{}x[0] + final fun (): kotlin/Int // cls/B.x.|(){}[0] + final fun c(): kotlin/Int // cls/B.c|c(){}[0] + constructor (kotlin/Int) // cls/B.|(kotlin.Int){}[0] + constructor () // cls/B.|(){}[0] + } + final val v/l // v/l|{}l[0] + final fun (): kotlin/Long // v/l.|(){}[0] + final val v/a // v/a|{}a[0] + final fun (): kotlin/Long // v/a.|(){}[0] + final var v/d // v/d|{}d[0] + final fun (kotlin/Double) // v/d.|(kotlin.Double){}[0] + final fun (): kotlin/Double // v/d.|(){}[0] + abstract interface iface/I // iface/I|null[0] + open annotation class ann/A : kotlin/Annotation { // ann/A|null[0] + constructor () // ann/A.|(){}[0] + } + final enum class a/E : kotlin/Enum { // a/eE|null[0] + enum entry C // a/E.C|null[0] + enum entry B // a/E.B|null[0] + enum entry A // a/E.A|null[0] + } + final object a/O // a/O|null[0] + final object a/OO // a/OO|null[0] + final class cls/A // cls/A|null[0] + + """.trimIndent())) + + val expectedDump = """ + // Klib ABI Dump + // Targets: [iosArm64, iosX64, js] + // Rendering settings: + // - Signature version: 2 + // - Show manifest properties: true + // - Show declarations: true + + // Library unique name: + open annotation class ann/A : kotlin/Annotation { // ann/A|null[0] + constructor () // ann/A.|(){}[0] + } + open annotation class ann/B : kotlin/Annotation { // ann/B|null[0] + constructor () // ann/B.|(){}[0] + } + final enum class a/E : kotlin/Enum { // a/eE|null[0] + enum entry A // a/E.A|null[0] + enum entry B // a/E.B|null[0] + enum entry C // a/E.C|null[0] + } + abstract interface an.iface/I // an.iface/I|null[0] + abstract interface iface/I // iface/I|null[0] + abstract class cls/C // cls/C|null[0] + final class cls/A // cls/A|null[0] + final class cls/B { // cls/B|null[0] + constructor () // cls/B.|(){}[0] + constructor (kotlin/Int) // cls/B.|(kotlin.Int){}[0] + final val x // cls/B.x|{}x[0] + final fun (): kotlin/Int // cls/B.x.|(){}[0] + final val y // cls/B.y|{}y[0] + final fun (): kotlin/Int // cls/B.y.|(){}[0] + final var aaa // cls/B.aaa|{}aaa[0] + final fun (): kotlin/Int // cls/B.aaa.|(){}[0] + final fun (kotlin/Int) // cls/B.aaa.|(kotlin.Int){}[0] + final var yy // cls/B.yy|{}yy[0] + final fun (): kotlin/Int // cls/B.yy.|(){}[0] + final fun (kotlin/Int) // cls/B.yy.|(kotlin.Int){}[0] + final fun a(): kotlin/Int // cls/B.a|a(){}[0] + final fun b(): kotlin/Int // cls/B.b|b(){}[0] + final fun c(): kotlin/Int // cls/B.c|c(){}[0] + final class A // cls/B.A|null[0] + final class N // cls/B.N|null[0] + final inner class I1 // cls/B.I1|null[0] + final inner class I2 // cls/B.I2|null[0] + } + final class cls/D // cls/D|null[0] + final object a/O // a/O|null[0] + final object a/OO // a/OO|null[0] + final const val c/acon // c/acon|{}acon[0] + final fun (): kotlin/String // c/acon.|(){}[0] + final const val c/con // c/con|{}con[0] + final fun (): kotlin/String // c/con.|(){}[0] + final val v/a // v/a|{}a[0] + final fun (): kotlin/Long // v/a.|(){}[0] + final val v/l // v/l|{}l[0] + final fun (): kotlin/Long // v/l.|(){}[0] + final var v/d // v/d|{}d[0] + final fun (): kotlin/Double // v/d.|(){}[0] + final fun (kotlin/Double) // v/d.|(kotlin.Double){}[0] + final var v/e // v/e|{}d[0] + final fun (): kotlin/Double // v/d.|(){}[0] + final fun (kotlin/Double) // v/e.|(kotlin.Double){}[0] + final fun f/a: kotlin/Int // f/a|a(){}[0] + final fun f/b: kotlin/Int // f/b|b(){}[0] + + """.trimIndent() + assertEquals(expectedDump, buildString { dump.saveTo(this) }) + } }