diff --git a/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/codegen/BytecodeListingTextCollectingVisitor.kt b/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/codegen/BytecodeListingTextCollectingVisitor.kt index 93255004e8e..6c5e39e10a2 100644 --- a/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/codegen/BytecodeListingTextCollectingVisitor.kt +++ b/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/codegen/BytecodeListingTextCollectingVisitor.kt @@ -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("}") diff --git a/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/AbstractJvmAbiContentTest.kt b/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/AbstractJvmAbiContentTest.kt index 800b4893a89..0c3afbcf46b 100644 --- a/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/AbstractJvmAbiContentTest.kt +++ b/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/AbstractJvmAbiContentTest.kt @@ -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 diff --git a/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/IrJvmAbiContentTestGenerated.java b/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/IrJvmAbiContentTestGenerated.java index b26bb65a8e3..994e3c32f9c 100644 --- a/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/IrJvmAbiContentTestGenerated.java +++ b/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/IrJvmAbiContentTestGenerated.java @@ -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/"); diff --git a/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/JvmAbiContentTestGenerated.java b/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/JvmAbiContentTestGenerated.java index f675c05170c..97c144e4057 100644 --- a/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/JvmAbiContentTestGenerated.java +++ b/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/JvmAbiContentTestGenerated.java @@ -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/"); diff --git a/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/LegacyJvmAbiContentTestGenerated.java b/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/LegacyJvmAbiContentTestGenerated.java index 968146c0de9..4757554a220 100644 --- a/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/LegacyJvmAbiContentTestGenerated.java +++ b/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/LegacyJvmAbiContentTestGenerated.java @@ -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/"); diff --git a/plugins/jvm-abi-gen/testData/content/annotationInstantiation/signatures.txt b/plugins/jvm-abi-gen/testData/content/annotationInstantiation/signatures.txt index cd02c52777a..4da9ebe8bda 100644 --- a/plugins/jvm-abi-gen/testData/content/annotationInstantiation/signatures.txt +++ b/plugins/jvm-abi-gen/testData/content/annotationInstantiation/signatures.txt @@ -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 (): 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 { diff --git a/plugins/jvm-abi-gen/testData/content/anonymousWhenMapping/directives.txt b/plugins/jvm-abi-gen/testData/content/anonymousWhenMapping/directives.txt new file mode 100644 index 00000000000..e59cf931fc8 --- /dev/null +++ b/plugins/jvm-abi-gen/testData/content/anonymousWhenMapping/directives.txt @@ -0,0 +1,2 @@ +// IGNORE_BACKEND_LEGACY: JVM +// IGNORE_BACKEND: JVM \ No newline at end of file diff --git a/plugins/jvm-abi-gen/testData/content/anonymousWhenMapping/signatures.txt b/plugins/jvm-abi-gen/testData/content/anonymousWhenMapping/signatures.txt index eb01d402de0..93c9a98614a 100644 --- a/plugins/jvm-abi-gen/testData/content/anonymousWhenMapping/signatures.txt +++ b/plugins/jvm-abi-gen/testData/content/anonymousWhenMapping/signatures.txt @@ -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 { diff --git a/plugins/jvm-abi-gen/testData/content/class/directives.txt b/plugins/jvm-abi-gen/testData/content/class/directives.txt new file mode 100644 index 00000000000..e59cf931fc8 --- /dev/null +++ b/plugins/jvm-abi-gen/testData/content/class/directives.txt @@ -0,0 +1,2 @@ +// IGNORE_BACKEND_LEGACY: JVM +// IGNORE_BACKEND: JVM \ No newline at end of file diff --git a/plugins/jvm-abi-gen/testData/content/class/signatures.txt b/plugins/jvm-abi-gen/testData/content/class/signatures.txt index 8e9315906e8..c6e0393eedd 100644 --- a/plugins/jvm-abi-gen/testData/content/class/signatures.txt +++ b/plugins/jvm-abi-gen/testData/content/class/signatures.txt @@ -1,43 +1,43 @@ @kotlin.Metadata public final class test/BaseClass$Companion { // source: 'classes.kt' - public synthetic method (p0: kotlin.jvm.internal.DefaultConstructorMarker): void public final inner class test/BaseClass$Companion + public synthetic method (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 (): 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 (): 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 (): void } @kotlin.Metadata final class test/Class$NestedInnerClass { // source: 'classes.kt' - public method (): 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 (): void } @kotlin.Metadata public final class test/Class { // source: 'classes.kt' + private final inner class test/Class$NestedInnerClass public method (): void public final method classPublicMethod(): void - private final inner class test/Class$NestedInnerClass } @kotlin.Metadata public interface test/Interface { diff --git a/plugins/jvm-abi-gen/testData/content/kt50005/directives.txt b/plugins/jvm-abi-gen/testData/content/kt50005/directives.txt new file mode 100644 index 00000000000..e59cf931fc8 --- /dev/null +++ b/plugins/jvm-abi-gen/testData/content/kt50005/directives.txt @@ -0,0 +1,2 @@ +// IGNORE_BACKEND_LEGACY: JVM +// IGNORE_BACKEND: JVM \ No newline at end of file diff --git a/plugins/jvm-abi-gen/testData/content/kt50005/signatures.txt b/plugins/jvm-abi-gen/testData/content/kt50005/signatures.txt new file mode 100644 index 00000000000..f81f9c86161 --- /dev/null +++ b/plugins/jvm-abi-gen/testData/content/kt50005/signatures.txt @@ -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 (): 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 +} \ No newline at end of file diff --git a/plugins/jvm-abi-gen/testData/content/kt50005/test.kt b/plugins/jvm-abi-gen/testData/content/kt50005/test.kt new file mode 100644 index 00000000000..c5c83126a4c --- /dev/null +++ b/plugins/jvm-abi-gen/testData/content/kt50005/test.kt @@ -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() {} +} + diff --git a/plugins/jvm-abi-gen/testData/content/whenMapping/signatures.txt b/plugins/jvm-abi-gen/testData/content/whenMapping/signatures.txt index e5f81893c8d..4578a8a45a8 100644 --- a/plugins/jvm-abi-gen/testData/content/whenMapping/signatures.txt +++ b/plugins/jvm-abi-gen/testData/content/whenMapping/signatures.txt @@ -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 (): 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 (): 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 } \ No newline at end of file