diff --git a/j2k/src/org/jetbrains/jet/j2k/Converter.kt b/j2k/src/org/jetbrains/jet/j2k/Converter.kt index 3fe00cf8837..07ce8fb2a90 100644 --- a/j2k/src/org/jetbrains/jet/j2k/Converter.kt +++ b/j2k/src/org/jetbrains/jet/j2k/Converter.kt @@ -629,7 +629,7 @@ public class Converter private(val project: Project, val settings: ConverterSett } } - val list = annotations.map { convertAnnotation(it, owner is PsiLocalVariable) }.filterNotNull() + val list = annotations.map { convertAnnotation(it, owner is PsiLocalVariable) }.filterNotNull() //TODO: brackets are also needed for local classes return Annotations(list, newLines) } @@ -649,34 +649,40 @@ public class Converter private(val project: Project, val settings: ConverterSett val attrName = it.getName()?.let { Identifier(it) } val value = it.getValue() - val attrValues = when(value) { - is PsiExpression -> listOf(convertExpression(it.getValue() as? PsiExpression, expectedType)) - - is PsiArrayInitializerMemberValue -> { - val isVarArg = method == lastMethod /* converted to vararg in Kotlin */ - if (isVarArg && it.getName() == null) { - value.getInitializers().map { DummyStringExpression(it.getText()!!)/*TODO*/ } - } - else { - val expectedTypeConverted = typeConverter.convertType(expectedType) - if (expectedTypeConverted is ArrayType) { - val array = createArrayInitializerExpression(expectedTypeConverted, value.getInitializers().map { DummyStringExpression(it.getText()!!)/*TODO*/ }) - listOf(if (isVarArg) StarExpression(array) else array) - } - else { - listOf(DummyStringExpression(value.getText()!!)) - } - } - } - - else -> listOf(DummyStringExpression(value?.getText() ?: "")) - } + val isVarArg = method == lastMethod /* converted to vararg in Kotlin */ + val attrValues = convertAttributeValue(value, expectedType, isVarArg, it.getName() == null) attrValues.map { attrName to it } } return Annotation(name, arguments, brackets) } + private fun convertAttributeValue(value: PsiAnnotationMemberValue?, expectedType: PsiType?, isVararg: Boolean, isUnnamed: Boolean): List { + return when(value) { + is PsiExpression -> listOf(convertExpression(value as? PsiExpression, expectedType)) + + is PsiArrayInitializerMemberValue -> { + val componentType = (expectedType as? PsiArrayType)?.getComponentType() + val componentsConverted = value.getInitializers().map { convertAttributeValue(it, componentType, false, true).single() } + if (isVararg && isUnnamed) { + componentsConverted + } + else { + val expectedTypeConverted = typeConverter.convertType(expectedType) + if (expectedTypeConverted is ArrayType) { + val array = createArrayInitializerExpression(expectedTypeConverted, componentsConverted) + listOf(if (isVararg) StarExpression(array) else array) + } + else { + listOf(DummyStringExpression(value.getText()!!)) + } + } + } + + else -> listOf(DummyStringExpression(value?.getText() ?: "")) + } + } + private val TYPE_MAP: Map = mapOf( JAVA_LANG_BYTE to "byte", JAVA_LANG_SHORT to "short", diff --git a/j2k/tests/testData/JavaApi.java b/j2k/tests/testData/JavaApi.java index fe7d506ad72..f0d51257d23 100644 --- a/j2k/tests/testData/JavaApi.java +++ b/j2k/tests/testData/JavaApi.java @@ -32,6 +32,14 @@ public @interface Anon6 { int intValue() default 10; } +public @interface Anon7 { + Class[] value(); +} + +public @interface Anon8 { + Class[] classes(); +} + public enum E { A, B, C } diff --git a/j2k/tests/testData/ast/annotations/annotationUsages.java b/j2k/tests/testData/ast/annotations/annotationUsages.java index 7c5577f721c..0ef69bb0679 100644 --- a/j2k/tests/testData/ast/annotations/annotationUsages.java +++ b/j2k/tests/testData/ast/annotations/annotationUsages.java @@ -7,6 +7,8 @@ import javaApi.*; @Anon4({"x", "y"}) @Anon5(1) @Anon6({"x", "y"}) +@Anon7({ String.class, StringBuilder.class }) +@Anon8(classes = { String.class, StringBuilder.class }) class C { @Anon5(1) @Deprecated private int field1 = 0; diff --git a/j2k/tests/testData/ast/annotations/annotationUsages.kt b/j2k/tests/testData/ast/annotations/annotationUsages.kt index 9ef317ef824..853a29131eb 100644 --- a/j2k/tests/testData/ast/annotations/annotationUsages.kt +++ b/j2k/tests/testData/ast/annotations/annotationUsages.kt @@ -6,6 +6,8 @@ Anon3(e = E.A, stringArray = array(), value = *array("a", "b")) Anon4("x", "y") Anon5(1) Anon6(array("x", "y")) +Anon7(javaClass(), javaClass()) +Anon8(classes = *array>(javaClass(), javaClass())) class C() { Anon5(1) deprecated("") private var field1: Int = 0