Load java: load annotations on enum entries

This commit is contained in:
Pavel V. Talanov
2015-12-09 17:56:18 +03:00
parent fb19552920
commit 280e00981f
7 changed files with 71 additions and 6 deletions
@@ -0,0 +1,20 @@
package test;
import java.lang.String;
import java.util.List;
public enum AnnotatedEnumEntry {
@Anno("a")
E1,
@Anno("b")
@Anno2
E2,
E3;
public static @interface Anno {
String value();
}
public static @interface Anno2 {
}
}
@@ -0,0 +1,29 @@
package test
public final enum class AnnotatedEnumEntry : kotlin.Enum<test.AnnotatedEnumEntry!> {
@test.AnnotatedEnumEntry.Anno(value = "a") enum entry E1
@test.AnnotatedEnumEntry.Anno(value = "b") @test.AnnotatedEnumEntry.Anno2() enum entry E2
enum entry E3
private constructor AnnotatedEnumEntry()
public final override /*1*/ /*fake_override*/ val name: kotlin.String
public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int
protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: test.AnnotatedEnumEntry!): kotlin.Int
public final annotation class Anno : kotlin.Annotation {
public constructor Anno(/*0*/ value: kotlin.String)
public final val value: kotlin.String
}
public final annotation class Anno2 : kotlin.Annotation {
public constructor Anno2()
}
// Static members
@kotlin.Deprecated(message = "Use 'values()' function instead", replaceWith = kotlin.ReplaceWith(expression = "this.values()", imports = {})) public final /*synthesized*/ val values: kotlin.Array<test.AnnotatedEnumEntry>
public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): test.AnnotatedEnumEntry
public final /*synthesized*/ fun values(): kotlin.Array<test.AnnotatedEnumEntry>
}
@@ -321,6 +321,12 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest {
doTestCompiledJava(fileName); doTestCompiledJava(fileName);
} }
@TestMetadata("AnnotatedEnumEntry.java")
public void testAnnotatedEnumEntry() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava/compiledJava/annotations/AnnotatedEnumEntry.java");
doTestCompiledJava(fileName);
}
@TestMetadata("AnnotatedField.java") @TestMetadata("AnnotatedField.java")
public void testAnnotatedField() throws Exception { public void testAnnotatedField() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava/compiledJava/annotations/AnnotatedField.java"); String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava/compiledJava/annotations/AnnotatedField.java");
@@ -3387,6 +3387,12 @@ public class JvmRuntimeDescriptorLoaderTestGenerated extends AbstractJvmRuntimeD
doTest(fileName); doTest(fileName);
} }
@TestMetadata("AnnotatedEnumEntry.java")
public void testAnnotatedEnumEntry() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava/compiledJava/annotations/AnnotatedEnumEntry.java");
doTest(fileName);
}
@TestMetadata("AnnotatedField.java") @TestMetadata("AnnotatedField.java")
public void testAnnotatedField() throws Exception { public void testAnnotatedField() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava/compiledJava/annotations/AnnotatedField.java"); String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava/compiledJava/annotations/AnnotatedField.java");
@@ -585,8 +585,8 @@ public class LazyJavaClassMemberScope(
if (field != null) { if (field != null) {
EnumEntrySyntheticClassDescriptor.create(c.storageManager, ownerDescriptor, name, EnumEntrySyntheticClassDescriptor.create(c.storageManager, ownerDescriptor, name,
c.storageManager.createLazyValue { c.storageManager.createLazyValue {
memberIndex().getAllFieldNames() + memberIndex().getMethodNames({true}) memberIndex().getAllFieldNames() + memberIndex().getMethodNames({ true })
}, c.components.sourceElementFactory.source(field)) }, c.resolveAnnotations(field), c.components.sourceElementFactory.source(field))
} }
else null else null
} }
@@ -47,6 +47,7 @@ public class EnumEntrySyntheticClassDescriptor extends ClassDescriptorBase {
private final MemberScope scope; private final MemberScope scope;
private final MemberScope staticScope = new StaticScopeForKotlinClass(this); private final MemberScope staticScope = new StaticScopeForKotlinClass(this);
private final NotNullLazyValue<Collection<Name>> enumMemberNames; private final NotNullLazyValue<Collection<Name>> enumMemberNames;
private final Annotations annotations;
/** /**
* Creates and initializes descriptors for enum entry with the given name and its companion object * Creates and initializes descriptors for enum entry with the given name and its companion object
@@ -58,11 +59,12 @@ public class EnumEntrySyntheticClassDescriptor extends ClassDescriptorBase {
@NotNull ClassDescriptor enumClass, @NotNull ClassDescriptor enumClass,
@NotNull Name name, @NotNull Name name,
@NotNull NotNullLazyValue<Collection<Name>> enumMemberNames, @NotNull NotNullLazyValue<Collection<Name>> enumMemberNames,
@NotNull Annotations annotations,
@NotNull SourceElement source @NotNull SourceElement source
) { ) {
KotlinType enumType = enumClass.getDefaultType(); KotlinType enumType = enumClass.getDefaultType();
return new EnumEntrySyntheticClassDescriptor(storageManager, enumClass, enumType, name, enumMemberNames, source); return new EnumEntrySyntheticClassDescriptor(storageManager, enumClass, enumType, name, enumMemberNames, annotations, source);
} }
private EnumEntrySyntheticClassDescriptor( private EnumEntrySyntheticClassDescriptor(
@@ -71,11 +73,13 @@ public class EnumEntrySyntheticClassDescriptor extends ClassDescriptorBase {
@NotNull KotlinType supertype, @NotNull KotlinType supertype,
@NotNull Name name, @NotNull Name name,
@NotNull NotNullLazyValue<Collection<Name>> enumMemberNames, @NotNull NotNullLazyValue<Collection<Name>> enumMemberNames,
@NotNull Annotations annotations,
@NotNull SourceElement source @NotNull SourceElement source
) { ) {
super(storageManager, containingClass, name, source); super(storageManager, containingClass, name, source);
assert containingClass.getKind() == ClassKind.ENUM_CLASS; assert containingClass.getKind() == ClassKind.ENUM_CLASS;
this.annotations = annotations;
this.typeConstructor = this.typeConstructor =
TypeConstructorImpl.createForClass(this, getAnnotations(), true, "enum entry", Collections.<TypeParameterDescriptor>emptyList(), TypeConstructorImpl.createForClass(this, getAnnotations(), true, "enum entry", Collections.<TypeParameterDescriptor>emptyList(),
Collections.singleton(supertype)); Collections.singleton(supertype));
@@ -160,8 +164,7 @@ public class EnumEntrySyntheticClassDescriptor extends ClassDescriptorBase {
@NotNull @NotNull
@Override @Override
public Annotations getAnnotations() { public Annotations getAnnotations() {
// TODO return annotations;
return Annotations.Companion.getEMPTY();
} }
@Override @Override
@@ -304,7 +304,8 @@ public class DeserializedClassDescriptor(
name -> name ->
if (name in enumEntryNames) { if (name in enumEntryNames) {
EnumEntrySyntheticClassDescriptor.create( EnumEntrySyntheticClassDescriptor.create(
c.storageManager, this@DeserializedClassDescriptor, name, enumMemberNames, SourceElement.NO_SOURCE //TODO: load annotations from class file
c.storageManager, this@DeserializedClassDescriptor, name, enumMemberNames, Annotations.EMPTY, SourceElement.NO_SOURCE
) )
} }
else null else null