Skip to content

Commit 872d743

Browse files
committed
Added test case showcasing how target-specific declarations affect sorting
1 parent c07e901 commit 872d743

File tree

7 files changed

+374
-1
lines changed

7 files changed

+374
-1
lines changed

src/functionalTest/kotlin/kotlinx/validation/test/KlibVerificationTests.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,28 @@ internal class KlibVerificationTests : BaseKotlinGradleTest() {
357357
)
358358
}
359359

360+
@Test
361+
fun `check sorting for target-specific declarations`() {
362+
val runner = test {
363+
baseProjectSetting()
364+
addToSrcSet("/examples/classes/TopLevelDeclarations.kt")
365+
addToSrcSet("/examples/classes/TopLevelDeclarationsExp.kt")
366+
addToSrcSet("/examples/classes/TopLevelDeclarationsLinuxOnly.kt", "linuxMain")
367+
addToSrcSet("/examples/classes/TopLevelDeclarationsMingwOnly.kt", "mingwMain")
368+
addToSrcSet("/examples/classes/TopLevelDeclarationsAndroidOnly.kt", "androidNativeMain")
369+
370+
371+
runner {
372+
arguments.add(":klibApiDump")
373+
}
374+
}
375+
376+
checkKlibDump(
377+
runner.build(), "/examples/classes/TopLevelDeclarations.klib.diverging.dump",
378+
dumpTask = ":klibApiDump"
379+
)
380+
}
381+
360382
@Test
361383
fun `infer a dump for a target with custom name`() {
362384
val runner = test {
Lines changed: 238 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,238 @@
1+
// Klib ABI Dump
2+
// Targets: [androidNativeArm32, androidNativeArm64, androidNativeX64, androidNativeX86, linuxArm64, linuxX64, mingwX64]
3+
// Alias: androidNative => [androidNativeArm32, androidNativeArm64, androidNativeX64, androidNativeX86]
4+
// Alias: linux => [linuxArm64, linuxX64]
5+
// Rendering settings:
6+
// - Signature version: 2
7+
// - Show manifest properties: true
8+
// - Show declarations: true
9+
10+
// Library unique name: <testproject>
11+
open annotation class examples.classes/A : kotlin/Annotation { // examples.classes/A|null[0]
12+
constructor <init>() // examples.classes/A.<init>|<init>(){}[0]
13+
}
14+
15+
open annotation class examples.classes/AA : kotlin/Annotation { // examples.classes/AA|null[0]
16+
constructor <init>() // examples.classes/AA.<init>|<init>(){}[0]
17+
}
18+
19+
open annotation class examples.classes/AAA : kotlin/Annotation { // examples.classes/AAA|null[0]
20+
constructor <init>() // examples.classes/AAA.<init>|<init>(){}[0]
21+
}
22+
23+
final enum class examples.classes/E : kotlin/Enum<examples.classes/E> { // examples.classes/E|null[0]
24+
enum entry A // examples.classes/E.A|null[0]
25+
enum entry B // examples.classes/E.B|null[0]
26+
enum entry C // examples.classes/E.C|null[0]
27+
28+
final val entries // examples.classes/E.entries|#static{}entries[0]
29+
final fun <get-entries>(): kotlin.enums/EnumEntries<examples.classes/E> // examples.classes/E.entries.<get-entries>|<get-entries>#static(){}[0]
30+
31+
final fun valueOf(kotlin/String): examples.classes/E // examples.classes/E.valueOf|valueOf#static(kotlin.String){}[0]
32+
final fun values(): kotlin/Array<examples.classes/E> // examples.classes/E.values|values#static(){}[0]
33+
}
34+
35+
final enum class examples.classes/EE : kotlin/Enum<examples.classes/EE> { // examples.classes/EE|null[0]
36+
enum entry AA // examples.classes/EE.AA|null[0]
37+
enum entry BB // examples.classes/EE.BB|null[0]
38+
enum entry CC // examples.classes/EE.CC|null[0]
39+
40+
final val entries // examples.classes/EE.entries|#static{}entries[0]
41+
final fun <get-entries>(): kotlin.enums/EnumEntries<examples.classes/EE> // examples.classes/EE.entries.<get-entries>|<get-entries>#static(){}[0]
42+
43+
final fun valueOf(kotlin/String): examples.classes/EE // examples.classes/EE.valueOf|valueOf#static(kotlin.String){}[0]
44+
final fun values(): kotlin/Array<examples.classes/EE> // examples.classes/EE.values|values#static(){}[0]
45+
}
46+
47+
abstract fun interface examples.classes/FI { // examples.classes/FI|null[0]
48+
abstract fun a() // examples.classes/FI.a|a(){}[0]
49+
}
50+
51+
abstract interface examples.classes/I // examples.classes/I|null[0]
52+
53+
abstract interface examples.classes/II // examples.classes/II|null[0]
54+
55+
abstract class examples.classes/AC { // examples.classes/AC|null[0]
56+
constructor <init>() // examples.classes/AC.<init>|<init>(){}[0]
57+
58+
abstract fun a() // examples.classes/AC.a|a(){}[0]
59+
final fun b() // examples.classes/AC.b|b(){}[0]
60+
}
61+
62+
final class examples.classes/C { // examples.classes/C|null[0]
63+
constructor <init>(kotlin/Any) // examples.classes/C.<init>|<init>(kotlin.Any){}[0]
64+
65+
final val v // examples.classes/C.v|{}v[0]
66+
final fun <get-v>(): kotlin/Any // examples.classes/C.v.<get-v>|<get-v>(){}[0]
67+
68+
final fun m() // examples.classes/C.m|m(){}[0]
69+
}
70+
71+
final class examples.classes/D { // examples.classes/D|null[0]
72+
constructor <init>(kotlin/Int) // examples.classes/D.<init>|<init>(kotlin.Int){}[0]
73+
74+
final val x // examples.classes/D.x|{}x[0]
75+
final fun <get-x>(): kotlin/Int // examples.classes/D.x.<get-x>|<get-x>(){}[0]
76+
77+
final fun component1(): kotlin/Int // examples.classes/D.component1|component1(){}[0]
78+
final fun copy(kotlin/Int =...): examples.classes/D // examples.classes/D.copy|copy(kotlin.Int){}[0]
79+
final fun equals(kotlin/Any?): kotlin/Boolean // examples.classes/D.equals|equals(kotlin.Any?){}[0]
80+
final fun hashCode(): kotlin/Int // examples.classes/D.hashCode|hashCode(){}[0]
81+
final fun toString(): kotlin/String // examples.classes/D.toString|toString(){}[0]
82+
}
83+
84+
final class examples.classes/Exp { // examples.classes/Exp|null[0]
85+
constructor <init>(kotlin/Int, kotlin/Int) // examples.classes/Exp.<init>|<init>(kotlin.Int;kotlin.Int){}[0]
86+
87+
final val vi1 // examples.classes/Exp.vi1|{}vi1[0]
88+
final fun <get-vi1>(): kotlin/Int // examples.classes/Exp.vi1.<get-vi1>|<get-vi1>(){}[0]
89+
final val vi2 // examples.classes/Exp.vi2|{}vi2[0]
90+
final fun <get-vi2>(): kotlin/Int // examples.classes/Exp.vi2.<get-vi2>|<get-vi2>(){}[0]
91+
final val vi3 // examples.classes/Exp.vi3|{}vi3[0]
92+
final fun <get-vi3>(): kotlin/Int // examples.classes/Exp.vi3.<get-vi3>|<get-vi3>(){}[0]
93+
94+
final var v1 // examples.classes/Exp.v1|{}v1[0]
95+
final fun <get-v1>(): kotlin/Int // examples.classes/Exp.v1.<get-v1>|<get-v1>(){}[0]
96+
final fun <set-v1>(kotlin/Int) // examples.classes/Exp.v1.<set-v1>|<set-v1>(kotlin.Int){}[0]
97+
final var v2 // examples.classes/Exp.v2|{}v2[0]
98+
final fun <get-v2>(): kotlin/Int // examples.classes/Exp.v2.<get-v2>|<get-v2>(){}[0]
99+
final fun <set-v2>(kotlin/Int) // examples.classes/Exp.v2.<set-v2>|<set-v2>(kotlin.Int){}[0]
100+
final var v3 // examples.classes/Exp.v3|{}v3[0]
101+
final fun <get-v3>(): kotlin/Int // examples.classes/Exp.v3.<get-v3>|<get-v3>(){}[0]
102+
final fun <set-v3>(kotlin/Int) // examples.classes/Exp.v3.<set-v3>|<set-v3>(kotlin.Int){}[0]
103+
104+
final fun a(): kotlin/Int // examples.classes/Exp.a|a(){}[0]
105+
final fun b(): kotlin/Int // examples.classes/Exp.b|b(){}[0]
106+
final fun c(): kotlin/Int // examples.classes/Exp.c|c(){}[0]
107+
108+
// Targets: [linux, mingwX64]
109+
final fun e(): kotlin/Int // examples.classes/Exp.e|e(){}[0]
110+
111+
// Targets: [linux]
112+
final val vi4 // examples.classes/Exp.vi4|{}vi4[0]
113+
final fun <get-vi4>(): kotlin/Int // examples.classes/Exp.vi4.<get-vi4>|<get-vi4>(){}[0]
114+
115+
// Targets: [linux]
116+
final var v4 // examples.classes/Exp.v4|{}v4[0]
117+
final fun <get-v4>(): kotlin/Int // examples.classes/Exp.v4.<get-v4>|<get-v4>(){}[0]
118+
final fun <set-v4>(kotlin/Int) // examples.classes/Exp.v4.<set-v4>|<set-v4>(kotlin.Int){}[0]
119+
120+
// Targets: [linux]
121+
final fun d(): kotlin/Int // examples.classes/Exp.d|d(){}[0]
122+
123+
// Targets: [mingwX64]
124+
final val vi5 // examples.classes/Exp.vi5|{}vi5[0]
125+
final fun <get-vi5>(): kotlin/Int // examples.classes/Exp.vi5.<get-vi5>|<get-vi5>(){}[0]
126+
127+
// Targets: [mingwX64]
128+
final fun f(): kotlin/Int // examples.classes/Exp.f|f(){}[0]
129+
}
130+
131+
final class examples.classes/IC : examples.classes/II { // examples.classes/IC|null[0]
132+
constructor <init>() // examples.classes/IC.<init>|<init>(){}[0]
133+
}
134+
135+
final class examples.classes/Outer { // examples.classes/Outer|null[0]
136+
constructor <init>() // examples.classes/Outer.<init>|<init>(){}[0]
137+
138+
final class Nested { // examples.classes/Outer.Nested|null[0]
139+
constructor <init>() // examples.classes/Outer.Nested.<init>|<init>(){}[0]
140+
141+
final enum class NE : kotlin/Enum<examples.classes/Outer.Nested.NE> { // examples.classes/Outer.Nested.NE|null[0]
142+
enum entry A // examples.classes/Outer.Nested.NE.A|null[0]
143+
enum entry B // examples.classes/Outer.Nested.NE.B|null[0]
144+
enum entry C // examples.classes/Outer.Nested.NE.C|null[0]
145+
146+
final val entries // examples.classes/Outer.Nested.NE.entries|#static{}entries[0]
147+
final fun <get-entries>(): kotlin.enums/EnumEntries<examples.classes/Outer.Nested.NE> // examples.classes/Outer.Nested.NE.entries.<get-entries>|<get-entries>#static(){}[0]
148+
149+
final fun valueOf(kotlin/String): examples.classes/Outer.Nested.NE // examples.classes/Outer.Nested.NE.valueOf|valueOf#static(kotlin.String){}[0]
150+
final fun values(): kotlin/Array<examples.classes/Outer.Nested.NE> // examples.classes/Outer.Nested.NE.values|values#static(){}[0]
151+
}
152+
153+
final inner class Inner { // examples.classes/Outer.Nested.Inner|null[0]
154+
constructor <init>() // examples.classes/Outer.Nested.Inner.<init>|<init>(){}[0]
155+
}
156+
157+
final inner class YetAnotherInner { // examples.classes/Outer.Nested.YetAnotherInner|null[0]
158+
constructor <init>() // examples.classes/Outer.Nested.YetAnotherInner.<init>|<init>(){}[0]
159+
}
160+
}
161+
}
162+
163+
open class examples.classes/OC { // examples.classes/OC|null[0]
164+
constructor <init>(kotlin/Int) // examples.classes/OC.<init>|<init>(kotlin.Int){}[0]
165+
constructor <init>(kotlin/Long) // examples.classes/OC.<init>|<init>(kotlin.Long){}[0]
166+
constructor <init>(kotlin/String) // examples.classes/OC.<init>|<init>(kotlin.String){}[0]
167+
168+
final val ix // examples.classes/OC.ix|{}ix[0]
169+
final fun <get-ix>(): kotlin/Int // examples.classes/OC.ix.<get-ix>|<get-ix>(){}[0]
170+
final val iy // examples.classes/OC.iy|{}iy[0]
171+
final fun <get-iy>(): kotlin/Long // examples.classes/OC.iy.<get-iy>|<get-iy>(){}[0]
172+
final val iz // examples.classes/OC.iz|{}iz[0]
173+
final fun <get-iz>(): kotlin/String // examples.classes/OC.iz.<get-iz>|<get-iz>(){}[0]
174+
175+
final var x // examples.classes/OC.x|{}x[0]
176+
final fun <get-x>(): kotlin/Int // examples.classes/OC.x.<get-x>|<get-x>(){}[0]
177+
final fun <set-x>(kotlin/Int) // examples.classes/OC.x.<set-x>|<set-x>(kotlin.Int){}[0]
178+
final var y // examples.classes/OC.y|{}y[0]
179+
final fun <get-y>(): kotlin/Int // examples.classes/OC.y.<get-y>|<get-y>(){}[0]
180+
final fun <set-y>(kotlin/Int) // examples.classes/OC.y.<set-y>|<set-y>(kotlin.Int){}[0]
181+
final var z // examples.classes/OC.z|{}z[0]
182+
final fun <get-z>(): kotlin/Int // examples.classes/OC.z.<get-z>|<get-z>(){}[0]
183+
final fun <set-z>(kotlin/Int) // examples.classes/OC.z.<set-z>|<set-z>(kotlin.Int){}[0]
184+
185+
final fun c() // examples.classes/OC.c|c(){}[0]
186+
open fun o(): kotlin/Int // examples.classes/OC.o|o(){}[0]
187+
}
188+
189+
final object examples.classes/O // examples.classes/O|null[0]
190+
191+
final object examples.classes/OO // examples.classes/OO|null[0]
192+
193+
final const val examples.classes/con // examples.classes/con|{}con[0]
194+
final fun <get-con>(): kotlin/String // examples.classes/con.<get-con>|<get-con>(){}[0]
195+
final const val examples.classes/intCon // examples.classes/intCon|{}intCon[0]
196+
final fun <get-intCon>(): kotlin/Int // examples.classes/intCon.<get-intCon>|<get-intCon>(){}[0]
197+
198+
final val examples.classes/a // examples.classes/a|{}a[0]
199+
final fun <get-a>(): kotlin/Any // examples.classes/a.<get-a>|<get-a>(){}[0]
200+
final val examples.classes/i // examples.classes/i|{}i[0]
201+
final fun <get-i>(): kotlin/Int // examples.classes/i.<get-i>|<get-i>(){}[0]
202+
final val examples.classes/l // examples.classes/l|{}l[0]
203+
final fun <get-l>(): kotlin/Long // examples.classes/l.<get-l>|<get-l>(){}[0]
204+
205+
final var examples.classes/d // examples.classes/d|{}d[0]
206+
final fun <get-d>(): kotlin/Double // examples.classes/d.<get-d>|<get-d>(){}[0]
207+
final fun <set-d>(kotlin/Double) // examples.classes/d.<set-d>|<set-d>(kotlin.Double){}[0]
208+
final var examples.classes/r // examples.classes/r|{}r[0]
209+
final fun <get-r>(): kotlin/Float // examples.classes/r.<get-r>|<get-r>(){}[0]
210+
final fun <set-r>(kotlin/Float) // examples.classes/r.<set-r>|<set-r>(kotlin.Float){}[0]
211+
212+
final fun <#A: kotlin/Any?> examples.classes/consume(#A) // examples.classes/consume|consume(0:0){0§<kotlin.Any?>}[0]
213+
final fun examples.classes/testFun(): kotlin/Int // examples.classes/testFun|testFun(){}[0]
214+
final inline fun examples.classes/testInlineFun() // examples.classes/testInlineFun|testInlineFun(){}[0]
215+
216+
// Targets: [androidNative, linux]
217+
final class examples.classes/AndroidAndLinuxClass { // examples.classes/AndroidAndLinuxClass|null[0]
218+
constructor <init>() // examples.classes/AndroidAndLinuxClass.<init>|<init>(){}[0]
219+
}
220+
221+
// Targets: [androidNative, linux]
222+
final val examples.classes/androidAndLinuxVal // examples.classes/androidAndLinuxVal|{}androidAndLinuxVal[0]
223+
final fun <get-androidAndLinuxVal>(): kotlin/Int // examples.classes/androidAndLinuxVal.<get-androidAndLinuxVal>|<get-androidAndLinuxVal>(){}[0]
224+
225+
// Targets: [linux]
226+
final class examples.classes/LinuxClass { // examples.classes/LinuxClass|null[0]
227+
constructor <init>() // examples.classes/LinuxClass.<init>|<init>(){}[0]
228+
}
229+
230+
// Targets: [linux]
231+
final val examples.classes/linuxVal // examples.classes/linuxVal|{}linuxVal[0]
232+
final fun <get-linuxVal>(): kotlin/Int // examples.classes/linuxVal.<get-linuxVal>|<get-linuxVal>(){}[0]
233+
234+
// Targets: [linux]
235+
final fun examples.classes/anotherLinuxFun(): kotlin/Int // examples.classes/anotherLinuxFun|anotherLinuxFun(){}[0]
236+
237+
// Targets: [linux]
238+
final fun examples.classes/linuxFun(): kotlin/String // examples.classes/linuxFun|linuxFun(){}[0]

src/functionalTest/resources/examples/classes/TopLevelDeclarations.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2016-2023 JetBrains s.r.o.
2+
* Copyright 2016-2024 JetBrains s.r.o.
33
* Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
44
*/
55

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
* Copyright 2016-2024 JetBrains s.r.o.
3+
* Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
4+
*/
5+
6+
package examples.classes
7+
8+
public actual class Exp {
9+
constructor(a: Int, b: Int) {
10+
11+
}
12+
13+
actual fun a(): Int = 1
14+
actual fun b(): Int = 2
15+
actual fun c(): Int = 3
16+
17+
actual var v1: Int = 1
18+
actual var v2: Int = 2
19+
actual var v3: Int = 3
20+
21+
actual val vi1: Int = 4
22+
actual val vi2: Int = 5
23+
actual val vi3: Int = 6
24+
}
25+
26+
val androidAndLinuxVal: Int = 0
27+
28+
class AndroidAndLinuxClass
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/*
2+
* Copyright 2016-2024 JetBrains s.r.o.
3+
* Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
4+
*/
5+
6+
package examples.classes
7+
8+
public expect class Exp {
9+
fun a(): Int
10+
fun b(): Int
11+
fun c(): Int
12+
13+
var v1: Int
14+
var v2: Int
15+
var v3: Int
16+
17+
val vi1: Int
18+
val vi2: Int
19+
val vi3: Int
20+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* Copyright 2016-2024 JetBrains s.r.o.
3+
* Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
4+
*/
5+
6+
package examples.classes
7+
8+
public fun linuxFun(): String = "123"
9+
public fun anotherLinuxFun(): Int = 42
10+
11+
public class LinuxClass
12+
13+
public actual class Exp {
14+
constructor(a: Int, b: Int) {
15+
16+
}
17+
18+
actual fun a(): Int = 1
19+
actual fun b(): Int = 2
20+
actual fun c(): Int = 3
21+
fun d(): Int = 4
22+
fun e(): Int = 5
23+
24+
actual var v1: Int = 1
25+
actual var v2: Int = 2
26+
actual var v3: Int = 3
27+
var v4: Int = 4
28+
29+
actual val vi1: Int = 4
30+
actual val vi2: Int = 5
31+
actual val vi3: Int = 6
32+
val vi4: Int = 7
33+
}
34+
35+
val androidAndLinuxVal: Int = 0
36+
val linuxVal: Int = 0
37+
38+
class AndroidAndLinuxClass
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
* Copyright 2016-2024 JetBrains s.r.o.
3+
* Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
4+
*/
5+
6+
package examples.classes
7+
8+
public actual class Exp {
9+
constructor(a: Int, b: Int) {
10+
11+
}
12+
13+
actual fun a(): Int = 1
14+
actual fun b(): Int = 2
15+
actual fun c(): Int = 3
16+
fun e(): Int = 5
17+
fun f(): Int = 6
18+
19+
actual var v1: Int = 1
20+
actual var v2: Int = 2
21+
actual var v3: Int = 3
22+
23+
actual val vi1: Int = 4
24+
actual val vi2: Int = 5
25+
actual val vi3: Int = 6
26+
val vi5: Int = 7
27+
}

0 commit comments

Comments
 (0)