diff --git a/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/EnumEntry.kt b/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/EnumEntry.kt new file mode 100644 index 00000000000..02061bacb02 --- /dev/null +++ b/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/EnumEntry.kt @@ -0,0 +1,15 @@ +// ALLOW_AST_ACCESS +package test + +annotation class Anno(val value: String = "0", val x: Int = 0) +annotation class Bnno + +enum class Eee { + @Anno() + Entry1, + Entry2, + @Anno("3") @Bnno + Entry3, + @Anno("4", 4) + Entry4, +} diff --git a/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/EnumEntry.txt b/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/EnumEntry.txt new file mode 100644 index 00000000000..c8ff9ffb1f4 --- /dev/null +++ b/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/EnumEntry.txt @@ -0,0 +1,37 @@ +package test + +public final annotation class Anno : kotlin.Annotation { + /*primary*/ public constructor Anno(/*0*/ value: kotlin.String = ..., /*1*/ x: kotlin.Int = ...) + public final val value: kotlin.String + public final fun (): kotlin.String + public final val x: kotlin.Int + public final fun (): kotlin.Int +} + +public final annotation class Bnno : kotlin.Annotation { + /*primary*/ public constructor Bnno() +} + +public final enum class Eee : kotlin.Enum { + @test.Anno() enum entry Entry1 + + enum entry Entry2 + + @test.Anno(value = "3") @test.Bnno() enum entry Entry3 + + @test.Anno(value = "4", x = 4) enum entry Entry4 + + /*primary*/ private constructor Eee() + public final override /*1*/ /*fake_override*/ val name: kotlin.String + public final override /*1*/ /*fake_override*/ fun (): kotlin.String + public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int + public final override /*1*/ /*fake_override*/ fun (): kotlin.Int + protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: test.Eee): kotlin.Int + + // Static members + @kotlin.Deprecated(level = DeprecationLevel.ERROR, message = "Use 'values()' function instead", replaceWith = kotlin.ReplaceWith(expression = "this.values()", imports = {})) public final /*synthesized*/ val values: kotlin.Array + public final fun (): kotlin.Array + public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): test.Eee + public final /*synthesized*/ fun values(): kotlin.Array +} diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java index 91a5617c03a..9d4a7615602 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java @@ -1872,6 +1872,12 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest { doTestCompiledKotlin(fileName); } + @TestMetadata("EnumEntry.kt") + public void testEnumEntry() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/annotations/classMembers/EnumEntry.kt"); + doTestCompiledKotlin(fileName); + } + @TestMetadata("Function.kt") public void testFunction() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/annotations/classMembers/Function.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadKotlinWithTypeTableTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadKotlinWithTypeTableTestGenerated.java index 71a119a87cb..a66e5de271c 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadKotlinWithTypeTableTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadKotlinWithTypeTableTestGenerated.java @@ -117,6 +117,12 @@ public class LoadKotlinWithTypeTableTestGenerated extends AbstractLoadKotlinWith doTest(fileName); } + @TestMetadata("EnumEntry.kt") + public void testEnumEntry() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/annotations/classMembers/EnumEntry.kt"); + doTest(fileName); + } + @TestMetadata("Function.kt") public void testFunction() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/annotations/classMembers/Function.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java index 38701f7080f..37b4473edca 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java @@ -119,6 +119,12 @@ public class JvmRuntimeDescriptorLoaderTestGenerated extends AbstractJvmRuntimeD doTest(fileName); } + @TestMetadata("EnumEntry.kt") + public void testEnumEntry() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/annotations/classMembers/EnumEntry.kt"); + doTest(fileName); + } + @TestMetadata("Function.kt") public void testFunction() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/annotations/classMembers/Function.kt"); diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt index e0d0200716b..d7d63c8c288 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.serialization.ProtoBuf import org.jetbrains.kotlin.serialization.deserialization.* +import org.jetbrains.kotlin.serialization.jvm.ClassMapperLite import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.* import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil @@ -109,12 +110,12 @@ public abstract class AbstractBinaryClassAnnotationAndConstantLoader { - // TODO - return listOf() + override fun loadEnumEntryAnnotations(container: ProtoContainer, proto: ProtoBuf.EnumEntry): List { + val signature = MemberSignature.fromFieldNameAndDesc( + container.nameResolver.getString(proto.name), + ClassMapperLite.mapClass(container.nameResolver.getClassId(container.classProto!!.fqName)) + ) + return findClassAndLoadMemberAnnotations(container, proto, signature) } protected abstract fun loadPropertyAnnotations(propertyAnnotations: List, fieldAnnotations: List): List diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/MemberSignature.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/MemberSignature.kt index b6e976ee7f3..d9285c5a9ed 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/MemberSignature.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/MemberSignature.kt @@ -21,30 +21,30 @@ import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf // The purpose of this class is to hold a unique signature of either a method or a field, so that annotations on a member can be put // into a map indexed by these signatures -data class MemberSignature private constructor(private val signature: String) { +internal data class MemberSignature private constructor(private val signature: String) { companion object { @JvmStatic - public fun fromMethod(nameResolver: NameResolver, signature: JvmProtoBuf.JvmMethodSignature): MemberSignature { + fun fromMethod(nameResolver: NameResolver, signature: JvmProtoBuf.JvmMethodSignature): MemberSignature { return fromMethodNameAndDesc(nameResolver.getString(signature.name), nameResolver.getString(signature.desc)) } @JvmStatic - public fun fromMethodNameAndDesc(name: String, desc: String): MemberSignature { + fun fromMethodNameAndDesc(name: String, desc: String): MemberSignature { return MemberSignature(name + desc) } @JvmStatic - public fun fromMethodNameAndDesc(namePlusDesc: String): MemberSignature { + fun fromMethodNameAndDesc(namePlusDesc: String): MemberSignature { return MemberSignature(namePlusDesc) } @JvmStatic - public fun fromFieldNameAndDesc(name: String, desc: String): MemberSignature { + fun fromFieldNameAndDesc(name: String, desc: String): MemberSignature { return MemberSignature(name + "#" + desc) } @JvmStatic - public fun fromMethodSignatureAndParameterIndex(signature: MemberSignature, index: Int): MemberSignature { + fun fromMethodSignatureAndParameterIndex(signature: MemberSignature, index: Int): MemberSignature { return MemberSignature(signature.signature + "@" + index) } } diff --git a/idea/tests/org/jetbrains/kotlin/idea/stubs/ResolveByStubTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/stubs/ResolveByStubTestGenerated.java index e06f3831691..931043d839e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/stubs/ResolveByStubTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/stubs/ResolveByStubTestGenerated.java @@ -117,6 +117,12 @@ public class ResolveByStubTestGenerated extends AbstractResolveByStubTest { doTest(fileName); } + @TestMetadata("EnumEntry.kt") + public void testEnumEntry() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/annotations/classMembers/EnumEntry.kt"); + doTest(fileName); + } + @TestMetadata("Function.kt") public void testFunction() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/annotations/classMembers/Function.kt");