Generate annotations on enum entry constants in bytecode
#KT-5665 Fixed
This commit is contained in:
@@ -1615,9 +1615,10 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
|||||||
if (declaration instanceof JetEnumEntry) {
|
if (declaration instanceof JetEnumEntry) {
|
||||||
String name = declaration.getName();
|
String name = declaration.getName();
|
||||||
assert name != null : "Enum entry has no name: " + declaration.getText();
|
assert name != null : "Enum entry has no name: " + declaration.getText();
|
||||||
String desc = classAsmType.getDescriptor();
|
|
||||||
ClassDescriptor entryDescriptor = bindingContext.get(BindingContext.CLASS, declaration);
|
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);
|
myEnumConstants.add((JetEnumEntry) declaration);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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<E>()
|
||||||
|
|
||||||
|
val e1 = e.getDeclaredField(E.E1.toString()).getAnnotations()
|
||||||
|
if (e1.size != 1) return "Fail E1 size: ${e1.toList()}"
|
||||||
|
if (e1[0].annotationType() != javaClass<First>()) 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<Second>()) return "Fail E2: ${e2.toList()}"
|
||||||
|
|
||||||
|
return (e2[0] as Second).value
|
||||||
|
}
|
||||||
+5
@@ -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);
|
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")
|
@TestMetadata("defaultParameterValues.kt")
|
||||||
public void testDefaultParameterValues() throws Exception {
|
public void testDefaultParameterValues() throws Exception {
|
||||||
doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/annotations/defaultParameterValues.kt");
|
doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/annotations/defaultParameterValues.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user