From 3f84c2978c6cbb64f8bfe987f95eaafd00843686 Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Thu, 2 May 2024 14:58:56 +0200 Subject: [PATCH 1/7] Cleaned up dumping code and consolidated it in a single method --- src/main/kotlin/api/klib/KlibAbiDumpFileMerger.kt | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/api/klib/KlibAbiDumpFileMerger.kt b/src/main/kotlin/api/klib/KlibAbiDumpFileMerger.kt index 26b1ccf2..37f5dbc3 100644 --- a/src/main/kotlin/api/klib/KlibAbiDumpFileMerger.kt +++ b/src/main/kotlin/api/klib/KlibAbiDumpFileMerger.kt @@ -371,9 +371,7 @@ internal class KlibAbiDumpMerger { headerContent.forEach { appendable.append(it).append('\n') } - topLevelDeclaration.children.values.sortedWith(DeclarationsComparator).forEach { - it.dump(appendable, _targets, formatter) - } + topLevelDeclaration.dump(appendable, _targets, formatter) } private fun createFormatter(): KlibsTargetsFormatter { @@ -504,13 +502,17 @@ internal class DeclarationContainer(val text: String, val parent: DeclarationCon } fun dump(appendable: Appendable, allTargets: Set, formatter: KlibsTargetsFormatter) { - if (targets != allTargets/* && !dumpFormat.singleTargetDump*/) { + if (targets != allTargets) { // Use the same indentation for target list as for the declaration itself appendable.append(" ".repeat(text.depth() * INDENT_WIDTH)) .append(formatter.formatDeclarationTargets(targets)) .append('\n') } - appendable.append(text).append('\n') + appendable.append(text) + // The text is empty for the fake top-level declaration + if (text.isNotEmpty()) { + appendable.append('\n') + } children.values.sortedWith(DeclarationsComparator).forEach { it.dump(appendable, this.targets, formatter) } @@ -563,6 +565,7 @@ internal class DeclarationContainer(val text: String, val parent: DeclarationCon null -> { children[otherChild.key] = otherChild.value.deepCopy(this) } + else -> child.mergeTargetSpecific(otherChild.value) } } From e24447413f2fcc544fea0cb508ec0a2fc45e2cc5 Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Thu, 2 May 2024 15:19:31 +0200 Subject: [PATCH 2/7] Add more vertical spacing --- .../kotlin/api/klib/KlibAbiDumpFileMerger.kt | 27 +++++++++++++++++-- src/test/kotlin/samples/KlibDumpSamples.kt | 11 ++++++++ src/test/kotlin/tests/KlibDumpTest.kt | 20 ++++++++++++++ .../merge/diverging/linuxArm64.extracted.api | 3 +++ src/test/resources/merge/diverging/merged.abi | 10 +++++++ .../merge/diverging/merged_with_aliases.abi | 10 +++++++ .../merged_with_aliases_and_custom_names.abi | 10 +++++++ src/test/resources/merge/guess/common.api | 2 ++ src/test/resources/merge/guess/guessed.api | 3 +++ .../merge/guess/linuxArm64Specific.api | 1 + .../merge/idempotent/bcv-klib-test.abi | 10 +++++++ src/test/resources/merge/identical/merged.abi | 3 +++ .../merge/non-overlapping/merged.klib.abi | 1 + .../withoutLinuxAll.abi | 2 ++ .../withoutLinuxArm64.abi | 3 +++ .../resources/merge/webTargets/js.ext.abi | 3 +++ .../resources/merge/webTargets/merged.abi | 3 +++ .../resources/merge/webTargets/wasmJs.ext.abi | 3 +++ .../merge/webTargets/wasmWasi.ext.abi | 3 +++ 19 files changed, 126 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/api/klib/KlibAbiDumpFileMerger.kt b/src/main/kotlin/api/klib/KlibAbiDumpFileMerger.kt index 37f5dbc3..86fa1296 100644 --- a/src/main/kotlin/api/klib/KlibAbiDumpFileMerger.kt +++ b/src/main/kotlin/api/klib/KlibAbiDumpFileMerger.kt @@ -513,14 +513,37 @@ internal class DeclarationContainer(val text: String, val parent: DeclarationCon if (text.isNotEmpty()) { appendable.append('\n') } - children.values.sortedWith(DeclarationsComparator).forEach { - it.dump(appendable, this.targets, formatter) + var previousDeclaration: DeclarationContainer? = null + children.values.sortedWith(DeclarationsComparator).forEach { currentDeclaration -> + if (previousDeclaration != null) { + val pd = previousDeclaration!! + // Precede a group of declarations sharing the same kind (properties, classes, functions), + // and declarations that'll have a "// Targets" header with a newline to improve readability. + if (pd.type != currentDeclaration.type || currentDeclaration.targets != this.targets + || currentDeclaration.isTypeDeclaration() + ) { + appendable.append('\n') + } + } + currentDeclaration.dump(appendable, this.targets, formatter) + previousDeclaration = currentDeclaration } if (delimiter != null) { appendable.append(delimiter).append('\n') } } + private fun isTypeDeclaration(): Boolean { + return when (type) { + DeclarationType.Object -> true + DeclarationType.Class -> true + DeclarationType.Interface -> true + DeclarationType.AnnotationClass -> true + DeclarationType.EnumClass -> true + else -> false + } + } + fun remove(target: KlibTarget) { if (parent != null && !targets.contains(target)) { return diff --git a/src/test/kotlin/samples/KlibDumpSamples.kt b/src/test/kotlin/samples/KlibDumpSamples.kt index b44368f4..0f5f48fd 100644 --- a/src/test/kotlin/samples/KlibDumpSamples.kt +++ b/src/test/kotlin/samples/KlibDumpSamples.kt @@ -87,10 +87,13 @@ 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 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,10 +158,13 @@ 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 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,8 +183,10 @@ 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 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] } @@ -199,6 +207,7 @@ class KlibDumpSamples { // Library unique name: abstract class examples.classes/Klass // examples.classes/Klass|null[0] + // Targets: [iosArm64, iosX64] abstract interface examples.classes/Iface // examples.classes/Iface|null[0] @@ -244,6 +253,7 @@ class KlibDumpSamples { // Library unique name: abstract class examples.classes/Klass // examples.classes/Klass|null[0] + // Targets: [iosArm64] abstract interface examples.classes/Iface // examples.classes/Iface|null[0] @@ -282,6 +292,7 @@ class KlibDumpSamples { // Library unique name: abstract interface examples.classes/Iface // examples.classes/Iface|null[0] + abstract class examples.classes/NewKlass // examples.classes/NewKlass|null[0] """.trimIndent(), diff --git a/src/test/kotlin/tests/KlibDumpTest.kt b/src/test/kotlin/tests/KlibDumpTest.kt index cd107088..d206ca1c 100644 --- a/src/test/kotlin/tests/KlibDumpTest.kt +++ b/src/test/kotlin/tests/KlibDumpTest.kt @@ -48,10 +48,13 @@ 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 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] """.trimIndent() @@ -68,15 +71,20 @@ private val mergedLinuxDumpWithTargetSpecificDeclaration = """ // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(kotlin.Int){}[0] + final val value // org.example/ShardedClass.value|{}value[0] final fun (): kotlin/Int // org.example/ShardedClass.value.|(){}[0] + // Targets: [linuxArm64] final fun add2(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] + // Targets: [linuxX64] final fun add(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] } + // Targets: [linuxArm64] final fun org.example/ShardedClass2(kotlin/Int, kotlin/Float, kotlin/Long): org.example/ShardedClass // org.example/ShardedClass|ShardedClass(kotlin.Int;kotlin.Float;kotlin.Long){}[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] @@ -93,10 +101,13 @@ private val mergedLinuxArm64Dump = """ // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(kotlin.Int){}[0] + final val value // org.example/ShardedClass.value|{}value[0] final fun (): kotlin/Int // org.example/ShardedClass.value.|(){}[0] + final fun add2(kotlin/Int): kotlin/Int // org.example/ShardedClass.add|add(kotlin.Int){}[0] } + final fun org.example/ShardedClass2(kotlin/Int, kotlin/Float, kotlin/Long): org.example/ShardedClass // org.example/ShardedClass|ShardedClass(kotlin.Int;kotlin.Float;kotlin.Long){}[0] """.trimIndent() @@ -112,10 +123,13 @@ 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 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] """.trimIndent() @@ -590,14 +604,19 @@ class KlibDumpTest { // Library unique name: final class org.different.pack/BuildConfig { // org.different.pack/BuildConfig|null[0] constructor () // org.different.pack/BuildConfig.|(){}[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] + // Targets: [linux] final fun (org.different.pack/BuildConfig).org.different.pack/linuxArm64Specific2(): kotlin/Int // org.different.pack/linuxArm64Specific2|linuxArm64Specific@org.different.pack.BuildConfig(){}[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] @@ -638,6 +657,7 @@ class KlibDumpTest { // Library unique name: final fun org.example/common(): kotlin/Int // com.example/common|common(){}[0] + // Targets: [ios] final fun org.example/native(): kotlin/Int // com.example/native|native(){}[0] diff --git a/src/test/resources/merge/diverging/linuxArm64.extracted.api b/src/test/resources/merge/diverging/linuxArm64.extracted.api index f072ce93..dba05713 100644 --- a/src/test/resources/merge/diverging/linuxArm64.extracted.api +++ b/src/test/resources/merge/diverging/linuxArm64.extracted.api @@ -8,10 +8,13 @@ // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(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] final fun org.example/add(kotlin/Long, kotlin/Long): kotlin/Long // org.example/add|add(kotlin.Long;kotlin.Long){}[0] diff --git a/src/test/resources/merge/diverging/merged.abi b/src/test/resources/merge/diverging/merged.abi index b0c5389e..8f37717c 100644 --- a/src/test/resources/merge/diverging/merged.abi +++ b/src/test/resources/merge/diverging/merged.abi @@ -9,24 +9,34 @@ // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(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] final fun (kotlin/Long).org.example/add(kotlin/Long): kotlin/Long // org.example/add|add@kotlin.Long(kotlin.Long){}[0] + // Targets: [linux] final fun org.example/add(kotlin/Long, kotlin/Long): kotlin/Long // org.example/add|add(kotlin.Long;kotlin.Long){}[0] + // Targets: [androidNativeArm64] final class org.example/X { // org.example/X|null[0] constructor (kotlin/Int) // org.example/X.|(kotlin.Int){}[0] } + // Targets: [androidNativeArm64] 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] + // Targets: [androidNativeArm64] 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] + // Targets: [tvosX64] final fun (kotlin/Int).org.example/add(kotlin/Int): kotlin/Int // org.example/add|add@kotlin.Int(kotlin.Int){}[0] + // Targets: [tvosX64] final fun org.example/add(kotlin/Int, kotlin/Int): kotlin/Int // org.example/add|add(kotlin.Int;kotlin.Int){}[0] diff --git a/src/test/resources/merge/diverging/merged_with_aliases.abi b/src/test/resources/merge/diverging/merged_with_aliases.abi index b0c5389e..8f37717c 100644 --- a/src/test/resources/merge/diverging/merged_with_aliases.abi +++ b/src/test/resources/merge/diverging/merged_with_aliases.abi @@ -9,24 +9,34 @@ // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(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] final fun (kotlin/Long).org.example/add(kotlin/Long): kotlin/Long // org.example/add|add@kotlin.Long(kotlin.Long){}[0] + // Targets: [linux] final fun org.example/add(kotlin/Long, kotlin/Long): kotlin/Long // org.example/add|add(kotlin.Long;kotlin.Long){}[0] + // Targets: [androidNativeArm64] final class org.example/X { // org.example/X|null[0] constructor (kotlin/Int) // org.example/X.|(kotlin.Int){}[0] } + // Targets: [androidNativeArm64] 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] + // Targets: [androidNativeArm64] 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] + // Targets: [tvosX64] final fun (kotlin/Int).org.example/add(kotlin/Int): kotlin/Int // org.example/add|add@kotlin.Int(kotlin.Int){}[0] + // Targets: [tvosX64] final fun org.example/add(kotlin/Int, kotlin/Int): kotlin/Int // org.example/add|add(kotlin.Int;kotlin.Int){}[0] 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 d32c129d..b6e82a64 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,24 +9,34 @@ // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(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] final fun (kotlin/Long).org.example/add(kotlin/Long): kotlin/Long // org.example/add|add@kotlin.Long(kotlin.Long){}[0] + // Targets: [linux] final fun org.example/add(kotlin/Long, kotlin/Long): kotlin/Long // org.example/add|add(kotlin.Long;kotlin.Long){}[0] + // Targets: [androidNativeArm64.android] final class org.example/X { // org.example/X|null[0] constructor (kotlin/Int) // org.example/X.|(kotlin.Int){}[0] } + // Targets: [androidNativeArm64.android] 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] + // Targets: [androidNativeArm64.android] 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] + // Targets: [tvosX64] final fun (kotlin/Int).org.example/add(kotlin/Int): kotlin/Int // org.example/add|add@kotlin.Int(kotlin.Int){}[0] + // Targets: [tvosX64] final fun org.example/add(kotlin/Int, kotlin/Int): kotlin/Int // org.example/add|add(kotlin.Int;kotlin.Int){}[0] diff --git a/src/test/resources/merge/guess/common.api b/src/test/resources/merge/guess/common.api index 00aa80c7..e1e03247 100644 --- a/src/test/resources/merge/guess/common.api +++ b/src/test/resources/merge/guess/common.api @@ -8,7 +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 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 87f9ad2a..5ec83d01 100644 --- a/src/test/resources/merge/guess/guessed.api +++ b/src/test/resources/merge/guess/guessed.api @@ -8,10 +8,13 @@ // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(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/guess/linuxArm64Specific.api b/src/test/resources/merge/guess/linuxArm64Specific.api index f52246ee..c036605a 100644 --- a/src/test/resources/merge/guess/linuxArm64Specific.api +++ b/src/test/resources/merge/guess/linuxArm64Specific.api @@ -9,5 +9,6 @@ final class org.example/ShardedClass { // org.example/ShardedClass|null[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 b136a18c..be164357 100644 --- a/src/test/resources/merge/idempotent/bcv-klib-test.abi +++ b/src/test/resources/merge/idempotent/bcv-klib-test.abi @@ -11,24 +11,34 @@ // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(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] final fun (kotlin/Int).org.example/add(kotlin/Int): kotlin/Int // org.example/add|add@kotlin.Int(kotlin.Int){}[0] + // Targets: [apple] final fun org.example/add(kotlin/Int, kotlin/Int): kotlin/Int // org.example/add|add(kotlin.Int;kotlin.Int){}[0] + // Targets: [androidNative] final class org.example/X { // org.example/X|null[0] constructor (kotlin/Int) // org.example/X.|(kotlin.Int){}[0] } + // Targets: [androidNative] 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] + // Targets: [androidNative] 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] + // Targets: [linux] final fun (kotlin/Long).org.example/add(kotlin/Long): kotlin/Long // org.example/add|add@kotlin.Long(kotlin.Long){}[0] + // Targets: [linux] final fun org.example/add(kotlin/Long, kotlin/Long): kotlin/Long // org.example/add|add(kotlin.Long;kotlin.Long){}[0] diff --git a/src/test/resources/merge/identical/merged.abi b/src/test/resources/merge/identical/merged.abi index af419f65..e8a8d784 100644 --- a/src/test/resources/merge/identical/merged.abi +++ b/src/test/resources/merge/identical/merged.abi @@ -8,8 +8,11 @@ // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(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/non-overlapping/merged.klib.abi b/src/test/resources/merge/non-overlapping/merged.klib.abi index a1f33e22..ecb605b6 100644 --- a/src/test/resources/merge/non-overlapping/merged.klib.abi +++ b/src/test/resources/merge/non-overlapping/merged.klib.abi @@ -8,5 +8,6 @@ // Library unique name: // Targets: [linuxArm64] final fun org.example/add(kotlin/Long, kotlin/Long): kotlin/Long // org.example/add|add(kotlin.Long;kotlin.Long){}[0] + // Targets: [linuxX64] final fun org.example/sub(kotlin/Long, kotlin/Long): kotlin/Long // org.example/sub|sub(kotlin.Long;kotlin.Long){}[0] diff --git a/src/test/resources/merge/parseNarrowChildrenDecls/withoutLinuxAll.abi b/src/test/resources/merge/parseNarrowChildrenDecls/withoutLinuxAll.abi index c6af23ea..0be3b77d 100644 --- a/src/test/resources/merge/parseNarrowChildrenDecls/withoutLinuxAll.abi +++ b/src/test/resources/merge/parseNarrowChildrenDecls/withoutLinuxAll.abi @@ -8,7 +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 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 6bc939e0..34450edb 100644 --- a/src/test/resources/merge/parseNarrowChildrenDecls/withoutLinuxArm64.abi +++ b/src/test/resources/merge/parseNarrowChildrenDecls/withoutLinuxArm64.abi @@ -8,9 +8,12 @@ // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(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 a26ddda5..7cdc6f30 100644 --- a/src/test/resources/merge/webTargets/js.ext.abi +++ b/src/test/resources/merge/webTargets/js.ext.abi @@ -8,8 +8,11 @@ // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(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 2ca57e8c..13fefb1c 100644 --- a/src/test/resources/merge/webTargets/merged.abi +++ b/src/test/resources/merge/webTargets/merged.abi @@ -8,8 +8,11 @@ // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(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 295270dd..c9210339 100644 --- a/src/test/resources/merge/webTargets/wasmJs.ext.abi +++ b/src/test/resources/merge/webTargets/wasmJs.ext.abi @@ -8,8 +8,11 @@ // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(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 e9332540..e5953b73 100644 --- a/src/test/resources/merge/webTargets/wasmWasi.ext.abi +++ b/src/test/resources/merge/webTargets/wasmWasi.ext.abi @@ -8,8 +8,11 @@ // Library unique name: final class org.example/ShardedClass { // org.example/ShardedClass|null[0] constructor (kotlin/Int) // org.example/ShardedClass.|(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 98d750b86d6b9ad5dd9ddfbf80507fefdc03ca94 Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Mon, 6 May 2024 11:43:55 +0200 Subject: [PATCH 3/7] Use stricter validation --- .../kotlinx/validation/test/KlibVerificationTests.kt | 4 ++-- .../examples/classes/AnotherBuildConfig.klib.clash.dump | 3 +++ .../examples/classes/AnotherBuildConfig.klib.custom.dump | 2 ++ .../examples/classes/AnotherBuildConfig.klib.dump | 2 ++ .../classes/AnotherBuildConfig.klib.linuxX64Only.dump | 2 ++ .../classes/AnotherBuildConfig.klib.renamedTarget.dump | 4 +++- .../examples/classes/AnotherBuildConfig.klib.web.dump | 2 ++ .../classes/AnotherBuildConfigLinux.klib.grouping.dump | 3 +++ .../classes/AnotherBuildConfigLinuxArm64Extra.klib.dump | 3 +++ .../classes/AnotherBuildConfigModified.klib.dump | 2 ++ .../examples/classes/ClassWithPublicMarkers.klib.dump | 9 +++++++++ .../examples/classes/GeneratedSources.klib.dump | 1 + .../resources/examples/classes/Properties.klib.dump | 2 ++ .../resources/examples/classes/Subclasses.klib.dump | 1 + 14 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/functionalTest/kotlin/kotlinx/validation/test/KlibVerificationTests.kt b/src/functionalTest/kotlin/kotlinx/validation/test/KlibVerificationTests.kt index a544f032..793c3581 100644 --- a/src/functionalTest/kotlin/kotlinx/validation/test/KlibVerificationTests.kt +++ b/src/functionalTest/kotlin/kotlinx/validation/test/KlibVerificationTests.kt @@ -36,7 +36,7 @@ private fun KlibVerificationTests.checkKlibDump( val expected = readFileList(expectedDumpFileName) - Assertions.assertThat(generatedDump.readText()).isEqualToIgnoringNewLines(expected) + Assertions.assertThat(generatedDump.readText()).isEqualTo(expected) } internal class KlibVerificationTests : BaseKotlinGradleTest() { @@ -155,7 +155,7 @@ internal class KlibVerificationTests : BaseKotlinGradleTest() { assertTrue(jvmApiDump.exists(), "No API dump for JVM") val jvmExpected = readFileList("/examples/classes/AnotherBuildConfig.dump") - Assertions.assertThat(jvmApiDump.readText()).isEqualToIgnoringNewLines(jvmExpected) + Assertions.assertThat(jvmApiDump.readText()).isEqualTo(jvmExpected) } } diff --git a/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.clash.dump b/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.clash.dump index ce0a113b..be0dbea4 100644 --- a/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.clash.dump +++ b/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.clash.dump @@ -9,9 +9,12 @@ // Library unique name: final class org.different.pack/BuildConfig { // org.different.pack/BuildConfig|null[0] constructor () // org.different.pack/BuildConfig.|(){}[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 59a51635..29471257 100644 --- a/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.custom.dump +++ b/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.custom.dump @@ -8,7 +8,9 @@ // Library unique name: final class org.different.pack/BuildConfig { // org.different.pack/BuildConfig|null[0] constructor () // org.different.pack/BuildConfig.|(){}[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 5410116e..9f046b1c 100644 --- a/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.dump +++ b/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.dump @@ -8,7 +8,9 @@ // Library unique name: final class org.different.pack/BuildConfig { // org.different.pack/BuildConfig|null[0] constructor () // org.different.pack/BuildConfig.|(){}[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 0105c1b9..f8200083 100644 --- a/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.linuxX64Only.dump +++ b/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.linuxX64Only.dump @@ -8,7 +8,9 @@ // Library unique name: final class org.different.pack/BuildConfig { // org.different.pack/BuildConfig|null[0] constructor () // org.different.pack/BuildConfig.|(){}[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.renamedTarget.dump b/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.renamedTarget.dump index 8b84f00e..c5b1691d 100644 --- a/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.renamedTarget.dump +++ b/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.renamedTarget.dump @@ -8,7 +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] } diff --git a/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.web.dump b/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.web.dump index d3c64a98..404aab11 100644 --- a/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.web.dump +++ b/src/functionalTest/resources/examples/classes/AnotherBuildConfig.klib.web.dump @@ -8,7 +8,9 @@ // Library unique name: final class org.different.pack/BuildConfig { // org.different.pack/BuildConfig|null[0] constructor () // org.different.pack/BuildConfig.|(){}[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 987ffa33..8458135c 100644 --- a/src/functionalTest/resources/examples/classes/AnotherBuildConfigLinux.klib.grouping.dump +++ b/src/functionalTest/resources/examples/classes/AnotherBuildConfigLinux.klib.grouping.dump @@ -9,9 +9,12 @@ // Library unique name: final class org.different.pack/BuildConfig { // org.different.pack/BuildConfig|null[0] constructor () // org.different.pack/BuildConfig.|(){}[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 6a15bd92..9272d8b4 100644 --- a/src/functionalTest/resources/examples/classes/AnotherBuildConfigLinuxArm64Extra.klib.dump +++ b/src/functionalTest/resources/examples/classes/AnotherBuildConfigLinuxArm64Extra.klib.dump @@ -8,9 +8,12 @@ // Library unique name: final class org.different.pack/BuildConfig { // org.different.pack/BuildConfig|null[0] constructor () // org.different.pack/BuildConfig.|(){}[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 a4d9ebc4..ba2dcaf4 100644 --- a/src/functionalTest/resources/examples/classes/AnotherBuildConfigModified.klib.dump +++ b/src/functionalTest/resources/examples/classes/AnotherBuildConfigModified.klib.dump @@ -8,8 +8,10 @@ // Library unique name: final class org.different.pack/BuildConfig { // org.different.pack/BuildConfig|null[0] constructor () // org.different.pack/BuildConfig.|(){}[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] } diff --git a/src/functionalTest/resources/examples/classes/ClassWithPublicMarkers.klib.dump b/src/functionalTest/resources/examples/classes/ClassWithPublicMarkers.klib.dump index b1e8f295..9f663d32 100644 --- a/src/functionalTest/resources/examples/classes/ClassWithPublicMarkers.klib.dump +++ b/src/functionalTest/resources/examples/classes/ClassWithPublicMarkers.klib.dump @@ -10,20 +10,26 @@ // Library unique name: final class foo.api/ClassInPublicPackage { // foo.api/ClassInPublicPackage|null[0] constructor () // foo.api/ClassInPublicPackage.|(){}[0] + final class Inner { // foo.api/ClassInPublicPackage.Inner|null[0] constructor () // foo.api/ClassInPublicPackage.Inner.|(){}[0] } } + final class foo/ClassWithPublicMarkers { // foo/ClassWithPublicMarkers|null[0] constructor () // foo/ClassWithPublicMarkers.|(){}[0] + final class MarkedClass { // foo/ClassWithPublicMarkers.MarkedClass|null[0] constructor () // foo/ClassWithPublicMarkers.MarkedClass.|(){}[0] + final val bar1 // foo/ClassWithPublicMarkers.MarkedClass.bar1|{}bar1[0] final fun (): kotlin/Int // foo/ClassWithPublicMarkers.MarkedClass.bar1.|(){}[0] } + final class NotMarkedClass { // foo/ClassWithPublicMarkers.NotMarkedClass|null[0] constructor () // foo/ClassWithPublicMarkers.NotMarkedClass.|(){}[0] } + final var bar1 // foo/ClassWithPublicMarkers.bar1|{}bar1[0] final fun (): kotlin/Int // foo/ClassWithPublicMarkers.bar1.|(){}[0] final fun (kotlin/Int) // foo/ClassWithPublicMarkers.bar1.|(kotlin.Int){}[0] @@ -34,12 +40,15 @@ final class foo/ClassWithPublicMarkers { // foo/ClassWithPublicMarkers|null[0] final fun (): kotlin/Int // foo/ClassWithPublicMarkers.notMarkedPublic.|(){}[0] final fun (kotlin/Int) // foo/ClassWithPublicMarkers.notMarkedPublic.|(kotlin.Int){}[0] } + open annotation class foo/PublicClass : kotlin/Annotation { // foo/PublicClass|null[0] constructor () // foo/PublicClass.|(){}[0] } + open annotation class foo/PublicField : kotlin/Annotation { // foo/PublicField|null[0] constructor () // foo/PublicField.|(){}[0] } + open annotation class foo/PublicProperty : kotlin/Annotation { // foo/PublicProperty|null[0] constructor () // foo/PublicProperty.|(){}[0] } diff --git a/src/functionalTest/resources/examples/classes/GeneratedSources.klib.dump b/src/functionalTest/resources/examples/classes/GeneratedSources.klib.dump index 97ba68f3..e56a75e5 100644 --- a/src/functionalTest/resources/examples/classes/GeneratedSources.klib.dump +++ b/src/functionalTest/resources/examples/classes/GeneratedSources.klib.dump @@ -8,5 +8,6 @@ // Library unique name: final class /Generated { // /Generated|null[0] constructor () // /Generated.|(){}[0] + final fun helloCreator(): kotlin/Int // /Generated.helloCreator|helloCreator(){}[0] } diff --git a/src/functionalTest/resources/examples/classes/Properties.klib.dump b/src/functionalTest/resources/examples/classes/Properties.klib.dump index 6359372b..e6227496 100644 --- a/src/functionalTest/resources/examples/classes/Properties.klib.dump +++ b/src/functionalTest/resources/examples/classes/Properties.klib.dump @@ -9,9 +9,11 @@ final class foo/ClassWithProperties { // foo/ClassWithProperties|null[0] constructor () // foo/ClassWithProperties.|(){}[0] } + open annotation class foo/HiddenField : kotlin/Annotation { // foo/HiddenField|null[0] constructor () // foo/HiddenField.|(){}[0] } + open annotation class foo/HiddenProperty : kotlin/Annotation { // foo/HiddenProperty|null[0] constructor () // foo/HiddenProperty.|(){}[0] } diff --git a/src/functionalTest/resources/examples/classes/Subclasses.klib.dump b/src/functionalTest/resources/examples/classes/Subclasses.klib.dump index e13fa3f6..851647f8 100644 --- a/src/functionalTest/resources/examples/classes/Subclasses.klib.dump +++ b/src/functionalTest/resources/examples/classes/Subclasses.klib.dump @@ -8,6 +8,7 @@ // Library unique name: final class subclasses/A { // subclasses/A|null[0] constructor () // subclasses/A.|(){}[0] + final class D { // subclasses/A.D|null[0] constructor () // subclasses/A.D.|(){}[0] } From a97899750b50146e36ebf991265ed2dc4e40e102 Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Mon, 27 May 2024 10:29:25 +0200 Subject: [PATCH 4/7] Updated top-level decls test data, part II --- .../TopLevelDeclarations.klib.all.dump | 37 +++++++++++++++++++ .../classes/TopLevelDeclarations.klib.dump | 37 +++++++++++++++++++ .../TopLevelDeclarations.klib.unsup.dump | 37 +++++++++++++++++++ .../classes/TopLevelDeclarations.klib.v1.dump | 37 +++++++++++++++++++ ...lDeclarations.klib.with.guessed.linux.dump | 37 +++++++++++++++++++ .../TopLevelDeclarations.klib.with.linux.dump | 37 +++++++++++++++++++ 6 files changed, 222 insertions(+) diff --git a/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.all.dump b/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.all.dump index afe408a1..688f8254 100644 --- a/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.all.dump +++ b/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.all.dump @@ -9,90 +9,120 @@ 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 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 class examples.classes/IC : examples.classes/II { // examples.classes/IC|null[0] constructor () // examples.classes/IC.|(){}[0] } + final class examples.classes/Outer { // examples.classes/Outer|null[0] constructor () // examples.classes/Outer.|(){}[0] + final class Nested { // examples.classes/Outer.Nested|null[0] constructor () // examples.classes/Outer.Nested.|(){}[0] + final enum class NE : kotlin/Enum { // examples.classes/Outer.Nested.NE|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 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] } + final inner class YetAnotherInner { // examples.classes/Outer.Nested.YetAnotherInner|null[0] constructor () // examples.classes/Outer.Nested.YetAnotherInner.|(){}[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 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] final fun (): kotlin/Long // examples.classes/OC.iy.|(){}[0] final val iz // examples.classes/OC.iz|{}iz[0] final fun (): kotlin/String // examples.classes/OC.iz.|(){}[0] + final var x // examples.classes/OC.x|{}x[0] final fun (): kotlin/Int // examples.classes/OC.x.|(){}[0] final fun (kotlin/Int) // examples.classes/OC.x.|(kotlin.Int){}[0] @@ -102,27 +132,34 @@ 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 39dcdc04..d142037d 100644 --- a/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.dump +++ b/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.dump @@ -9,90 +9,120 @@ 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 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 class examples.classes/IC : examples.classes/II { // examples.classes/IC|null[0] constructor () // examples.classes/IC.|(){}[0] } + final class examples.classes/Outer { // examples.classes/Outer|null[0] constructor () // examples.classes/Outer.|(){}[0] + final class Nested { // examples.classes/Outer.Nested|null[0] constructor () // examples.classes/Outer.Nested.|(){}[0] + final enum class NE : kotlin/Enum { // examples.classes/Outer.Nested.NE|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 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] } + final inner class YetAnotherInner { // examples.classes/Outer.Nested.YetAnotherInner|null[0] constructor () // examples.classes/Outer.Nested.YetAnotherInner.|(){}[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 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] final fun (): kotlin/Long // examples.classes/OC.iy.|(){}[0] final val iz // examples.classes/OC.iz|{}iz[0] final fun (): kotlin/String // examples.classes/OC.iz.|(){}[0] + final var x // examples.classes/OC.x|{}x[0] final fun (): kotlin/Int // examples.classes/OC.x.|(){}[0] final fun (kotlin/Int) // examples.classes/OC.x.|(kotlin.Int){}[0] @@ -102,27 +132,34 @@ 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 24e2e99e..0656cad3 100644 --- a/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.unsup.dump +++ b/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.unsup.dump @@ -9,90 +9,120 @@ 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 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 class examples.classes/IC : examples.classes/II { // examples.classes/IC|null[0] constructor () // examples.classes/IC.|(){}[0] } + final class examples.classes/Outer { // examples.classes/Outer|null[0] constructor () // examples.classes/Outer.|(){}[0] + final class Nested { // examples.classes/Outer.Nested|null[0] constructor () // examples.classes/Outer.Nested.|(){}[0] + final enum class NE : kotlin/Enum { // examples.classes/Outer.Nested.NE|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 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] } + final inner class YetAnotherInner { // examples.classes/Outer.Nested.YetAnotherInner|null[0] constructor () // examples.classes/Outer.Nested.YetAnotherInner.|(){}[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 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] final fun (): kotlin/Long // examples.classes/OC.iy.|(){}[0] final val iz // examples.classes/OC.iz|{}iz[0] final fun (): kotlin/String // examples.classes/OC.iz.|(){}[0] + final var x // examples.classes/OC.x|{}x[0] final fun (): kotlin/Int // examples.classes/OC.x.|(){}[0] final fun (kotlin/Int) // examples.classes/OC.x.|(kotlin.Int){}[0] @@ -102,27 +132,34 @@ 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 cefb125a..9e09fafd 100644 --- a/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.v1.dump +++ b/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.v1.dump @@ -9,90 +9,120 @@ 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 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 class examples.classes/IC : examples.classes/II { // examples.classes/IC|null[0] constructor () // examples.classes/IC.|-5645683436151566731[0] } + final class examples.classes/Outer { // examples.classes/Outer|null[0] constructor () // examples.classes/Outer.|-5645683436151566731[0] + final class Nested { // examples.classes/Outer.Nested|null[0] constructor () // examples.classes/Outer.Nested.|-5645683436151566731[0] + final enum class NE : kotlin/Enum { // examples.classes/Outer.Nested.NE|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 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] } + final inner class YetAnotherInner { // examples.classes/Outer.Nested.YetAnotherInner|null[0] constructor () // examples.classes/Outer.Nested.YetAnotherInner.|-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 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] final fun (): kotlin/Long // examples.classes/OC.iy.|-4932930205028660775[0] final val iz // examples.classes/OC.iz|-6916102702480625188[0] final fun (): kotlin/String // examples.classes/OC.iz.|8935463596906645831[0] + final var x // examples.classes/OC.x|-8060530855978347579[0] final fun (): kotlin/Int // examples.classes/OC.x.|1482705010654679335[0] final fun (kotlin/Int) // examples.classes/OC.x.|-740209739415615559[0] @@ -102,27 +132,34 @@ 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 952ad9f5..172aa6c1 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 @@ -9,90 +9,120 @@ 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 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 class examples.classes/IC : examples.classes/II { // examples.classes/IC|null[0] constructor () // examples.classes/IC.|(){}[0] } + final class examples.classes/Outer { // examples.classes/Outer|null[0] constructor () // examples.classes/Outer.|(){}[0] + final class Nested { // examples.classes/Outer.Nested|null[0] constructor () // examples.classes/Outer.Nested.|(){}[0] + final enum class NE : kotlin/Enum { // examples.classes/Outer.Nested.NE|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 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] } + final inner class YetAnotherInner { // examples.classes/Outer.Nested.YetAnotherInner|null[0] constructor () // examples.classes/Outer.Nested.YetAnotherInner.|(){}[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 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] final fun (): kotlin/Long // examples.classes/OC.iy.|(){}[0] final val iz // examples.classes/OC.iz|{}iz[0] final fun (): kotlin/String // examples.classes/OC.iz.|(){}[0] + final var x // examples.classes/OC.x|{}x[0] final fun (): kotlin/Int // examples.classes/OC.x.|(){}[0] final fun (kotlin/Int) // examples.classes/OC.x.|(kotlin.Int){}[0] @@ -102,27 +132,34 @@ 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 39dcdc04..d142037d 100644 --- a/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.with.linux.dump +++ b/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.with.linux.dump @@ -9,90 +9,120 @@ 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 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 class examples.classes/IC : examples.classes/II { // examples.classes/IC|null[0] constructor () // examples.classes/IC.|(){}[0] } + final class examples.classes/Outer { // examples.classes/Outer|null[0] constructor () // examples.classes/Outer.|(){}[0] + final class Nested { // examples.classes/Outer.Nested|null[0] constructor () // examples.classes/Outer.Nested.|(){}[0] + final enum class NE : kotlin/Enum { // examples.classes/Outer.Nested.NE|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 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] } + final inner class YetAnotherInner { // examples.classes/Outer.Nested.YetAnotherInner|null[0] constructor () // examples.classes/Outer.Nested.YetAnotherInner.|(){}[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 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] final fun (): kotlin/Long // examples.classes/OC.iy.|(){}[0] final val iz // examples.classes/OC.iz|{}iz[0] final fun (): kotlin/String // examples.classes/OC.iz.|(){}[0] + final var x // examples.classes/OC.x|{}x[0] final fun (): kotlin/Int // examples.classes/OC.x.|(){}[0] final fun (kotlin/Int) // examples.classes/OC.x.|(kotlin.Int){}[0] @@ -102,27 +132,34 @@ 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 89fcb8c2de8429cd7f11ca58632ee261c09bd4e4 Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Mon, 27 May 2024 10:49:25 +0200 Subject: [PATCH 5/7] Added test case showcasing how target-specific declarations affect sorting --- .../validation/test/KlibVerificationTests.kt | 22 ++ .../TopLevelDeclarations.klib.diverging.dump | 238 ++++++++++++++++++ .../examples/classes/TopLevelDeclarations.kt | 2 +- .../TopLevelDeclarationsAndroidOnly.kt | 28 +++ .../classes/TopLevelDeclarationsExp.kt | 20 ++ .../classes/TopLevelDeclarationsLinuxOnly.kt | 38 +++ .../classes/TopLevelDeclarationsMingwOnly.kt | 27 ++ 7 files changed, 374 insertions(+), 1 deletion(-) create mode 100644 src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.diverging.dump create mode 100644 src/functionalTest/resources/examples/classes/TopLevelDeclarationsAndroidOnly.kt create mode 100644 src/functionalTest/resources/examples/classes/TopLevelDeclarationsExp.kt create mode 100644 src/functionalTest/resources/examples/classes/TopLevelDeclarationsLinuxOnly.kt create mode 100644 src/functionalTest/resources/examples/classes/TopLevelDeclarationsMingwOnly.kt diff --git a/src/functionalTest/kotlin/kotlinx/validation/test/KlibVerificationTests.kt b/src/functionalTest/kotlin/kotlinx/validation/test/KlibVerificationTests.kt index 793c3581..b8ee412c 100644 --- a/src/functionalTest/kotlin/kotlinx/validation/test/KlibVerificationTests.kt +++ b/src/functionalTest/kotlin/kotlinx/validation/test/KlibVerificationTests.kt @@ -357,6 +357,28 @@ internal class KlibVerificationTests : BaseKotlinGradleTest() { ) } + @Test + fun `check sorting for target-specific declarations`() { + val runner = test { + baseProjectSetting() + addToSrcSet("/examples/classes/TopLevelDeclarations.kt") + addToSrcSet("/examples/classes/TopLevelDeclarationsExp.kt") + addToSrcSet("/examples/classes/TopLevelDeclarationsLinuxOnly.kt", "linuxMain") + addToSrcSet("/examples/classes/TopLevelDeclarationsMingwOnly.kt", "mingwMain") + addToSrcSet("/examples/classes/TopLevelDeclarationsAndroidOnly.kt", "androidNativeMain") + + + runner { + arguments.add(":klibApiDump") + } + } + + checkKlibDump( + runner.build(), "/examples/classes/TopLevelDeclarations.klib.diverging.dump", + dumpTask = ":klibApiDump" + ) + } + @Test fun `infer a dump for a target with custom name`() { val runner = test { diff --git a/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.diverging.dump b/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.diverging.dump new file mode 100644 index 00000000..44f1d2b5 --- /dev/null +++ b/src/functionalTest/resources/examples/classes/TopLevelDeclarations.klib.diverging.dump @@ -0,0 +1,238 @@ +// Klib ABI Dump +// Targets: [androidNativeArm32, androidNativeArm64, androidNativeX64, androidNativeX86, linuxArm64, linuxX64, mingwX64] +// Alias: androidNative => [androidNativeArm32, androidNativeArm64, androidNativeX64, androidNativeX86] +// Alias: linux => [linuxArm64, linuxX64] +// Rendering settings: +// - Signature version: 2 +// - Show manifest properties: true +// - Show declarations: true + +// Library unique name: +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 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 class examples.classes/Exp { // examples.classes/Exp|null[0] + constructor (kotlin/Int, kotlin/Int) // examples.classes/Exp.|(kotlin.Int;kotlin.Int){}[0] + + final val vi1 // examples.classes/Exp.vi1|{}vi1[0] + final fun (): kotlin/Int // examples.classes/Exp.vi1.|(){}[0] + final val vi2 // examples.classes/Exp.vi2|{}vi2[0] + final fun (): kotlin/Int // examples.classes/Exp.vi2.|(){}[0] + final val vi3 // examples.classes/Exp.vi3|{}vi3[0] + final fun (): kotlin/Int // examples.classes/Exp.vi3.|(){}[0] + + final var v1 // examples.classes/Exp.v1|{}v1[0] + final fun (): kotlin/Int // examples.classes/Exp.v1.|(){}[0] + final fun (kotlin/Int) // examples.classes/Exp.v1.|(kotlin.Int){}[0] + final var v2 // examples.classes/Exp.v2|{}v2[0] + final fun (): kotlin/Int // examples.classes/Exp.v2.|(){}[0] + final fun (kotlin/Int) // examples.classes/Exp.v2.|(kotlin.Int){}[0] + final var v3 // examples.classes/Exp.v3|{}v3[0] + final fun (): kotlin/Int // examples.classes/Exp.v3.|(){}[0] + final fun (kotlin/Int) // examples.classes/Exp.v3.|(kotlin.Int){}[0] + + final fun a(): kotlin/Int // examples.classes/Exp.a|a(){}[0] + final fun b(): kotlin/Int // examples.classes/Exp.b|b(){}[0] + final fun c(): kotlin/Int // examples.classes/Exp.c|c(){}[0] + + // Targets: [linux, mingwX64] + final fun e(): kotlin/Int // examples.classes/Exp.e|e(){}[0] + + // Targets: [linux] + final val vi4 // examples.classes/Exp.vi4|{}vi4[0] + final fun (): kotlin/Int // examples.classes/Exp.vi4.|(){}[0] + + // Targets: [linux] + final var v4 // examples.classes/Exp.v4|{}v4[0] + final fun (): kotlin/Int // examples.classes/Exp.v4.|(){}[0] + final fun (kotlin/Int) // examples.classes/Exp.v4.|(kotlin.Int){}[0] + + // Targets: [linux] + final fun d(): kotlin/Int // examples.classes/Exp.d|d(){}[0] + + // Targets: [mingwX64] + final val vi5 // examples.classes/Exp.vi5|{}vi5[0] + final fun (): kotlin/Int // examples.classes/Exp.vi5.|(){}[0] + + // Targets: [mingwX64] + final fun f(): kotlin/Int // examples.classes/Exp.f|f(){}[0] +} + +final class examples.classes/IC : examples.classes/II { // examples.classes/IC|null[0] + constructor () // examples.classes/IC.|(){}[0] +} + +final class examples.classes/Outer { // examples.classes/Outer|null[0] + constructor () // examples.classes/Outer.|(){}[0] + + final class Nested { // examples.classes/Outer.Nested|null[0] + constructor () // examples.classes/Outer.Nested.|(){}[0] + + final enum class NE : kotlin/Enum { // examples.classes/Outer.Nested.NE|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 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] + } + + final inner class YetAnotherInner { // examples.classes/Outer.Nested.YetAnotherInner|null[0] + constructor () // examples.classes/Outer.Nested.YetAnotherInner.|(){}[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 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] + final fun (): kotlin/Long // examples.classes/OC.iy.|(){}[0] + final val iz // examples.classes/OC.iz|{}iz[0] + final fun (): kotlin/String // examples.classes/OC.iz.|(){}[0] + + final var x // examples.classes/OC.x|{}x[0] + final fun (): kotlin/Int // examples.classes/OC.x.|(){}[0] + final fun (kotlin/Int) // examples.classes/OC.x.|(kotlin.Int){}[0] + final var y // examples.classes/OC.y|{}y[0] + final fun (): kotlin/Int // examples.classes/OC.y.|(){}[0] + final fun (kotlin/Int) // examples.classes/OC.y.|(kotlin.Int){}[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] + +// Targets: [androidNative, linux] +final class examples.classes/AndroidAndLinuxClass { // examples.classes/AndroidAndLinuxClass|null[0] + constructor () // examples.classes/AndroidAndLinuxClass.|(){}[0] +} + +// Targets: [androidNative, linux] +final val examples.classes/androidAndLinuxVal // examples.classes/androidAndLinuxVal|{}androidAndLinuxVal[0] + final fun (): kotlin/Int // examples.classes/androidAndLinuxVal.|(){}[0] + +// Targets: [linux] +final class examples.classes/LinuxClass { // examples.classes/LinuxClass|null[0] + constructor () // examples.classes/LinuxClass.|(){}[0] +} + +// Targets: [linux] +final val examples.classes/linuxVal // examples.classes/linuxVal|{}linuxVal[0] + final fun (): kotlin/Int // examples.classes/linuxVal.|(){}[0] + +// Targets: [linux] +final fun examples.classes/anotherLinuxFun(): kotlin/Int // examples.classes/anotherLinuxFun|anotherLinuxFun(){}[0] + +// Targets: [linux] +final fun examples.classes/linuxFun(): kotlin/String // examples.classes/linuxFun|linuxFun(){}[0] diff --git a/src/functionalTest/resources/examples/classes/TopLevelDeclarations.kt b/src/functionalTest/resources/examples/classes/TopLevelDeclarations.kt index dd37bb1a..eb3c6c35 100644 --- a/src/functionalTest/resources/examples/classes/TopLevelDeclarations.kt +++ b/src/functionalTest/resources/examples/classes/TopLevelDeclarations.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2023 JetBrains s.r.o. + * Copyright 2016-2024 JetBrains s.r.o. * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. */ diff --git a/src/functionalTest/resources/examples/classes/TopLevelDeclarationsAndroidOnly.kt b/src/functionalTest/resources/examples/classes/TopLevelDeclarationsAndroidOnly.kt new file mode 100644 index 00000000..c5bc06d9 --- /dev/null +++ b/src/functionalTest/resources/examples/classes/TopLevelDeclarationsAndroidOnly.kt @@ -0,0 +1,28 @@ +/* + * Copyright 2016-2024 JetBrains s.r.o. + * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. + */ + +package examples.classes + +public actual class Exp { + constructor(a: Int, b: Int) { + + } + + actual fun a(): Int = 1 + actual fun b(): Int = 2 + actual fun c(): Int = 3 + + actual var v1: Int = 1 + actual var v2: Int = 2 + actual var v3: Int = 3 + + actual val vi1: Int = 4 + actual val vi2: Int = 5 + actual val vi3: Int = 6 +} + +val androidAndLinuxVal: Int = 0 + +class AndroidAndLinuxClass diff --git a/src/functionalTest/resources/examples/classes/TopLevelDeclarationsExp.kt b/src/functionalTest/resources/examples/classes/TopLevelDeclarationsExp.kt new file mode 100644 index 00000000..22180576 --- /dev/null +++ b/src/functionalTest/resources/examples/classes/TopLevelDeclarationsExp.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2016-2024 JetBrains s.r.o. + * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. + */ + +package examples.classes + +public expect class Exp { + fun a(): Int + fun b(): Int + fun c(): Int + + var v1: Int + var v2: Int + var v3: Int + + val vi1: Int + val vi2: Int + val vi3: Int +} diff --git a/src/functionalTest/resources/examples/classes/TopLevelDeclarationsLinuxOnly.kt b/src/functionalTest/resources/examples/classes/TopLevelDeclarationsLinuxOnly.kt new file mode 100644 index 00000000..2586b9a2 --- /dev/null +++ b/src/functionalTest/resources/examples/classes/TopLevelDeclarationsLinuxOnly.kt @@ -0,0 +1,38 @@ +/* + * Copyright 2016-2024 JetBrains s.r.o. + * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. + */ + +package examples.classes + +public fun linuxFun(): String = "123" +public fun anotherLinuxFun(): Int = 42 + +public class LinuxClass + +public actual class Exp { + constructor(a: Int, b: Int) { + + } + + actual fun a(): Int = 1 + actual fun b(): Int = 2 + actual fun c(): Int = 3 + fun d(): Int = 4 + fun e(): Int = 5 + + actual var v1: Int = 1 + actual var v2: Int = 2 + actual var v3: Int = 3 + var v4: Int = 4 + + actual val vi1: Int = 4 + actual val vi2: Int = 5 + actual val vi3: Int = 6 + val vi4: Int = 7 +} + +val androidAndLinuxVal: Int = 0 +val linuxVal: Int = 0 + +class AndroidAndLinuxClass diff --git a/src/functionalTest/resources/examples/classes/TopLevelDeclarationsMingwOnly.kt b/src/functionalTest/resources/examples/classes/TopLevelDeclarationsMingwOnly.kt new file mode 100644 index 00000000..566ffd01 --- /dev/null +++ b/src/functionalTest/resources/examples/classes/TopLevelDeclarationsMingwOnly.kt @@ -0,0 +1,27 @@ +/* + * Copyright 2016-2024 JetBrains s.r.o. + * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. + */ + +package examples.classes + +public actual class Exp { + constructor(a: Int, b: Int) { + + } + + actual fun a(): Int = 1 + actual fun b(): Int = 2 + actual fun c(): Int = 3 + fun e(): Int = 5 + fun f(): Int = 6 + + actual var v1: Int = 1 + actual var v2: Int = 2 + actual var v3: Int = 3 + + actual val vi1: Int = 4 + actual val vi2: Int = 5 + actual val vi3: Int = 6 + val vi5: Int = 7 +} From 12096dbf0b39967f467dec0328a7c30b84396dab Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Mon, 27 May 2024 15:22:40 +0200 Subject: [PATCH 6/7] Git should not update line separators for dumps --- .gitattributes | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..78455424 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.dump text eol=lf From 512b45b73908042cf665436a1075a8e8e36cc23d Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Mon, 10 Jun 2024 16:54:14 +0200 Subject: [PATCH 7/7] Updated ordering test --- src/test/kotlin/tests/KlibDumpTest.kt | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/test/kotlin/tests/KlibDumpTest.kt b/src/test/kotlin/tests/KlibDumpTest.kt index d206ca1c..fd9aaf16 100644 --- a/src/test/kotlin/tests/KlibDumpTest.kt +++ b/src/test/kotlin/tests/KlibDumpTest.kt @@ -758,56 +758,77 @@ class KlibDumpTest { 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]