diff --git a/compiler/testData/codegen/bytecodeListing/annotations/defaultTargets.txt b/compiler/testData/codegen/bytecodeListing/annotations/defaultTargets.txt index 9ac85558e47..eb75c8d97dc 100644 --- a/compiler/testData/codegen/bytecodeListing/annotations/defaultTargets.txt +++ b/compiler/testData/codegen/bytecodeListing/annotations/defaultTargets.txt @@ -13,43 +13,43 @@ public final class A { @java.lang.annotation.Retention @java.lang.annotation.Target @kotlin.Metadata -public abstract class AnnField +public annotation class AnnField @kotlin.annotation.Target @java.lang.annotation.Retention @java.lang.annotation.Target @kotlin.Metadata -public abstract class AnnFieldProperty +public annotation class AnnFieldProperty @kotlin.annotation.Target @java.lang.annotation.Retention @java.lang.annotation.Target @kotlin.Metadata -public abstract class AnnParameterField +public annotation class AnnParameterField @kotlin.annotation.Target @java.lang.annotation.Retention @java.lang.annotation.Target @kotlin.Metadata -public abstract class AnnParameterProperty +public annotation class AnnParameterProperty @kotlin.annotation.Target @java.lang.annotation.Retention @java.lang.annotation.Target @kotlin.Metadata -public abstract class AnnProperty +public annotation class AnnProperty @kotlin.annotation.Target @java.lang.annotation.Retention @java.lang.annotation.Target @kotlin.Metadata -public abstract class AnnTypeField +public annotation class AnnTypeField @kotlin.annotation.Target @java.lang.annotation.Retention @java.lang.annotation.Target @kotlin.Metadata -public abstract class Anno +public annotation class Anno @kotlin.Metadata public final class DefaultTargetsKt { diff --git a/compiler/testData/codegen/bytecodeListing/annotations/kt9320.txt b/compiler/testData/codegen/bytecodeListing/annotations/kt9320.txt index 8e530aca402..8f363aedfcb 100644 --- a/compiler/testData/codegen/bytecodeListing/annotations/kt9320.txt +++ b/compiler/testData/codegen/bytecodeListing/annotations/kt9320.txt @@ -1,12 +1,12 @@ @java.lang.annotation.Retention @kotlin.Metadata -public abstract class Ann +public annotation class Ann @kotlin.annotation.Target @java.lang.annotation.Retention @java.lang.annotation.Target @kotlin.Metadata -public abstract class AnnExpr +public annotation class AnnExpr @Ann @kotlin.Metadata diff --git a/compiler/testData/codegen/bytecodeListing/annotations/literals.txt b/compiler/testData/codegen/bytecodeListing/annotations/literals.txt index 4ad69775a7d..f33ce745795 100644 --- a/compiler/testData/codegen/bytecodeListing/annotations/literals.txt +++ b/compiler/testData/codegen/bytecodeListing/annotations/literals.txt @@ -2,19 +2,19 @@ @java.lang.annotation.Retention @java.lang.annotation.Target @kotlin.Metadata -public abstract class ClsAnn +public annotation class ClsAnn @kotlin.annotation.Target @java.lang.annotation.Retention @java.lang.annotation.Target @kotlin.Metadata -public abstract class ExprAnn +public annotation class ExprAnn @kotlin.annotation.Target @java.lang.annotation.Retention @java.lang.annotation.Target @kotlin.Metadata -public abstract class FunAnn +public annotation class FunAnn @kotlin.Metadata final class LiteralsKt$foo$1 { diff --git a/compiler/testData/codegen/bytecodeListing/annotations/onProperties.txt b/compiler/testData/codegen/bytecodeListing/annotations/onProperties.txt index 583a9608763..db55ed8f13b 100644 --- a/compiler/testData/codegen/bytecodeListing/annotations/onProperties.txt +++ b/compiler/testData/codegen/bytecodeListing/annotations/onProperties.txt @@ -20,31 +20,31 @@ public final class A { @java.lang.annotation.Retention @kotlin.Metadata -public abstract class AnnDelegate +public annotation class AnnDelegate @java.lang.annotation.Retention @kotlin.Metadata -public abstract class AnnField +public annotation class AnnField @java.lang.annotation.Retention @kotlin.Metadata -public abstract class AnnGetter +public annotation class AnnGetter @java.lang.annotation.Retention @kotlin.Metadata -public abstract class AnnParam +public annotation class AnnParam @java.lang.annotation.Retention @kotlin.Metadata -public abstract class AnnProp +public annotation class AnnProp @java.lang.annotation.Retention @kotlin.Metadata -public abstract class AnnProp2 +public annotation class AnnProp2 @java.lang.annotation.Retention @kotlin.Metadata -public abstract class AnnSetter +public annotation class AnnSetter @kotlin.Metadata public final class CustomDelegate { diff --git a/compiler/testData/codegen/bytecodeListing/annotations/onReceiver.txt b/compiler/testData/codegen/bytecodeListing/annotations/onReceiver.txt index 251e95c3cfc..6fa04c5c449 100644 --- a/compiler/testData/codegen/bytecodeListing/annotations/onReceiver.txt +++ b/compiler/testData/codegen/bytecodeListing/annotations/onReceiver.txt @@ -7,7 +7,7 @@ public final class A { @java.lang.annotation.Retention @kotlin.Metadata -public abstract class Ann +public annotation class Ann @kotlin.Metadata public final class OnReceiverKt { diff --git a/compiler/testData/codegen/bytecodeListing/defaultImpls.txt b/compiler/testData/codegen/bytecodeListing/defaultImpls.txt index 48654292118..f85adc2f99a 100644 --- a/compiler/testData/codegen/bytecodeListing/defaultImpls.txt +++ b/compiler/testData/codegen/bytecodeListing/defaultImpls.txt @@ -1,13 +1,13 @@ @kotlin.Metadata -public abstract class A +public interface A @kotlin.Metadata -public abstract class B { +public interface B { public abstract method foo(): void } @kotlin.Metadata -public abstract class C { +public interface C { public abstract method getBar(): int } @@ -18,7 +18,7 @@ public final class D$DefaultImpls { } @kotlin.Metadata -public abstract class D { +public interface D { inner class D$DefaultImpls public abstract method baz(): int } @@ -30,6 +30,6 @@ public final class E$InsideE { } @kotlin.Metadata -public abstract class E { +public interface E { inner class E$InsideE } \ No newline at end of file diff --git a/compiler/testData/codegen/bytecodeListing/specialBridges/contains.txt b/compiler/testData/codegen/bytecodeListing/specialBridges/contains.txt index a0e0508bd21..dda6a8dfc4d 100644 --- a/compiler/testData/codegen/bytecodeListing/specialBridges/contains.txt +++ b/compiler/testData/codegen/bytecodeListing/specialBridges/contains.txt @@ -118,7 +118,7 @@ public final class I1$DefaultImpls { } @kotlin.Metadata -public abstract class I1 { +public interface I1 { inner class I1$DefaultImpls public abstract method contains(p0: java.lang.Object): boolean public abstract method containsAll(@org.jetbrains.annotations.NotNull p0: java.util.Collection): boolean @@ -134,7 +134,7 @@ public final class I2$DefaultImpls { } @kotlin.Metadata -public abstract class I2 { +public interface I2 { inner class I2$DefaultImpls public abstract method contains(@org.jetbrains.annotations.NotNull p0: java.lang.String): boolean public abstract method containsAll(@org.jetbrains.annotations.NotNull p0: java.util.Collection): boolean diff --git a/compiler/tests-common/org/jetbrains/kotlin/codegen/AbstractBytecodeListingTest.kt b/compiler/tests-common/org/jetbrains/kotlin/codegen/AbstractBytecodeListingTest.kt index 5ec3d64b610..a498f9ecee2 100644 --- a/compiler/tests-common/org/jetbrains/kotlin/codegen/AbstractBytecodeListingTest.kt +++ b/compiler/tests-common/org/jetbrains/kotlin/codegen/AbstractBytecodeListingTest.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.codegen import org.jetbrains.kotlin.test.ConfigurationKind import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.org.objectweb.asm.* +import org.jetbrains.org.objectweb.asm.Opcodes.* import java.io.File abstract class AbstractBytecodeListingTest : CodegenTestCase() { @@ -40,7 +41,7 @@ abstract class AbstractBytecodeListingTest : CodegenTestCase() { KotlinTestUtils.assertEqualsToFile(txtFile, generatedFiles) } - private class TextCollectingVisitor : ClassVisitor(Opcodes.ASM5) { + private class TextCollectingVisitor : ClassVisitor(ASM5) { private class Declaration(val text: String, val annotations: MutableList = arrayListOf()) private val declarationsInsideClass = arrayListOf() @@ -58,22 +59,32 @@ abstract class AbstractBytecodeListingTest : CodegenTestCase() { } private fun handleModifiers(access: Int, list: MutableList = declarationsInsideClass.last().annotations) { - if ((access and Opcodes.ACC_PUBLIC) != 0) addModifier("public", list) - if ((access and Opcodes.ACC_PROTECTED) != 0) addModifier("protected", list) - if ((access and Opcodes.ACC_PRIVATE) != 0) addModifier("private", list) + if (access and ACC_PUBLIC != 0) addModifier("public", list) + if (access and ACC_PROTECTED != 0) addModifier("protected", list) + if (access and ACC_PRIVATE != 0) addModifier("private", list) - if ((access and Opcodes.ACC_SYNTHETIC) != 0) addModifier("synthetic", list) - if ((access and Opcodes.ACC_DEPRECATED) != 0) addModifier("deprecated", list) - if ((access and Opcodes.ACC_FINAL) != 0) addModifier("final", list) - if ((access and Opcodes.ACC_ABSTRACT) != 0) addModifier("abstract", list) - if ((access and Opcodes.ACC_STATIC) != 0) addModifier("static", list) + if (access and ACC_SYNTHETIC != 0) addModifier("synthetic", list) + if (access and ACC_DEPRECATED != 0) addModifier("deprecated", list) + if (access and ACC_FINAL != 0) addModifier("final", list) + if (access and ACC_ABSTRACT != 0 && access and ACC_INTERFACE == 0) addModifier("abstract", list) + if (access and ACC_STATIC != 0) addModifier("static", list) + } + + private fun classOrInterface(access: Int): String { + return when { + access and ACC_ANNOTATION != 0 -> "annotation class" + access and ACC_ENUM != 0 -> "enum class" + access and ACC_INTERFACE != 0 -> "interface" + else -> "class" + } } val text: String get() = StringBuilder().apply { append(classAnnotations.joinToString("\n", postfix = "\n")) arrayListOf().apply { handleModifiers(classAccess, this) }.forEach { append(it) } - append("class ") + append(classOrInterface(classAccess)) + append(" ") append(className) if (declarationsInsideClass.isNotEmpty()) { append(" {\n") @@ -98,7 +109,7 @@ abstract class AbstractBytecodeListingTest : CodegenTestCase() { handleModifiers(access, methodAnnotations) - return object : MethodVisitor(Opcodes.ASM5) { + return object : MethodVisitor(ASM5) { override fun visitAnnotation(desc: String, visible: Boolean): AnnotationVisitor? { val type = Type.getType(desc).className methodAnnotations += "@$type " @@ -127,7 +138,7 @@ abstract class AbstractBytecodeListingTest : CodegenTestCase() { declarationsInsideClass.add(Declaration("field $name: $type")) handleModifiers(access) - return object : FieldVisitor(Opcodes.ASM5) { + return object : FieldVisitor(ASM5) { override fun visitAnnotation(desc: String, visible: Boolean): AnnotationVisitor? { addAnnotation(desc) return super.visitAnnotation(desc, visible)