From 4710f709ce480e802792c24d06338fded665f44e Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Tue, 11 Oct 2016 18:42:32 +0300 Subject: [PATCH] Fix for KT-10545 //TODO unfix: see KT-14305 --- .../kotlin/j2k/AnnotationConverter.kt | 35 +++++++++++++------ .../AnnotationWithArrayParameter/Some.java | 13 +++++++ .../AnnotationWithArrayParameter/Some.kt | 13 +++++++ .../external/SomeAnnotation.java | 8 +++++ .../external/SomeAnnotation.java.expected | 8 +++++ ...KotlinConverterMultiFileTestGenerated.java | 6 ++++ 6 files changed, 72 insertions(+), 11 deletions(-) create mode 100644 j2k/testData/multiFile/AnnotationWithArrayParameter/Some.java create mode 100644 j2k/testData/multiFile/AnnotationWithArrayParameter/Some.kt create mode 100644 j2k/testData/multiFile/AnnotationWithArrayParameter/external/SomeAnnotation.java create mode 100644 j2k/testData/multiFile/AnnotationWithArrayParameter/external/SomeAnnotation.java.expected diff --git a/j2k/src/org/jetbrains/kotlin/j2k/AnnotationConverter.kt b/j2k/src/org/jetbrains/kotlin/j2k/AnnotationConverter.kt index 4ec1243125f..4bbd734f02b 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/AnnotationConverter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/AnnotationConverter.kt @@ -160,19 +160,20 @@ class AnnotationConverter(private val converter: Converter) { fun convertAnnotationMethodDefault(method: PsiAnnotationMethod): DeferredElement? { val value = method.defaultValue ?: return null - val convertAttributeValue = convertAttributeValue(value, method.returnType, false, false) - if (method.returnType is PsiArrayType && value !is PsiArrayInitializerMemberValue) { + val returnType = method.returnType + if (returnType is PsiArrayType && value !is PsiArrayInitializerMemberValue) { return converter.deferredElement { codeConverter -> - val convertedType = converter.typeConverter.convertType(method.returnType) as ArrayType + val convertedType = converter.typeConverter.convertType(returnType) as ArrayType + val convertAttributeValue = convertAttributeValue(value, returnType.componentType, false, false) createArrayExpression(codeConverter, convertAttributeValue.toList(), convertedType, false) } } - return converter.deferredElement(convertAttributeValue.single()) + return converter.deferredElement(convertAttributeValue(value, returnType, false, false).single()) } private fun convertAttributeValue(value: PsiAnnotationMemberValue?, expectedType: PsiType?, isVararg: Boolean, isUnnamed: Boolean): List<(CodeConverter) -> Expression> { return when (value) { - is PsiExpression -> listOf({ codeConverter -> convertExpressionValue(codeConverter, value, expectedType) }) + is PsiExpression -> listOf({ codeConverter -> convertExpressionValue(codeConverter, value, expectedType, isVararg) }) is PsiArrayInitializerMemberValue -> { val componentType = (expectedType as? PsiArrayType)?.componentType @@ -181,7 +182,10 @@ class AnnotationConverter(private val converter: Converter) { componentGenerators } else { - listOf({ codeConverter -> convertArrayInitializerValue(codeConverter, value, componentGenerators, expectedType, isVararg) }) + listOf({ codeConverter -> + convertArrayInitializerValue(codeConverter, value.text, componentGenerators, expectedType, isVararg) + .assignPrototype(value) + }) } } @@ -195,30 +199,39 @@ class AnnotationConverter(private val converter: Converter) { } } - private fun convertExpressionValue(codeConverter: CodeConverter, value: PsiExpression, expectedType: PsiType?): Expression { + private fun convertExpressionValue(codeConverter: CodeConverter, value: PsiExpression, expectedType: PsiType?, isVararg: Boolean): Expression { val expression = if (value is PsiClassObjectAccessExpression) { val type = converter.convertTypeElement(value.operand, Nullability.NotNull) ClassLiteralExpression(type) } else { codeConverter.convertExpression(value, expectedType) + }.assignPrototype(value) + + if (expectedType is PsiArrayType && !isVararg) { + return convertArrayInitializerValue(codeConverter, + value.text, + listOf({ codeConverter -> expression }), + expectedType, + false + ).assignPrototype(value) } - return expression.assignPrototype(value) + return expression } private fun convertArrayInitializerValue( codeConverter: CodeConverter, - value: PsiArrayInitializerMemberValue, + valueText: String, componentGenerators: List<(CodeConverter) -> Expression>, expectedType: PsiType?, isVararg: Boolean ): Expression { val expectedTypeConverted = converter.typeConverter.convertType(expectedType) return if (expectedTypeConverted is ArrayType) { - createArrayExpression(codeConverter, componentGenerators, expectedTypeConverted, isVararg).assignPrototype(value) + createArrayExpression(codeConverter, componentGenerators, expectedTypeConverted, isVararg) } else { - DummyStringExpression(value.text!!).assignPrototype(value) + DummyStringExpression(valueText) } } diff --git a/j2k/testData/multiFile/AnnotationWithArrayParameter/Some.java b/j2k/testData/multiFile/AnnotationWithArrayParameter/Some.java new file mode 100644 index 00000000000..a738d97a5dd --- /dev/null +++ b/j2k/testData/multiFile/AnnotationWithArrayParameter/Some.java @@ -0,0 +1,13 @@ +package test; + +public class Some { + @SomeAnnotation(some = "Foo", same = 0) + public void foo() { + + } + + @SomeAnnotation(some = {"Bar", "Buz"}, same = {1, 2}) + public void bar() { + + } +} \ No newline at end of file diff --git a/j2k/testData/multiFile/AnnotationWithArrayParameter/Some.kt b/j2k/testData/multiFile/AnnotationWithArrayParameter/Some.kt new file mode 100644 index 00000000000..a5d2e230439 --- /dev/null +++ b/j2k/testData/multiFile/AnnotationWithArrayParameter/Some.kt @@ -0,0 +1,13 @@ +package test + +class Some { + @SomeAnnotation(some = arrayOf("Foo"), same = intArrayOf(0)) + fun foo() { + + } + + @SomeAnnotation(some = arrayOf("Bar", "Buz"), same = intArrayOf(1, 2)) + fun bar() { + + } +} \ No newline at end of file diff --git a/j2k/testData/multiFile/AnnotationWithArrayParameter/external/SomeAnnotation.java b/j2k/testData/multiFile/AnnotationWithArrayParameter/external/SomeAnnotation.java new file mode 100644 index 00000000000..566340af45a --- /dev/null +++ b/j2k/testData/multiFile/AnnotationWithArrayParameter/external/SomeAnnotation.java @@ -0,0 +1,8 @@ +package test; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE, ElementType.METHOD}) +public @interface SomeAnnotation { + String[] some() default {}; + int[] same() default {}; +} \ No newline at end of file diff --git a/j2k/testData/multiFile/AnnotationWithArrayParameter/external/SomeAnnotation.java.expected b/j2k/testData/multiFile/AnnotationWithArrayParameter/external/SomeAnnotation.java.expected new file mode 100644 index 00000000000..37ea13cd183 --- /dev/null +++ b/j2k/testData/multiFile/AnnotationWithArrayParameter/external/SomeAnnotation.java.expected @@ -0,0 +1,8 @@ +package test; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE, ElementType.METHOD}) +public @interface SomeAnnotation { + String[] some() default {}; + int[] same() default {}; +} diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterMultiFileTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterMultiFileTestGenerated.java index ed4c7e776b5..5a2beb8e7f3 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterMultiFileTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterMultiFileTestGenerated.java @@ -35,6 +35,12 @@ public class JavaToKotlinConverterMultiFileTestGenerated extends AbstractJavaToK KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("j2k/testData/multiFile"), Pattern.compile("^([^\\.]+)$"), false); } + @TestMetadata("AnnotationWithArrayParameter") + public void testAnnotationWithArrayParameter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/multiFile/AnnotationWithArrayParameter/"); + doTest(fileName); + } + @TestMetadata("FieldToProperty") public void testFieldToProperty() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/multiFile/FieldToProperty/");