Skip to content

Commit 01c3209

Browse files
authored
Add klib api validation (#62)
1 parent d0bfdd6 commit 01c3209

File tree

8 files changed

+187
-16
lines changed

8 files changed

+187
-16
lines changed

.github/workflows/CI.yml

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ jobs:
1111
fail-fast: false
1212
matrix:
1313
os: [ macos-latest, ubuntu-latest, windows-latest ]
14+
java-version: [ 11, 19 ]
1415

1516
runs-on: ${{ matrix.os }}
1617

@@ -42,33 +43,43 @@ jobs:
4243
key: ${{ runner.os }}-gradle-caches-${{ hashFiles('**/*.gradle.kts') }}-${{ hashFiles('gradle/libs.versions.toml') }}
4344
restore-keys: ${{ runner.os }}-gradle-caches-
4445

45-
# Windows does not build ANDROID, but needs Java 11 for JPMS Multi-Release Jar build
46-
- name: Setup JDK 11
47-
if: matrix.os == 'windows-latest'
46+
- name: Setup JDK
4847
uses: actions/setup-java@v3.4.0
4948
with:
5049
distribution: 'zulu'
51-
java-version: 11
50+
java-version: ${{ matrix.java-version }}
5251

53-
- name: Setup JDK 19
54-
if: matrix.os == 'ubuntu-latest' || matrix.os == 'macos-latest'
55-
uses: actions/setup-java@v3.4.0
56-
with:
57-
distribution: 'zulu'
58-
java-version: 19
52+
- name: Check API Compatibility
53+
if: matrix.os == 'macos-latest' && matrix.java-version == 19
54+
run: >
55+
./gradlew apiCheck --stacktrace
5956
6057
- name: Run macOS Tests
61-
if: matrix.os == 'macos-latest'
58+
if: matrix.os == 'macos-latest' && matrix.java-version == 19
6259
run: >
6360
./gradlew check --stacktrace
64-
-PKMP_TARGETS="JVM,JS,IOS_ARM64,IOS_X64,IOS_SIMULATOR_ARM64,MACOS_ARM64,MACOS_X64,TVOS_ARM64,TVOS_X64,TVOS_SIMULATOR_ARM64,WATCHOS_ARM32,WATCHOS_ARM64,WATCHOS_DEVICE_ARM64,WATCHOS_X64,WATCHOS_SIMULATOR_ARM64,WASM_JS,WASM_WASI"
61+
-PKMP_TARGETS="IOS_ARM64,IOS_X64,IOS_SIMULATOR_ARM64,JVM,MACOS_ARM64,MACOS_X64,TVOS_ARM64,TVOS_X64,TVOS_SIMULATOR_ARM64,WATCHOS_ARM32,WATCHOS_ARM64,WATCHOS_DEVICE_ARM64,WATCHOS_X64,WATCHOS_SIMULATOR_ARM64"
62+
63+
- name: Run macOS Java11 Tests
64+
if: matrix.os == 'macos-latest' && matrix.java-version == 11
65+
run: >
66+
./gradlew check --stacktrace
67+
-PKMP_TARGETS="JS,JVM,WASM_JS,WASM_WASI"
68+
6569
- name: Run Linux Tests
66-
if: matrix.os == 'ubuntu-latest'
70+
if: matrix.os == 'ubuntu-latest' && matrix.java-version == 19
71+
run: >
72+
./gradlew check --stacktrace
73+
-PKMP_TARGETS="ANDROID,ANDROID_ARM32,ANDROID_ARM64,ANDROID_X64,ANDROID_X86,JVM,LINUX_ARM64,LINUX_X64"
74+
75+
- name: Run Linux Java11 Tests
76+
if: matrix.os == 'ubuntu-latest' && matrix.java-version == 11
6777
run: >
6878
./gradlew check --stacktrace
69-
-PKMP_TARGETS="JVM,JS,ANDROID,ANDROID_ARM32,ANDROID_ARM64,ANDROID_X64,ANDROID_X86,LINUX_ARM64,LINUX_X64,WASM_JS,WASM_WASI"
79+
-PKMP_TARGETS="JS,JVM,WASM_JS,WASM_WASI"
80+
7081
- name: Run Windows Tests
71-
if: matrix.os == 'windows-latest'
82+
if: matrix.os == 'windows-latest' && matrix.java-version == 11
7283
run: >
7384
./gradlew check --stacktrace
7485
-PKMP_TARGETS="JVM,JS,MINGW_X64,WASM_JS,WASM_WASI"

build.gradle.kts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ plugins.withType<YarnPlugin> {
3737
}
3838

3939
apiValidation {
40+
// Only enable when selectively enabled targets are not being passed via cli.
41+
// See https://github.com/Kotlin/binary-compatibility-validator/issues/269
42+
@OptIn(kotlinx.validation.ExperimentalBCVApi::class)
43+
klib.enabled = findProperty("KMP_TARGETS") == null
44+
4045
if (findProperty("CHECK_PUBLICATION") != null) {
4146
ignoredProjects.add("check-publication")
4247
} else {

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[versions]
22
gradle-android = "8.2.2"
3-
gradle-binary-compat = "0.14.0"
3+
gradle-binary-compat = "0.16.3"
44
gradle-kmp-configuration = "0.3.2"
55
gradle-kotlin = "1.9.24"
66
gradle-publish-maven = "0.29.0"

library/common/api/common.klib.api

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Klib ABI Dump
2+
// Targets: [androidNativeArm32, androidNativeArm64, androidNativeX64, androidNativeX86, iosArm64, iosSimulatorArm64, iosX64, js, linuxArm64, linuxX64, macosArm64, macosX64, mingwX64, tvosArm64, tvosSimulatorArm64, tvosX64, wasmJs, wasmWasi, watchosArm32, watchosArm64, watchosDeviceArm64, watchosSimulatorArm64, watchosX64]
3+
// Rendering settings:
4+
// - Signature version: 2
5+
// - Show manifest properties: true
6+
// - Show declarations: true
7+
8+
// Library unique name: <org.kotlincrypto.core:common>
9+
open annotation class org.kotlincrypto.core/ExperimentalKotlinCryptoApi : kotlin/Annotation { // org.kotlincrypto.core/ExperimentalKotlinCryptoApi|null[0]
10+
constructor <init>() // org.kotlincrypto.core/ExperimentalKotlinCryptoApi.<init>|<init>(){}[0]
11+
}
12+
13+
open annotation class org.kotlincrypto.core/InternalKotlinCryptoApi : kotlin/Annotation { // org.kotlincrypto.core/InternalKotlinCryptoApi|null[0]
14+
constructor <init>() // org.kotlincrypto.core/InternalKotlinCryptoApi.<init>|<init>(){}[0]
15+
}
16+
17+
abstract interface <#A: out kotlin/Any> org.kotlincrypto.core/Copyable { // org.kotlincrypto.core/Copyable|null[0]
18+
abstract fun copy(): #A // org.kotlincrypto.core/Copyable.copy|copy(){}[0]
19+
}
20+
21+
abstract interface org.kotlincrypto.core/Algorithm { // org.kotlincrypto.core/Algorithm|null[0]
22+
abstract fun algorithm(): kotlin/String // org.kotlincrypto.core/Algorithm.algorithm|algorithm(){}[0]
23+
}
24+
25+
abstract interface org.kotlincrypto.core/Resettable { // org.kotlincrypto.core/Resettable|null[0]
26+
abstract fun reset() // org.kotlincrypto.core/Resettable.reset|reset(){}[0]
27+
}
28+
29+
abstract interface org.kotlincrypto.core/Updatable { // org.kotlincrypto.core/Updatable|null[0]
30+
abstract fun update(kotlin/Byte) // org.kotlincrypto.core/Updatable.update|update(kotlin.Byte){}[0]
31+
abstract fun update(kotlin/ByteArray) // org.kotlincrypto.core/Updatable.update|update(kotlin.ByteArray){}[0]
32+
abstract fun update(kotlin/ByteArray, kotlin/Int, kotlin/Int) // org.kotlincrypto.core/Updatable.update|update(kotlin.ByteArray;kotlin.Int;kotlin.Int){}[0]
33+
}

library/digest/api/digest.klib.api

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Klib ABI Dump
2+
// Targets: [androidNativeArm32, androidNativeArm64, androidNativeX64, androidNativeX86, iosArm64, iosSimulatorArm64, iosX64, js, linuxArm64, linuxX64, macosArm64, macosX64, mingwX64, tvosArm64, tvosSimulatorArm64, tvosX64, wasmJs, wasmWasi, watchosArm32, watchosArm64, watchosDeviceArm64, watchosSimulatorArm64, watchosX64]
3+
// Rendering settings:
4+
// - Signature version: 2
5+
// - Show manifest properties: true
6+
// - Show declarations: true
7+
8+
// Library unique name: <org.kotlincrypto.core:digest>
9+
abstract class org.kotlincrypto.core.digest/Digest : org.kotlincrypto.core/Algorithm, org.kotlincrypto.core/Copyable<org.kotlincrypto.core.digest/Digest>, org.kotlincrypto.core/Resettable, org.kotlincrypto.core/Updatable { // org.kotlincrypto.core.digest/Digest|null[0]
10+
abstract fun compress(kotlin/ByteArray, kotlin/Int) // org.kotlincrypto.core.digest/Digest.compress|compress(kotlin.ByteArray;kotlin.Int){}[0]
11+
abstract fun copy(org.kotlincrypto.core.digest.internal/DigestState): org.kotlincrypto.core.digest/Digest // org.kotlincrypto.core.digest/Digest.copy|copy(org.kotlincrypto.core.digest.internal.DigestState){}[0]
12+
abstract fun digest(kotlin/Long, kotlin/Int, kotlin/ByteArray): kotlin/ByteArray // org.kotlincrypto.core.digest/Digest.digest|digest(kotlin.Long;kotlin.Int;kotlin.ByteArray){}[0]
13+
abstract fun resetDigest() // org.kotlincrypto.core.digest/Digest.resetDigest|resetDigest(){}[0]
14+
final fun algorithm(): kotlin/String // org.kotlincrypto.core.digest/Digest.algorithm|algorithm(){}[0]
15+
final fun blockSize(): kotlin/Int // org.kotlincrypto.core.digest/Digest.blockSize|blockSize(){}[0]
16+
final fun copy(): org.kotlincrypto.core.digest/Digest // org.kotlincrypto.core.digest/Digest.copy|copy(){}[0]
17+
final fun digest(): kotlin/ByteArray // org.kotlincrypto.core.digest/Digest.digest|digest(){}[0]
18+
final fun digest(kotlin/ByteArray): kotlin/ByteArray // org.kotlincrypto.core.digest/Digest.digest|digest(kotlin.ByteArray){}[0]
19+
final fun digestLength(): kotlin/Int // org.kotlincrypto.core.digest/Digest.digestLength|digestLength(){}[0]
20+
final fun equals(kotlin/Any?): kotlin/Boolean // org.kotlincrypto.core.digest/Digest.equals|equals(kotlin.Any?){}[0]
21+
final fun hashCode(): kotlin/Int // org.kotlincrypto.core.digest/Digest.hashCode|hashCode(){}[0]
22+
final fun reset() // org.kotlincrypto.core.digest/Digest.reset|reset(){}[0]
23+
final fun toString(): kotlin/String // org.kotlincrypto.core.digest/Digest.toString|toString(){}[0]
24+
final fun update(kotlin/ByteArray) // org.kotlincrypto.core.digest/Digest.update|update(kotlin.ByteArray){}[0]
25+
final fun update(kotlin/ByteArray, kotlin/Int, kotlin/Int) // org.kotlincrypto.core.digest/Digest.update|update(kotlin.ByteArray;kotlin.Int;kotlin.Int){}[0]
26+
open fun update(kotlin/Byte) // org.kotlincrypto.core.digest/Digest.update|update(kotlin.Byte){}[0]
27+
open fun updateDigest(kotlin/Byte) // org.kotlincrypto.core.digest/Digest.updateDigest|updateDigest(kotlin.Byte){}[0]
28+
open fun updateDigest(kotlin/ByteArray, kotlin/Int, kotlin/Int) // org.kotlincrypto.core.digest/Digest.updateDigest|updateDigest(kotlin.ByteArray;kotlin.Int;kotlin.Int){}[0]
29+
}
30+
31+
sealed class org.kotlincrypto.core.digest.internal/DigestState { // org.kotlincrypto.core.digest.internal/DigestState|null[0]
32+
constructor <init>(kotlin/String, kotlin/Int, kotlin/Int) // org.kotlincrypto.core.digest.internal/DigestState.<init>|<init>(kotlin.String;kotlin.Int;kotlin.Int){}[0]
33+
}

library/mac/api/mac.klib.api

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// Klib ABI Dump
2+
// Targets: [androidNativeArm32, androidNativeArm64, androidNativeX64, androidNativeX86, iosArm64, iosSimulatorArm64, iosX64, js, linuxArm64, linuxX64, macosArm64, macosX64, mingwX64, tvosArm64, tvosSimulatorArm64, tvosX64, wasmJs, wasmWasi, watchosArm32, watchosArm64, watchosDeviceArm64, watchosSimulatorArm64, watchosX64]
3+
// Rendering settings:
4+
// - Signature version: 2
5+
// - Show manifest properties: true
6+
// - Show declarations: true
7+
8+
// Library unique name: <org.kotlincrypto.core:mac>
9+
abstract class org.kotlincrypto.core.mac/Mac : org.kotlincrypto.core/Algorithm, org.kotlincrypto.core/Copyable<org.kotlincrypto.core.mac/Mac>, org.kotlincrypto.core/Resettable, org.kotlincrypto.core/Updatable { // org.kotlincrypto.core.mac/Mac|null[0]
10+
abstract fun copy(org.kotlincrypto.core.mac/Mac.Engine): org.kotlincrypto.core.mac/Mac // org.kotlincrypto.core.mac/Mac.copy|copy(org.kotlincrypto.core.mac.Mac.Engine){}[0]
11+
final fun algorithm(): kotlin/String // org.kotlincrypto.core.mac/Mac.algorithm|algorithm(){}[0]
12+
final fun copy(): org.kotlincrypto.core.mac/Mac // org.kotlincrypto.core.mac/Mac.copy|copy(){}[0]
13+
final fun doFinal(): kotlin/ByteArray // org.kotlincrypto.core.mac/Mac.doFinal|doFinal(){}[0]
14+
final fun doFinal(kotlin/ByteArray): kotlin/ByteArray // org.kotlincrypto.core.mac/Mac.doFinal|doFinal(kotlin.ByteArray){}[0]
15+
final fun equals(kotlin/Any?): kotlin/Boolean // org.kotlincrypto.core.mac/Mac.equals|equals(kotlin.Any?){}[0]
16+
final fun hashCode(): kotlin/Int // org.kotlincrypto.core.mac/Mac.hashCode|hashCode(){}[0]
17+
final fun macLength(): kotlin/Int // org.kotlincrypto.core.mac/Mac.macLength|macLength(){}[0]
18+
final fun reset() // org.kotlincrypto.core.mac/Mac.reset|reset(){}[0]
19+
final fun toString(): kotlin/String // org.kotlincrypto.core.mac/Mac.toString|toString(){}[0]
20+
final fun update(kotlin/Byte) // org.kotlincrypto.core.mac/Mac.update|update(kotlin.Byte){}[0]
21+
final fun update(kotlin/ByteArray) // org.kotlincrypto.core.mac/Mac.update|update(kotlin.ByteArray){}[0]
22+
final fun update(kotlin/ByteArray, kotlin/Int, kotlin/Int) // org.kotlincrypto.core.mac/Mac.update|update(kotlin.ByteArray;kotlin.Int;kotlin.Int){}[0]
23+
24+
abstract class Engine : org.kotlincrypto.core/Copyable<org.kotlincrypto.core.mac/Mac.Engine>, org.kotlincrypto.core/Resettable, org.kotlincrypto.core/Updatable { // org.kotlincrypto.core.mac/Mac.Engine|null[0]
25+
abstract fun doFinal(): kotlin/ByteArray // org.kotlincrypto.core.mac/Mac.Engine.doFinal|doFinal(){}[0]
26+
abstract fun macLength(): kotlin/Int // org.kotlincrypto.core.mac/Mac.Engine.macLength|macLength(){}[0]
27+
final fun equals(kotlin/Any?): kotlin/Boolean // org.kotlincrypto.core.mac/Mac.Engine.equals|equals(kotlin.Any?){}[0]
28+
final fun hashCode(): kotlin/Int // org.kotlincrypto.core.mac/Mac.Engine.hashCode|hashCode(){}[0]
29+
open fun update(kotlin/ByteArray) // org.kotlincrypto.core.mac/Mac.Engine.update|update(kotlin.ByteArray){}[0]
30+
31+
abstract inner class State { // org.kotlincrypto.core.mac/Mac.Engine.State|null[0]
32+
constructor <init>() // org.kotlincrypto.core.mac/Mac.Engine.State.<init>|<init>(){}[0]
33+
}
34+
}
35+
}

library/xof/api/xof.klib.api

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
// Klib ABI Dump
2+
// Targets: [androidNativeArm32, androidNativeArm64, androidNativeX64, androidNativeX86, iosArm64, iosSimulatorArm64, iosX64, js, linuxArm64, linuxX64, macosArm64, macosX64, mingwX64, tvosArm64, tvosSimulatorArm64, tvosX64, wasmJs, wasmWasi, watchosArm32, watchosArm64, watchosDeviceArm64, watchosSimulatorArm64, watchosX64]
3+
// Rendering settings:
4+
// - Signature version: 2
5+
// - Show manifest properties: true
6+
// - Show declarations: true
7+
8+
// Library unique name: <org.kotlincrypto.core:xof>
9+
abstract interface org.kotlincrypto.core.xof/XofAlgorithm : org.kotlincrypto.core/Algorithm // org.kotlincrypto.core.xof/XofAlgorithm|null[0]
10+
11+
abstract class <#A: org.kotlincrypto.core.xof/XofAlgorithm> org.kotlincrypto.core.xof/XofFactory { // org.kotlincrypto.core.xof/XofFactory|null[0]
12+
abstract inner class XofDelegate : org.kotlincrypto.core.xof/Xof<#A>, org.kotlincrypto.core/Algorithm, org.kotlincrypto.core/Resettable, org.kotlincrypto.core/Updatable { // org.kotlincrypto.core.xof/XofFactory.XofDelegate|null[0]
13+
constructor <init>(#A) // org.kotlincrypto.core.xof/XofFactory.XofDelegate.<init>|<init>(2:0){}[0]
14+
15+
final val delegate // org.kotlincrypto.core.xof/XofFactory.XofDelegate.delegate|{}delegate[0]
16+
final fun <get-delegate>(): #A // org.kotlincrypto.core.xof/XofFactory.XofDelegate.delegate.<get-delegate>|<get-delegate>(){}[0]
17+
18+
abstract fun newReader(#A): org.kotlincrypto.core.xof/Xof.Reader<#A> // org.kotlincrypto.core.xof/XofFactory.XofDelegate.newReader|newReader(2:0){}[0]
19+
final fun equals(kotlin/Any?): kotlin/Boolean // org.kotlincrypto.core.xof/XofFactory.XofDelegate.equals|equals(kotlin.Any?){}[0]
20+
final fun hashCode(): kotlin/Int // org.kotlincrypto.core.xof/XofFactory.XofDelegate.hashCode|hashCode(){}[0]
21+
final fun newReader(): org.kotlincrypto.core.xof/Xof.Reader<#A> // org.kotlincrypto.core.xof/XofFactory.XofDelegate.newReader|newReader(){}[0]
22+
open fun algorithm(): kotlin/String // org.kotlincrypto.core.xof/XofFactory.XofDelegate.algorithm|algorithm(){}[0]
23+
open fun reset() // org.kotlincrypto.core.xof/XofFactory.XofDelegate.reset|reset(){}[0]
24+
open fun update(kotlin/Byte) // org.kotlincrypto.core.xof/XofFactory.XofDelegate.update|update(kotlin.Byte){}[0]
25+
open fun update(kotlin/ByteArray) // org.kotlincrypto.core.xof/XofFactory.XofDelegate.update|update(kotlin.ByteArray){}[0]
26+
open fun update(kotlin/ByteArray, kotlin/Int, kotlin/Int) // org.kotlincrypto.core.xof/XofFactory.XofDelegate.update|update(kotlin.ByteArray;kotlin.Int;kotlin.Int){}[0]
27+
}
28+
}
29+
30+
sealed class <#A: org.kotlincrypto.core.xof/XofAlgorithm> org.kotlincrypto.core.xof/Xof : org.kotlincrypto.core/Algorithm, org.kotlincrypto.core/Copyable<org.kotlincrypto.core.xof/Xof<#A>>, org.kotlincrypto.core/Resettable, org.kotlincrypto.core/Updatable { // org.kotlincrypto.core.xof/Xof|null[0]
31+
constructor <init>() // org.kotlincrypto.core.xof/Xof.<init>|<init>(){}[0]
32+
33+
abstract fun newReader(): org.kotlincrypto.core.xof/Xof.Reader<#A> // org.kotlincrypto.core.xof/Xof.newReader|newReader(){}[0]
34+
final fun <#A1: kotlin/Any?> use(kotlin/Boolean =..., kotlin/Function1<org.kotlincrypto.core.xof/Xof.Reader<#A>, #A1>): #A1 // org.kotlincrypto.core.xof/Xof.use|use(kotlin.Boolean;kotlin.Function1<org.kotlincrypto.core.xof.Xof.Reader<1:0>,0:0>){0§<kotlin.Any?>}[0]
35+
final fun reader(kotlin/Boolean =...): org.kotlincrypto.core.xof/Xof.Reader<#A> // org.kotlincrypto.core.xof/Xof.reader|reader(kotlin.Boolean){}[0]
36+
final fun toString(): kotlin/String // org.kotlincrypto.core.xof/Xof.toString|toString(){}[0]
37+
38+
abstract inner class Reader { // org.kotlincrypto.core.xof/Xof.Reader|null[0]
39+
constructor <init>() // org.kotlincrypto.core.xof/Xof.Reader.<init>|<init>(){}[0]
40+
41+
final var bytesRead // org.kotlincrypto.core.xof/Xof.Reader.bytesRead|{}bytesRead[0]
42+
final fun <get-bytesRead>(): kotlin/Long // org.kotlincrypto.core.xof/Xof.Reader.bytesRead.<get-bytesRead>|<get-bytesRead>(){}[0]
43+
final var isClosed // org.kotlincrypto.core.xof/Xof.Reader.isClosed|{}isClosed[0]
44+
final fun <get-isClosed>(): kotlin/Boolean // org.kotlincrypto.core.xof/Xof.Reader.isClosed.<get-isClosed>|<get-isClosed>(){}[0]
45+
46+
abstract fun closeProtected() // org.kotlincrypto.core.xof/Xof.Reader.closeProtected|closeProtected(){}[0]
47+
abstract fun readProtected(kotlin/ByteArray, kotlin/Int, kotlin/Int, kotlin/Long) // org.kotlincrypto.core.xof/Xof.Reader.readProtected|readProtected(kotlin.ByteArray;kotlin.Int;kotlin.Int;kotlin.Long){}[0]
48+
final fun <#A2: kotlin/Any?> use(kotlin/Function1<org.kotlincrypto.core.xof/Xof.Reader<#A>, #A2>): #A2 // org.kotlincrypto.core.xof/Xof.Reader.use|use(kotlin.Function1<org.kotlincrypto.core.xof.Xof.Reader<2:0>,0:0>){0§<kotlin.Any?>}[0]
49+
final fun close() // org.kotlincrypto.core.xof/Xof.Reader.close|close(){}[0]
50+
final fun read(kotlin/ByteArray): kotlin/Int // org.kotlincrypto.core.xof/Xof.Reader.read|read(kotlin.ByteArray){}[0]
51+
final fun read(kotlin/ByteArray, kotlin/Int, kotlin/Int): kotlin/Int // org.kotlincrypto.core.xof/Xof.Reader.read|read(kotlin.ByteArray;kotlin.Int;kotlin.Int){}[0]
52+
final fun toString(): kotlin/String // org.kotlincrypto.core.xof/Xof.Reader.toString|toString(){}[0]
53+
}
54+
}

test-android/api/test-android.klib.api

Whitespace-only changes.

0 commit comments

Comments
 (0)