From 2ea9a2cfc9430d757bc2964a481ae14ab87f0256 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 25 Aug 2014 13:50:57 +0400 Subject: [PATCH] Generate annotations on enum entry constants in bytecode #KT-5665 Fixed --- .../codegen/ImplementationBodyCodegen.java | 5 +-- .../annotations/annotatedEnumEntry.kt | 33 +++++++++++++++++++ ...lackBoxWithStdlibCodegenTestGenerated.java | 5 +++ 3 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/codegen/boxWithStdlib/annotations/annotatedEnumEntry.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index c8b572d142f..95b8f746520 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -1615,9 +1615,10 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { if (declaration instanceof JetEnumEntry) { String name = declaration.getName(); assert name != null : "Enum entry has no name: " + declaration.getText(); - String desc = classAsmType.getDescriptor(); ClassDescriptor entryDescriptor = bindingContext.get(BindingContext.CLASS, declaration); - v.newField(OtherOrigin(declaration, entryDescriptor), ACC_PUBLIC | ACC_ENUM | ACC_STATIC | ACC_FINAL, name, desc, null, null); + FieldVisitor fv = v.newField(OtherOrigin(declaration, entryDescriptor), ACC_PUBLIC | ACC_ENUM | ACC_STATIC | ACC_FINAL, + name, classAsmType.getDescriptor(), null, null); + AnnotationCodegen.forField(fv, typeMapper).genAnnotations(entryDescriptor, null); myEnumConstants.add((JetEnumEntry) declaration); } diff --git a/compiler/testData/codegen/boxWithStdlib/annotations/annotatedEnumEntry.kt b/compiler/testData/codegen/boxWithStdlib/annotations/annotatedEnumEntry.kt new file mode 100644 index 00000000000..ea9d270cda9 --- /dev/null +++ b/compiler/testData/codegen/boxWithStdlib/annotations/annotatedEnumEntry.kt @@ -0,0 +1,33 @@ +// KT-5665 + +import java.lang.annotation.* + +Retention(RetentionPolicy.RUNTIME) +annotation class First + +Retention(RetentionPolicy.RUNTIME) +annotation class Second(val value: String) + +enum class E { + [First] + E1 { + fun foo() = "something" + } + + [Second("OK")] + E2 +} + +fun box(): String { + val e = javaClass() + + val e1 = e.getDeclaredField(E.E1.toString()).getAnnotations() + if (e1.size != 1) return "Fail E1 size: ${e1.toList()}" + if (e1[0].annotationType() != javaClass()) return "Fail E1: ${e1.toList()}" + + val e2 = e.getDeclaredField(E.E2.toString()).getAnnotations() + if (e2.size != 1) return "Fail E2 size: ${e2.toList()}" + if (e2[0].annotationType() != javaClass()) return "Fail E2: ${e2.toList()}" + + return (e2[0] as Second).value +} diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java index b70301d4160..38ceb5b8c59 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java @@ -43,6 +43,11 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/codegen/boxWithStdlib/annotations"), Pattern.compile("^(.+)\\.kt$"), true); } + @TestMetadata("annotatedEnumEntry.kt") + public void testAnnotatedEnumEntry() throws Exception { + doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/annotations/annotatedEnumEntry.kt"); + } + @TestMetadata("defaultParameterValues.kt") public void testDefaultParameterValues() throws Exception { doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/annotations/defaultParameterValues.kt");