jvm-abi-gen: Add test to check the declaration order in interface jars
This commit is contained in:
committed by
Alexander Udalov
parent
b8625cd233
commit
05695761ec
+5
-2
@@ -12,7 +12,8 @@ class BytecodeListingTextCollectingVisitor(
|
||||
val filter: Filter,
|
||||
val withSignatures: Boolean,
|
||||
api: Int = Opcodes.API_VERSION,
|
||||
val withAnnotations: Boolean = true
|
||||
val withAnnotations: Boolean = true,
|
||||
val sortDeclarations: Boolean = true,
|
||||
) : ClassVisitor(api) {
|
||||
companion object {
|
||||
@JvmOverloads
|
||||
@@ -150,7 +151,9 @@ class BytecodeListingTextCollectingVisitor(
|
||||
append(className)
|
||||
if (declarationsInsideClass.isNotEmpty()) {
|
||||
append(" {\n")
|
||||
for (declaration in declarationsInsideClass.sortedBy { it.text }) {
|
||||
val orderedDeclarations =
|
||||
if (sortDeclarations) declarationsInsideClass.sortedBy { it.text } else declarationsInsideClass
|
||||
for (declaration in orderedDeclarations) {
|
||||
append(" ").append(declaration.annotations.joinToString("")).append(declaration.text).append("\n")
|
||||
}
|
||||
append("}")
|
||||
|
||||
@@ -21,7 +21,8 @@ abstract class AbstractJvmAbiContentTest : BaseJvmAbiTest() {
|
||||
val visitor = BytecodeListingTextCollectingVisitor(
|
||||
filter = BytecodeListingTextCollectingVisitor.Filter.EMPTY,
|
||||
withSignatures = false,
|
||||
api = Opcodes.API_VERSION
|
||||
api = Opcodes.API_VERSION,
|
||||
sortDeclarations = false, // Declaration order matters for the ABI
|
||||
)
|
||||
reader.accept(visitor, 0)
|
||||
classToBytecode[classFile] = visitor.text
|
||||
|
||||
+5
@@ -55,6 +55,11 @@ public class IrJvmAbiContentTestGenerated extends AbstractIrJvmAbiContentTest {
|
||||
runTest("plugins/jvm-abi-gen/testData/content/class/");
|
||||
}
|
||||
|
||||
@TestMetadata("kt50005")
|
||||
public void testKt50005() throws Exception {
|
||||
runTest("plugins/jvm-abi-gen/testData/content/kt50005/");
|
||||
}
|
||||
|
||||
@TestMetadata("whenMapping")
|
||||
public void testWhenMapping() throws Exception {
|
||||
runTest("plugins/jvm-abi-gen/testData/content/whenMapping/");
|
||||
|
||||
+5
@@ -55,6 +55,11 @@ public class JvmAbiContentTestGenerated extends AbstractJvmAbiContentTest {
|
||||
runTest("plugins/jvm-abi-gen/testData/content/class/");
|
||||
}
|
||||
|
||||
@TestMetadata("kt50005")
|
||||
public void testKt50005() throws Exception {
|
||||
runTest("plugins/jvm-abi-gen/testData/content/kt50005/");
|
||||
}
|
||||
|
||||
@TestMetadata("whenMapping")
|
||||
public void testWhenMapping() throws Exception {
|
||||
runTest("plugins/jvm-abi-gen/testData/content/whenMapping/");
|
||||
|
||||
Generated
+5
@@ -55,6 +55,11 @@ public class LegacyJvmAbiContentTestGenerated extends AbstractLegacyJvmAbiConten
|
||||
runTest("plugins/jvm-abi-gen/testData/content/class/");
|
||||
}
|
||||
|
||||
@TestMetadata("kt50005")
|
||||
public void testKt50005() throws Exception {
|
||||
runTest("plugins/jvm-abi-gen/testData/content/kt50005/");
|
||||
}
|
||||
|
||||
@TestMetadata("whenMapping")
|
||||
public void testWhenMapping() throws Exception {
|
||||
runTest("plugins/jvm-abi-gen/testData/content/whenMapping/");
|
||||
|
||||
+1
-1
@@ -9,10 +9,10 @@ public synthetic final class test/Test$annotationImpl$test_A$0 {
|
||||
enclosing class test/Test
|
||||
inner (anonymous) class test/Test$annotationImpl$test_A$0
|
||||
public method <init>(): void
|
||||
public synthetic final method annotationType(): java.lang.Class
|
||||
public final method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
||||
public final method hashCode(): int
|
||||
public final @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
||||
public synthetic final method annotationType(): java.lang.Class
|
||||
}
|
||||
@kotlin.Metadata
|
||||
public final class test/Test {
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
// IGNORE_BACKEND_LEGACY: JVM
|
||||
// IGNORE_BACKEND: JVM
|
||||
@@ -3,8 +3,8 @@ public final enum class test/E {
|
||||
// source: 'test.kt'
|
||||
public final enum static field A: test.E
|
||||
public final enum static field B: test.E
|
||||
public static method valueOf(p0: java.lang.String): test.E
|
||||
public static method values(): test.E[]
|
||||
public static method valueOf(p0: java.lang.String): test.E
|
||||
}
|
||||
@kotlin.Metadata
|
||||
public final class test/Test {
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
// IGNORE_BACKEND_LEGACY: JVM
|
||||
// IGNORE_BACKEND: JVM
|
||||
+10
-10
@@ -1,43 +1,43 @@
|
||||
@kotlin.Metadata
|
||||
public final class test/BaseClass$Companion {
|
||||
// source: 'classes.kt'
|
||||
public synthetic method <init>(p0: kotlin.jvm.internal.DefaultConstructorMarker): void
|
||||
public final inner class test/BaseClass$Companion
|
||||
public synthetic method <init>(p0: kotlin.jvm.internal.DefaultConstructorMarker): void
|
||||
}
|
||||
@kotlin.Metadata
|
||||
public class test/BaseClass {
|
||||
// source: 'classes.kt'
|
||||
public final inner class test/BaseClass$Companion
|
||||
public final static @org.jetbrains.annotations.NotNull field Companion: test.BaseClass$Companion
|
||||
public final static field basePublicConst: int
|
||||
public method <init>(): void
|
||||
public final method baseClassInternalFun$main(): int
|
||||
protected final method baseClassProtectedFun(): int
|
||||
public method getBaseClassPublicVal(): int
|
||||
public method baseClassPublicFun(): int
|
||||
public final method getBaseClassInternalVal$main(): int
|
||||
public final method baseClassInternalFun$main(): int
|
||||
protected final method getBaseClassProtectedVal(): int
|
||||
public method getBaseClassPublicVal(): int
|
||||
public final inner class test/BaseClass$Companion
|
||||
protected final method baseClassProtectedFun(): int
|
||||
}
|
||||
@kotlin.Metadata
|
||||
public final class test/Class$NestedInnerClass$NestedNestedInnerClass {
|
||||
// source: 'classes.kt'
|
||||
public method <init>(): void
|
||||
private final inner class test/Class$NestedInnerClass
|
||||
public final inner class test/Class$NestedInnerClass$NestedNestedInnerClass
|
||||
private final inner class test/Class$NestedInnerClass
|
||||
public method <init>(): void
|
||||
}
|
||||
@kotlin.Metadata
|
||||
final class test/Class$NestedInnerClass {
|
||||
// source: 'classes.kt'
|
||||
public method <init>(): void
|
||||
private final inner class test/Class$NestedInnerClass
|
||||
public final inner class test/Class$NestedInnerClass$NestedNestedInnerClass
|
||||
private final inner class test/Class$NestedInnerClass
|
||||
public method <init>(): void
|
||||
}
|
||||
@kotlin.Metadata
|
||||
public final class test/Class {
|
||||
// source: 'classes.kt'
|
||||
private final inner class test/Class$NestedInnerClass
|
||||
public method <init>(): void
|
||||
public final method classPublicMethod(): void
|
||||
private final inner class test/Class$NestedInnerClass
|
||||
}
|
||||
@kotlin.Metadata
|
||||
public interface test/Interface {
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
// IGNORE_BACKEND_LEGACY: JVM
|
||||
// IGNORE_BACKEND: JVM
|
||||
@@ -0,0 +1,12 @@
|
||||
@kotlin.Metadata
|
||||
public final class test/A {
|
||||
// source: 'test.kt'
|
||||
public final @kotlin.jvm.JvmField field b: int
|
||||
public field a: java.lang.String
|
||||
public method <init>(): void
|
||||
public final @org.jetbrains.annotations.NotNull method getA(): java.lang.String
|
||||
public final method setA(@org.jetbrains.annotations.NotNull p0: java.lang.String): void
|
||||
public final method g(): void
|
||||
public final method f(): void
|
||||
public final method h(): void
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package test
|
||||
|
||||
// The order of fields and methods is visible to annotation processors
|
||||
// and thus part of the public ABI of a library.
|
||||
class A {
|
||||
@JvmField
|
||||
val b: Int = 0
|
||||
lateinit var a: String
|
||||
|
||||
fun g() {}
|
||||
fun f() {}
|
||||
fun h() {}
|
||||
}
|
||||
|
||||
@@ -3,20 +3,20 @@ public final enum class test/E {
|
||||
// source: 'test.kt'
|
||||
public final enum static field A: test.E
|
||||
public final enum static field B: test.E
|
||||
public static method valueOf(p0: java.lang.String): test.E
|
||||
public static method values(): test.E[]
|
||||
public static method valueOf(p0: java.lang.String): test.E
|
||||
}
|
||||
@kotlin.Metadata
|
||||
public synthetic final class test/Test$WhenMappings {
|
||||
// source: 'test.kt'
|
||||
public synthetic inner class test/Test$WhenMappings
|
||||
public synthetic final static field $EnumSwitchMapping$0: int[]
|
||||
static method <clinit>(): void
|
||||
public synthetic inner class test/Test$WhenMappings
|
||||
}
|
||||
@kotlin.Metadata
|
||||
public final class test/Test {
|
||||
// source: 'test.kt'
|
||||
public synthetic inner class test/Test$WhenMappings
|
||||
public method <init>(): void
|
||||
public final @org.jetbrains.annotations.NotNull method visibleWhenMapping(@org.jetbrains.annotations.NotNull p0: test.E): java.lang.String
|
||||
public synthetic inner class test/Test$WhenMappings
|
||||
}
|
||||
Reference in New Issue
Block a user