diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationResolver.java index 5e8a7a2e79e..450cdfc6f5e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationResolver.java @@ -264,6 +264,8 @@ public class AnnotationResolver { } }); + if (parameterDescriptor.declaresDefaultValue() && constants.isEmpty()) return null; + return new ArrayValue(constants, parameterDescriptor.getType(), true, usesVariableAsConstant); } else { diff --git a/compiler/testData/codegen/boxAgainstJava/annotations/javaAnnotationArrayValueDefault.java b/compiler/testData/codegen/boxAgainstJava/annotations/javaAnnotationArrayValueDefault.java new file mode 100644 index 00000000000..3faefb8a3f9 --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/annotations/javaAnnotationArrayValueDefault.java @@ -0,0 +1,7 @@ +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +@interface JavaAnn { + String[] value() default {"d1", "d2"}; +} diff --git a/compiler/testData/codegen/boxAgainstJava/annotations/javaAnnotationArrayValueDefault.kt b/compiler/testData/codegen/boxAgainstJava/annotations/javaAnnotationArrayValueDefault.kt new file mode 100644 index 00000000000..6517a950658 --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/annotations/javaAnnotationArrayValueDefault.kt @@ -0,0 +1,26 @@ +JavaAnn class MyClass1 +JavaAnn() class MyClass2 +JavaAnn("asd") class MyClass3 +JavaAnn(*array()) class MyClass4 + + +fun box(): String { + val value1 = javaClass().getAnnotation(javaClass()).value() + if (value1.size() != 2) return "fail1: ${value1.size()}" + if (value1[0] != "d1") return "fail2: ${value1[0]}" + if (value1[1] != "d2") return "fail3: ${value1[1]}" + + val value2 = javaClass().getAnnotation(javaClass()).value() + if (value2.size() != 2) return "fail4: ${value2.size()}" + if (value2[0] != "d1") return "fail5: ${value2[0]}" + if (value2[1] != "d2") return "fail6: ${value2[1]}" + + val value3 = javaClass().getAnnotation(javaClass()).value() + if (value3.size() != 1) return "fail7: ${value3.size()}" + if (value3[0] != "asd") return "fail8: ${value3[0]}" + + val value4 = javaClass().getAnnotation(javaClass()).value() + if (value4.size() != 0) return "fail 9: ${value4.size()}" + + return "OK" +} diff --git a/compiler/testData/codegen/boxAgainstJava/annotations/javaAnnotationArrayValueNoDefault.java b/compiler/testData/codegen/boxAgainstJava/annotations/javaAnnotationArrayValueNoDefault.java new file mode 100644 index 00000000000..59408340bcb --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/annotations/javaAnnotationArrayValueNoDefault.java @@ -0,0 +1,7 @@ +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +@interface JavaAnn { + String[] value(); +} diff --git a/compiler/testData/codegen/boxAgainstJava/annotations/javaAnnotationArrayValueNoDefault.kt b/compiler/testData/codegen/boxAgainstJava/annotations/javaAnnotationArrayValueNoDefault.kt new file mode 100644 index 00000000000..b0072ebff1a --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/annotations/javaAnnotationArrayValueNoDefault.kt @@ -0,0 +1,22 @@ +JavaAnn class MyClass1 +JavaAnn() class MyClass2 +JavaAnn("asd") class MyClass3 +JavaAnn(*array()) class MyClass4 + + +fun box(): String { + val value1 = javaClass().getAnnotation(javaClass()).value() + if (value1.size() != 0) return "fail1: ${value1.size()}" + + val value2 = javaClass().getAnnotation(javaClass()).value() + if (value2.size() != 0) return "fail2: ${value2.size()}" + + val value3 = javaClass().getAnnotation(javaClass()).value() + if (value3.size() != 1) return "fail3: ${value3.size()}" + if (value3[0] != "asd") return "fail4: ${value3[0]}" + + val value4 = javaClass().getAnnotation(javaClass()).value() + if (value4.size() != 0) return "fail 5: ${value4.size()}" + + return "OK" +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/valueArrayWithDefault.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/valueArrayWithDefault.kt new file mode 100644 index 00000000000..4c4f1297b8d --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/valueArrayWithDefault.kt @@ -0,0 +1,15 @@ +// FILE: A.java +public @interface A { + String[] value() default {"abc", "cde"}; +} + +// FILE: b.kt +[A("1", "2", "3")] fun test1() {} + +[A("4")] fun test2() {} + +[A(*array("5", "6"), "7")] fun test3() {} + +[A()] fun test4() {} + +[A] fun test5() {} diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/valueArrayWithDefault.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/valueArrayWithDefault.txt new file mode 100644 index 00000000000..f3e4a3aba6b --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/valueArrayWithDefault.txt @@ -0,0 +1,15 @@ +package + +A(value = {"1", "2", "3"}: kotlin.Array) internal fun test1(): kotlin.Unit +A(value = {"4"}: kotlin.Array) internal fun test2(): kotlin.Unit +A(value = {{"5", "6"}, "7"}: kotlin.Array) internal fun test3(): kotlin.Unit +A() internal fun test4(): kotlin.Unit +A() internal fun test5(): kotlin.Unit + +public final annotation class A : kotlin.Annotation { + public constructor A(/*0*/ vararg value: kotlin.String /*kotlin.Array*/ = ...) + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + public abstract fun value(): kotlin.Array +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithStdLibGenerated.java index 1accc1e0e47..3bbf29a68e8 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithStdLibGenerated.java @@ -168,6 +168,12 @@ public class JetDiagnosticsTestWithStdLibGenerated extends AbstractJetDiagnostic String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/valueArrayOnly.kt"); doTest(fileName); } + + @TestMetadata("valueArrayWithDefault.kt") + public void testValueArrayWithDefault() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/valueArrayWithDefault.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/annotationWithVarargParameter") diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java index 894864c52ac..937818d2a83 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java @@ -60,6 +60,18 @@ public class BlackBoxAgainstJavaCodegenTestGenerated extends AbstractBlackBoxCod JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxAgainstJava/annotations"), Pattern.compile("^(.+)\\.kt$"), true); } + @TestMetadata("javaAnnotationArrayValueDefault.kt") + public void testJavaAnnotationArrayValueDefault() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/annotations/javaAnnotationArrayValueDefault.kt"); + doTestAgainstJava(fileName); + } + + @TestMetadata("javaAnnotationArrayValueNoDefault.kt") + public void testJavaAnnotationArrayValueNoDefault() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/annotations/javaAnnotationArrayValueNoDefault.kt"); + doTestAgainstJava(fileName); + } + @TestMetadata("javaAnnotationCall.kt") public void testJavaAnnotationCall() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/annotations/javaAnnotationCall.kt");