diff --git a/compiler/testData/loadJava/compiledJava/annotations/EnumConstructorParameter.java b/compiler/testData/loadJava/compiledJava/annotations/EnumConstructorParameter.java new file mode 100644 index 00000000000..bea430fd2a7 --- /dev/null +++ b/compiler/testData/loadJava/compiledJava/annotations/EnumConstructorParameter.java @@ -0,0 +1,15 @@ +package test; + +public enum EnumConstructorParameter { + INSTANCE("instance"); + + public @interface Anno { + String value(); + } + + EnumConstructorParameter(@Anno("string") String s) { + } + + EnumConstructorParameter(int x) { + } +} diff --git a/compiler/testData/loadJava/compiledJava/annotations/EnumConstructorParameter.txt b/compiler/testData/loadJava/compiledJava/annotations/EnumConstructorParameter.txt new file mode 100644 index 00000000000..7c10eb2dc58 --- /dev/null +++ b/compiler/testData/loadJava/compiledJava/annotations/EnumConstructorParameter.txt @@ -0,0 +1,25 @@ +package test + +public final enum class EnumConstructorParameter : kotlin.Enum { + public enum entry INSTANCE : test.EnumConstructorParameter { + private constructor INSTANCE() + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: test.EnumConstructorParameter!): kotlin.Int + public final override /*1*/ /*fake_override*/ fun name(): kotlin.String + public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int + } + + private constructor EnumConstructorParameter(/*0*/ p0: kotlin.Int) + private constructor EnumConstructorParameter(/*0*/ test.EnumConstructorParameter.Anno(value = "string": kotlin.String) p0: kotlin.String!) + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: test.EnumConstructorParameter!): kotlin.Int + public final override /*1*/ /*fake_override*/ fun name(): kotlin.String + public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int + + public final annotation class Anno : kotlin.Annotation { + public constructor Anno(/*0*/ value: kotlin.String) + public abstract fun value(): kotlin.String + } + + // Static members + public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): test.EnumConstructorParameter + 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 206a9f75f75..5bd5bb9ac91 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java @@ -415,6 +415,12 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest { doTestCompiledJava(fileName); } + @TestMetadata("EnumConstructorParameter.java") + public void testEnumConstructorParameter() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledJava/annotations/EnumConstructorParameter.java"); + doTestCompiledJava(fileName); + } + @TestMetadata("EnumInParam.java") public void testEnumInParam() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledJava/annotations/EnumInParam.java"); diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java index 6660595d637..f0e54d812a7 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java @@ -3457,6 +3457,12 @@ public class JvmRuntimeDescriptorLoaderTestGenerated extends AbstractJvmRuntimeD doTest(fileName); } + @TestMetadata("EnumConstructorParameter.java") + public void testEnumConstructorParameter() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledJava/annotations/EnumConstructorParameter.java"); + doTest(fileName); + } + @TestMetadata("EnumInParam.java") public void testEnumInParam() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledJava/annotations/EnumInParam.java"); diff --git a/core/descriptors.runtime/src/org/jetbrains/kotlin/load/java/structure/reflect/ReflectJavaConstructor.kt b/core/descriptors.runtime/src/org/jetbrains/kotlin/load/java/structure/reflect/ReflectJavaConstructor.kt index 544d4343b05..5c04cba91ec 100644 --- a/core/descriptors.runtime/src/org/jetbrains/kotlin/load/java/structure/reflect/ReflectJavaConstructor.kt +++ b/core/descriptors.runtime/src/org/jetbrains/kotlin/load/java/structure/reflect/ReflectJavaConstructor.kt @@ -21,24 +21,28 @@ import org.jetbrains.kotlin.load.java.structure.JavaTypeParameter import org.jetbrains.kotlin.load.java.structure.JavaValueParameter import java.lang.reflect.Constructor import java.lang.reflect.Modifier -import java.util.Arrays public class ReflectJavaConstructor(override val member: Constructor<*>) : ReflectJavaMember(), JavaConstructor { - override fun getValueParameters(): List = - getValueParameters( - dropSynthetic(member.getGenericParameterTypes()), - dropSynthetic(member.getParameterAnnotations()), - member.isVarArgs() - ) + // TODO: test local/anonymous classes + override fun getValueParameters(): List { + val types = member.getGenericParameterTypes() + if (types.isEmpty()) return emptyList() - // Constructors of inner classes have one additional synthetic parameter - // TODO: test this code with annotations on constructor parameters of enums and inner classes - private inline fun dropSynthetic(array: Array): Array { val klass = member.getDeclaringClass() - return if (klass.getDeclaringClass() != null && !Modifier.isStatic(klass.getModifiers())) { - Arrays.copyOfRange(array, 1, array.size()) + + val realTypes = when { + klass.getDeclaringClass() != null && !Modifier.isStatic(klass.getModifiers()) -> types.copyOfRange(1, types.size()) + else -> types } - else array + + val annotations = member.getParameterAnnotations() + val realAnnotations = when { + annotations.size() < realTypes.size() -> throw IllegalStateException("Illegal generic signature: $member") + annotations.size() > realTypes.size() -> annotations.copyOfRange(annotations.size() - realTypes.size(), annotations.size()) + else -> annotations + } + + return getValueParameters(realTypes, realAnnotations, member.isVarArgs()) } override fun getTypeParameters(): List {