From 2a03994ecb74142adf45457b4d914628ccca3f44 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Wed, 15 Apr 2015 14:34:30 +0300 Subject: [PATCH] JVM: Write signature for annotation parameter --- .../kotlin/codegen/PropertyCodegen.java | 9 +++- .../kotlin/codegen/state/JetTypeMapper.java | 19 ++++--- .../annotations/jArrayClassOfKClass.kt | 7 +++ .../writeSignature/annotations/jClassBasic.kt | 7 +++ .../writeSignature/annotations/jClassInt.kt | 7 +++ .../annotations/kArrayClassOfJClass.kt | 7 +++ .../annotations/kArrayClassOfKClass.kt | 7 +++ .../writeSignature/annotations/kClassBasic.kt | 7 +++ .../writeSignature/annotations/kClassInt.kt | 7 +++ .../compiler/WriteSignatureTestGenerated.java | 51 +++++++++++++++++++ 10 files changed, 116 insertions(+), 12 deletions(-) create mode 100644 compiler/testData/writeSignature/annotations/jArrayClassOfKClass.kt create mode 100644 compiler/testData/writeSignature/annotations/jClassBasic.kt create mode 100644 compiler/testData/writeSignature/annotations/jClassInt.kt create mode 100644 compiler/testData/writeSignature/annotations/kArrayClassOfJClass.kt create mode 100644 compiler/testData/writeSignature/annotations/kArrayClassOfKClass.kt create mode 100644 compiler/testData/writeSignature/annotations/kClassBasic.kt create mode 100644 compiler/testData/writeSignature/annotations/kClassInt.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java index 7fcbc239c00..63209ff0999 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java @@ -166,10 +166,15 @@ public class PropertyCodegen { } public void generateConstructorPropertyAsMethodForAnnotationClass(JetParameter p, PropertyDescriptor descriptor) { - Type type = typeMapper.mapAnnotationParameterType(descriptor); + JvmMethodSignature signature = typeMapper.mapAnnotationParameterSignature(descriptor); String name = p.getName(); assert name != null : "Annotation parameter has no name: " + p.getText(); - MethodVisitor mv = v.newMethod(OtherOrigin(p, descriptor), ACC_PUBLIC | ACC_ABSTRACT, name, "()" + type.getDescriptor(), null, null); + MethodVisitor mv = v.newMethod( + OtherOrigin(p, descriptor), ACC_PUBLIC | ACC_ABSTRACT, name, + signature.getAsmMethod().getDescriptor(), + signature.getGenericsSignature(), + null + ); if (state.getClassBuilderMode() == ClassBuilderMode.FULL) { JetExpression defaultValue = p.getDefaultValue(); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java index f3913f22962..894c9e48da7 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java @@ -241,8 +241,12 @@ public class JetTypeMapper { } @NotNull - public Type mapAnnotationParameterType(@NotNull PropertyDescriptor descriptor) { - return mapType(descriptor.getType(), null, JetTypeMapperMode.VALUE_FOR_ANNOTATION); + public JvmMethodSignature mapAnnotationParameterSignature(@NotNull PropertyDescriptor descriptor) { + BothSignatureWriter sw = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD); + sw.writeReturnType(); + mapType(descriptor.getType(), sw, JetTypeMapperMode.VALUE_FOR_ANNOTATION); + sw.writeReturnTypeEnd(); + return sw.makeJvmMethodSignature(descriptor.getName().asString()); } @NotNull @@ -353,14 +357,9 @@ public class JetTypeMapper { return asmType; } - if (kind.isForAnnotation() && KotlinBuiltIns.isKClass((ClassDescriptor) descriptor)) { - if (signatureVisitor != null) { - signatureVisitor.writeAsmType(AsmTypes.JAVA_CLASS_TYPE); - } - return AsmTypes.JAVA_CLASS_TYPE; - } - - Type asmType = computeAsmType((ClassDescriptor) descriptor.getOriginal()); + Type asmType = kind.isForAnnotation() && KotlinBuiltIns.isKClass((ClassDescriptor) descriptor) ? + AsmTypes.JAVA_CLASS_TYPE : + computeAsmType((ClassDescriptor) descriptor.getOriginal()); writeGenericType(signatureVisitor, asmType, jetType, howThisTypeIsUsed, projectionsAllowed); return asmType; } diff --git a/compiler/testData/writeSignature/annotations/jArrayClassOfKClass.kt b/compiler/testData/writeSignature/annotations/jArrayClassOfKClass.kt new file mode 100644 index 00000000000..df991b6c4e5 --- /dev/null +++ b/compiler/testData/writeSignature/annotations/jArrayClassOfKClass.kt @@ -0,0 +1,7 @@ +import kotlin.reflect.KClass + +annotation class Ann(val arg: Array>>) + +// method: Ann::arg +// jvm signature: ()[Ljava/lang/Class; +// generic signature: ()[Ljava/lang/Class<+Lkotlin/reflect/KClass<*>;>; diff --git a/compiler/testData/writeSignature/annotations/jClassBasic.kt b/compiler/testData/writeSignature/annotations/jClassBasic.kt new file mode 100644 index 00000000000..9307dc6b484 --- /dev/null +++ b/compiler/testData/writeSignature/annotations/jClassBasic.kt @@ -0,0 +1,7 @@ +import kotlin.reflect.KClass + +annotation class Ann(val arg: Class<*>) + +// method: Ann::arg +// jvm signature: ()Ljava/lang/Class; +// generic signature: ()Ljava/lang/Class<*>; diff --git a/compiler/testData/writeSignature/annotations/jClassInt.kt b/compiler/testData/writeSignature/annotations/jClassInt.kt new file mode 100644 index 00000000000..edc18adc5a3 --- /dev/null +++ b/compiler/testData/writeSignature/annotations/jClassInt.kt @@ -0,0 +1,7 @@ +import kotlin.reflect.KClass + +annotation class Ann(val arg: Class) + +// method: Ann::arg +// jvm signature: ()Ljava/lang/Class; +// generic signature: ()Ljava/lang/Class; diff --git a/compiler/testData/writeSignature/annotations/kArrayClassOfJClass.kt b/compiler/testData/writeSignature/annotations/kArrayClassOfJClass.kt new file mode 100644 index 00000000000..b153bd1c227 --- /dev/null +++ b/compiler/testData/writeSignature/annotations/kArrayClassOfJClass.kt @@ -0,0 +1,7 @@ +import kotlin.reflect.KClass + +annotation class Ann(val arg: Array>>) + +// method: Ann::arg +// jvm signature: ()[Ljava/lang/Class; +// generic signature: ()[Ljava/lang/Class<+Ljava/lang/Class<*>;>; diff --git a/compiler/testData/writeSignature/annotations/kArrayClassOfKClass.kt b/compiler/testData/writeSignature/annotations/kArrayClassOfKClass.kt new file mode 100644 index 00000000000..768185f8cb3 --- /dev/null +++ b/compiler/testData/writeSignature/annotations/kArrayClassOfKClass.kt @@ -0,0 +1,7 @@ +import kotlin.reflect.KClass + +annotation class Ann(val arg: Array>>) + +// method: Ann::arg +// jvm signature: ()[Ljava/lang/Class; +// generic signature: ()[Ljava/lang/Class<+Lkotlin/reflect/KClass<*>;>; diff --git a/compiler/testData/writeSignature/annotations/kClassBasic.kt b/compiler/testData/writeSignature/annotations/kClassBasic.kt new file mode 100644 index 00000000000..dadfbc273cf --- /dev/null +++ b/compiler/testData/writeSignature/annotations/kClassBasic.kt @@ -0,0 +1,7 @@ +import kotlin.reflect.KClass + +annotation class Ann(val arg: KClass<*>) + +// method: Ann::arg +// jvm signature: ()Ljava/lang/Class; +// generic signature: ()Ljava/lang/Class<*>; diff --git a/compiler/testData/writeSignature/annotations/kClassInt.kt b/compiler/testData/writeSignature/annotations/kClassInt.kt new file mode 100644 index 00000000000..8216b19e1d7 --- /dev/null +++ b/compiler/testData/writeSignature/annotations/kClassInt.kt @@ -0,0 +1,7 @@ +import kotlin.reflect.KClass + +annotation class Ann(val arg: KClass) + +// method: Ann::arg +// jvm signature: ()Ljava/lang/Class; +// generic signature: ()Ljava/lang/Class; diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/WriteSignatureTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/WriteSignatureTestGenerated.java index ecba5ad28eb..46f51382822 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/WriteSignatureTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/WriteSignatureTestGenerated.java @@ -137,6 +137,57 @@ public class WriteSignatureTestGenerated extends AbstractWriteSignatureTest { doTest(fileName); } + @TestMetadata("compiler/testData/writeSignature/annotations") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Annotations extends AbstractWriteSignatureTest { + public void testAllFilesPresentInAnnotations() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/writeSignature/annotations"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("jArrayClassOfKClass.kt") + public void testJArrayClassOfKClass() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/writeSignature/annotations/jArrayClassOfKClass.kt"); + doTest(fileName); + } + + @TestMetadata("jClassBasic.kt") + public void testJClassBasic() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/writeSignature/annotations/jClassBasic.kt"); + doTest(fileName); + } + + @TestMetadata("jClassInt.kt") + public void testJClassInt() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/writeSignature/annotations/jClassInt.kt"); + doTest(fileName); + } + + @TestMetadata("kArrayClassOfJClass.kt") + public void testKArrayClassOfJClass() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/writeSignature/annotations/kArrayClassOfJClass.kt"); + doTest(fileName); + } + + @TestMetadata("kArrayClassOfKClass.kt") + public void testKArrayClassOfKClass() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/writeSignature/annotations/kArrayClassOfKClass.kt"); + doTest(fileName); + } + + @TestMetadata("kClassBasic.kt") + public void testKClassBasic() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/writeSignature/annotations/kClassBasic.kt"); + doTest(fileName); + } + + @TestMetadata("kClassInt.kt") + public void testKClassInt() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/writeSignature/annotations/kClassInt.kt"); + doTest(fileName); + } + } + @TestMetadata("compiler/testData/writeSignature/constructor") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)