diff --git a/src/main/kotlin/api/klib/KlibAbiDumpFileMerger.kt b/src/main/kotlin/api/klib/KlibAbiDumpFileMerger.kt index a5eddc7e..529c670f 100644 --- a/src/main/kotlin/api/klib/KlibAbiDumpFileMerger.kt +++ b/src/main/kotlin/api/klib/KlibAbiDumpFileMerger.kt @@ -254,7 +254,7 @@ internal class KlibAbiDumpMerger { // then try to parse a manifest while (hasNext()) { val next = peek()!! - if (!next.startsWith(COMMENT_PREFIX)) break + if (!next.startsWith(COMMENT_PREFIX) || next.startsWith(TARGETS_LIST_PREFIX)) break next() // There's no manifest in merged files check(!isMergedFile) { "Unexpected header line: $next" } diff --git a/src/test/kotlin/tests/KlibAbiMergingTest.kt b/src/test/kotlin/tests/KlibAbiMergingTest.kt index b4fdf42c..0c557530 100644 --- a/src/test/kotlin/tests/KlibAbiMergingTest.kt +++ b/src/test/kotlin/tests/KlibAbiMergingTest.kt @@ -336,4 +336,28 @@ class KlibAbiMergingTest { KlibAbiDumpMerger().merge(file("/merge/stdlib_native_common.abi"), "target") } } + + @Test + fun mergeDumpsWithNonOverlappingDeclarations() { + val dump = dumpToFile(KlibAbiDumpMerger().apply { + merge(file("/merge/non-overlapping/linux-arm64.klib.abi")) + merge(file("/merge/non-overlapping/linux-x64.klib.abi")) + }) + + assertContentEquals( + lines("/merge/non-overlapping/merged.klib.abi"), + Files.readAllLines(dump.toPath()).asSequence() + ) + } + + @Test + fun loadMergedDumpWithNonOverlappingDeclarations() { + val dump = dumpToFile(KlibAbiDumpMerger().apply { + merge(file("/merge/non-overlapping/merged.klib.abi")) + }) + assertContentEquals( + lines("/merge/non-overlapping/merged.klib.abi"), + Files.readAllLines(dump.toPath()).asSequence() + ) + } } diff --git a/src/test/resources/merge/non-overlapping/linux-arm64.klib.abi b/src/test/resources/merge/non-overlapping/linux-arm64.klib.abi new file mode 100644 index 00000000..f4dfa093 --- /dev/null +++ b/src/test/resources/merge/non-overlapping/linux-arm64.klib.abi @@ -0,0 +1,9 @@ +// Klib ABI Dump +// Targets: [linuxArm64] +// Rendering settings: +// - Signature version: 2 +// - Show manifest properties: false +// - Show declarations: true + +// Library unique name: +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/non-overlapping/linux-x64.klib.abi b/src/test/resources/merge/non-overlapping/linux-x64.klib.abi new file mode 100644 index 00000000..bb7ad179 --- /dev/null +++ b/src/test/resources/merge/non-overlapping/linux-x64.klib.abi @@ -0,0 +1,9 @@ +// Klib ABI Dump +// Targets: [linuxX64] +// Rendering settings: +// - Signature version: 2 +// - Show manifest properties: false +// - Show declarations: true + +// Library unique name: +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/non-overlapping/merged.klib.abi b/src/test/resources/merge/non-overlapping/merged.klib.abi new file mode 100644 index 00000000..a1f33e22 --- /dev/null +++ b/src/test/resources/merge/non-overlapping/merged.klib.abi @@ -0,0 +1,12 @@ +// Klib ABI Dump +// Targets: [linuxArm64, linuxX64] +// Rendering settings: +// - Signature version: 2 +// - Show manifest properties: false +// - Show declarations: true + +// 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]