Allow assigning array to vararg in named form in annotations

See more in KT-20171
This commit is contained in:
Mikhail Zarechenskiy
2017-09-13 16:05:46 +03:00
parent f905d56b38
commit 68259f7939
26 changed files with 410 additions and 96 deletions
@@ -0,0 +1,68 @@
// LANGUAGE_VERSION: 1.2
// WITH_REFLECT
// IGNORE_BACKEND: JS
// IGNORE_BACKEND: NATIVE
// FILE: JavaAnn.java
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@interface JavaAnn {
String[] value() default {};
String[] path() default {};
}
// FILE: test.kt
import java.util.Arrays
import kotlin.reflect.KClass
import kotlin.reflect.KFunction0
import kotlin.reflect.full.findAnnotation
inline fun <reified T : Annotation> test(kFunction: KFunction0<Unit>, test: T.() -> Unit) {
val annotation = kFunction.findAnnotation<T>()!!
annotation.test()
}
fun check(b: Boolean, message: String) {
if (!b) throw RuntimeException(message)
}
annotation class Ann(vararg val s: String)
@Ann(s = ["value1", "value2"])
fun test1() {}
@Ann(s = arrayOf("value3", "value4"))
fun test2() {}
@JavaAnn(value = ["value5"], path = ["value6"])
fun test3() {}
@JavaAnn("value7", path = ["value8"])
fun test4() {}
fun box(): String {
test<Ann>(::test1) {
check(s.contentEquals(arrayOf("value1", "value2")), "Fail 1: ${s.joinToString()}")
}
test<Ann>(::test2) {
check(s.contentEquals(arrayOf("value3", "value4")), "Fail 2: ${s.joinToString()}")
}
test<JavaAnn>(::test3) {
check(value.contentEquals(arrayOf("value5")), "Fail 3: ${value.joinToString()}")
check(path.contentEquals(arrayOf("value6")), "Fail 3: ${path.joinToString()}")
}
test<JavaAnn>(::test4) {
check(value.contentEquals(arrayOf("value7")), "Fail 4: ${value.joinToString()}")
check(path.contentEquals(arrayOf("value8")), "Fail 4: ${path.joinToString()}")
}
return "OK"
}
@@ -0,0 +1,45 @@
// !LANGUAGE: +ArrayLiteralsInAnnotations, +AssigningArraysToVarargsInNamedFormInAnnotations
// FILE: JavaAnn.java
@interface JavaAnn {
String[] value() default {};
String[] path() default {};
}
// FILE: test.kt
annotation class Ann(vararg val s: String)
@Ann(s = arrayOf())
fun test1() {}
@Ann(s = <!TYPE_MISMATCH!>intArrayOf()<!>)
fun test2() {}
@Ann(s = <!TYPE_INFERENCE_EXPECTED_TYPE_MISMATCH!>arrayOf(1)<!>)
fun test3() {}
@Ann("value1", "value2")
fun test4() {}
@Ann(s = ["value"])
fun test5() {}
@JavaAnn(value = arrayOf("value"))
fun jTest1() {}
@JavaAnn(value = ["value"])
fun jTest2() {}
@JavaAnn(value = ["value"], path = ["path"])
fun jTest3() {}
annotation class IntAnn(vararg val i: Int)
@IntAnn(i = [1, 2])
fun foo1() {}
@IntAnn(i = intArrayOf(0))
fun foo2() {}
@@ -0,0 +1,37 @@
package
@IntAnn(i = {1, 2}) public fun foo1(): kotlin.Unit
@IntAnn(i = {0}) public fun foo2(): kotlin.Unit
@JavaAnn(value = {"value"}) public fun jTest1(): kotlin.Unit
@JavaAnn(value = {"value"}) public fun jTest2(): kotlin.Unit
@JavaAnn(path = {"path"}, value = {"value"}) public fun jTest3(): kotlin.Unit
@Ann(s = {}) public fun test1(): kotlin.Unit
@Ann(s = {}) public fun test2(): kotlin.Unit
@Ann(s = {1}) public fun test3(): kotlin.Unit
@Ann(s = {"value1", "value2"}) public fun test4(): kotlin.Unit
@Ann(s = {"value"}) public fun test5(): kotlin.Unit
public final annotation class Ann : kotlin.Annotation {
public constructor Ann(/*0*/ vararg s: kotlin.String /*kotlin.Array<out kotlin.String>*/)
public final val s: kotlin.Array<out kotlin.String>
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 final annotation class IntAnn : kotlin.Annotation {
public constructor IntAnn(/*0*/ vararg i: kotlin.Int /*kotlin.IntArray*/)
public final val i: kotlin.IntArray
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/*package*/ final annotation class JavaAnn : kotlin.Annotation {
public/*package*/ constructor JavaAnn(/*0*/ vararg value: kotlin.String /*kotlin.Array<out kotlin.String>*/ = ..., /*1*/ path: kotlin.Array<kotlin.String> = ...)
public final val path: kotlin.Array<kotlin.String>
public final val value: kotlin.Array<kotlin.String>
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
}
@@ -0,0 +1,48 @@
// !LANGUAGE: +ArrayLiteralsInAnnotations, -AssigningArraysToVarargsInNamedFormInAnnotations
// FILE: JavaAnn.java
@interface JavaAnn {
String[] value() default {};
String[] path() default {};
}
// FILE: test.kt
annotation class Ann(vararg val s: String)
@Ann(s = <!TYPE_INFERENCE_EXPECTED_TYPE_MISMATCH!>arrayOf()<!>)
fun test1() {}
@Ann(s = <!TYPE_MISMATCH!>intArrayOf()<!>)
fun test2() {}
@Ann(s = <!TYPE_INFERENCE_EXPECTED_TYPE_MISMATCH!>arrayOf(1)<!>)
fun test3() {}
@Ann(s = <!TYPE_INFERENCE_EXPECTED_TYPE_MISMATCH, TYPE_MISMATCH!>["value"]<!>)
fun test5() {}
@JavaAnn(value = <!TYPE_INFERENCE_EXPECTED_TYPE_MISMATCH!>arrayOf("value")<!>)
fun jTest1() {}
@JavaAnn(value = <!TYPE_INFERENCE_EXPECTED_TYPE_MISMATCH, TYPE_MISMATCH!>["value"]<!>)
fun jTest2() {}
@JavaAnn(value = <!TYPE_INFERENCE_EXPECTED_TYPE_MISMATCH, TYPE_MISMATCH!>["value"]<!>, path = ["path"])
fun jTest3() {}
annotation class IntAnn(vararg val i: Int)
@IntAnn(i = <!TYPE_INFERENCE_EXPECTED_TYPE_MISMATCH, TYPE_MISMATCH!>[1, 2]<!>)
fun foo1() {}
@IntAnn(i = <!TYPE_MISMATCH!>intArrayOf(0)<!>)
fun foo2() {}
fun foo(vararg <!UNUSED_PARAMETER!>i<!>: Int) {}
@Ann(s = "value")
fun dep1() {
foo(i = 1)
}
@@ -0,0 +1,38 @@
package
@Ann(s = {"value"}) public fun dep1(): kotlin.Unit
public fun foo(/*0*/ vararg i: kotlin.Int /*kotlin.IntArray*/): kotlin.Unit
@IntAnn(i = {1, 2}) public fun foo1(): kotlin.Unit
@IntAnn(i = {0}) public fun foo2(): kotlin.Unit
@JavaAnn(value = {"value"}) public fun jTest1(): kotlin.Unit
@JavaAnn(value = {"value"}) public fun jTest2(): kotlin.Unit
@JavaAnn(path = {"path"}, value = {"value"}) public fun jTest3(): kotlin.Unit
@Ann(s = {}) public fun test1(): kotlin.Unit
@Ann(s = {}) public fun test2(): kotlin.Unit
@Ann(s = {1}) public fun test3(): kotlin.Unit
@Ann(s = {"value"}) public fun test5(): kotlin.Unit
public final annotation class Ann : kotlin.Annotation {
public constructor Ann(/*0*/ vararg s: kotlin.String /*kotlin.Array<out kotlin.String>*/)
public final val s: kotlin.Array<out kotlin.String>
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 final annotation class IntAnn : kotlin.Annotation {
public constructor IntAnn(/*0*/ vararg i: kotlin.Int /*kotlin.IntArray*/)
public final val i: kotlin.IntArray
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/*package*/ final annotation class JavaAnn : kotlin.Annotation {
public/*package*/ constructor JavaAnn(/*0*/ vararg value: kotlin.String /*kotlin.Array<out kotlin.String>*/ = ..., /*1*/ path: kotlin.Array<kotlin.String> = ...)
public final val path: kotlin.Array<kotlin.String>
public final val value: kotlin.Array<kotlin.String>
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
}