From 585d24b446c7e0056942b0a9d8fcd985d26cf76c Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Mon, 25 Mar 2024 10:11:04 +0100 Subject: [PATCH] Correctly handle dumps starting with Targets-list Fixes #201 --- .../kotlin/api/klib/KlibAbiDumpFileMerger.kt | 2 +- src/test/kotlin/tests/KlibAbiMergingTest.kt | 24 +++++++++++++++++++ .../non-overlapping/linux-arm64.klib.abi | 9 +++++++ .../merge/non-overlapping/linux-x64.klib.abi | 9 +++++++ .../merge/non-overlapping/merged.klib.abi | 12 ++++++++++ 5 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 src/test/resources/merge/non-overlapping/linux-arm64.klib.abi create mode 100644 src/test/resources/merge/non-overlapping/linux-x64.klib.abi create mode 100644 src/test/resources/merge/non-overlapping/merged.klib.abi 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]