[FIR] Support several annotation argument diagnostics
This commit is contained in:
committed by
Mikhail Glukhikh
parent
0c13d3197c
commit
cfc1ebb4be
Vendored
-4
@@ -1,4 +0,0 @@
|
||||
// Functions can be recursively annotated
|
||||
annotation class ann(val x: Int)
|
||||
@ann(bar()) fun foo() = 1
|
||||
@ann(foo()) fun bar() = 2
|
||||
Vendored
+1
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
// Functions can be recursively annotated
|
||||
annotation class ann(val x: Int)
|
||||
@ann(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>bar()<!>) fun foo() = 1
|
||||
|
||||
Vendored
-3
@@ -1,3 +0,0 @@
|
||||
// Function parameter CAN be recursively annotated
|
||||
annotation class ann(val x: Int)
|
||||
fun foo(@ann(foo(1)) x: Int): Int = x
|
||||
+1
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
// Function parameter CAN be recursively annotated
|
||||
annotation class ann(val x: Int)
|
||||
fun foo(@ann(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>foo(1)<!>) x: Int): Int = x
|
||||
-3
@@ -1,3 +0,0 @@
|
||||
// Functions can be recursively annotated
|
||||
annotation class ann(val x: Int)
|
||||
@ann(foo()) fun foo() = 1
|
||||
+1
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
// Functions can be recursively annotated
|
||||
annotation class ann(val x: Int)
|
||||
@ann(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>foo()<!>) fun foo() = 1
|
||||
-5
@@ -1,5 +0,0 @@
|
||||
// Properties can be recursively annotated
|
||||
annotation class ann(val x: Int)
|
||||
class My {
|
||||
@ann(x) val x: Int = 1
|
||||
}
|
||||
+1
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
// Properties can be recursively annotated
|
||||
annotation class ann(val x: Int)
|
||||
class My {
|
||||
|
||||
+1
-1
@@ -2,5 +2,5 @@ annotation class Ann(vararg val i: Boolean)
|
||||
fun foo() {
|
||||
val bool1 = true
|
||||
|
||||
@Ann(bool1) val a = bool1
|
||||
@Ann(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>bool1<!>) val a = bool1
|
||||
}
|
||||
-16
@@ -1,16 +0,0 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
||||
annotation class Ann(vararg val i: Boolean)
|
||||
fun foo() {
|
||||
val a1 = 1 > 2
|
||||
val a2 = 1 == 2
|
||||
val a3 = a1 == a2
|
||||
val a4 = a1 > a2
|
||||
|
||||
@Ann(
|
||||
a1,
|
||||
a2,
|
||||
a3,
|
||||
a1 > a2,
|
||||
a1 == a2
|
||||
) val b = 1
|
||||
}
|
||||
+1
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
||||
annotation class Ann(vararg val i: Boolean)
|
||||
fun foo() {
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
|
||||
annotation class AnnE(val i: MyEnum)
|
||||
|
||||
@AnnE(e)
|
||||
@AnnE(<!ANNOTATION_ARGUMENT_MUST_BE_ENUM_CONST!>e<!>)
|
||||
class Test
|
||||
|
||||
val e: MyEnum = MyEnum.A
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
|
||||
annotation class AnnE(val i: MyEnum)
|
||||
|
||||
@AnnE(e)
|
||||
@AnnE(<!ANNOTATION_ARGUMENT_MUST_BE_ENUM_CONST!>e<!>)
|
||||
class Test
|
||||
|
||||
val e: MyEnum = MyEnum.A
|
||||
|
||||
+4
-4
@@ -14,12 +14,12 @@ public class Test {
|
||||
annotation class Ann(vararg val i: Int)
|
||||
|
||||
@Ann(
|
||||
Test.i1,
|
||||
<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>Test.i1<!>,
|
||||
Test.i2,
|
||||
Test.i3,
|
||||
Test.i4,
|
||||
Test.i5,
|
||||
Test.i6,
|
||||
Test().i7
|
||||
<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>Test.i5<!>,
|
||||
<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>Test.i6<!>,
|
||||
<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>Test().i7<!>
|
||||
)
|
||||
class A
|
||||
|
||||
-18
@@ -1,18 +0,0 @@
|
||||
annotation class Ann(vararg val i: Int)
|
||||
|
||||
@Ann(
|
||||
i1,
|
||||
i2,
|
||||
i3,
|
||||
i4,
|
||||
i5,
|
||||
i6
|
||||
)
|
||||
class Test
|
||||
|
||||
var i1 = 1 // var
|
||||
const val i2 = 1 // val
|
||||
val i3 = i1 // val with var in initializer
|
||||
const val i4 = i2 // val with val in initializer
|
||||
var i5 = i1 // var with var in initializer
|
||||
var i6 = i2 // var with val in initializer
|
||||
+1
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
annotation class Ann(vararg val i: Int)
|
||||
|
||||
@Ann(
|
||||
|
||||
-18
@@ -1,18 +0,0 @@
|
||||
annotation class AnnE(val i: String)
|
||||
|
||||
enum class MyEnum {
|
||||
A
|
||||
}
|
||||
|
||||
@AnnE("1" + MyEnum.A)
|
||||
class Test
|
||||
|
||||
@AnnE("1" + MyEnum::class)
|
||||
class Test2
|
||||
|
||||
@AnnE("1" + AnnE("23"))
|
||||
class Test3
|
||||
|
||||
@AnnE("1" + arrayOf("23", "34"))
|
||||
class Test4
|
||||
|
||||
+1
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
annotation class AnnE(val i: String)
|
||||
|
||||
enum class MyEnum {
|
||||
|
||||
Vendored
-28
@@ -1,28 +0,0 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
||||
annotation class Ann(vararg val i: String)
|
||||
|
||||
const val topLevel = "topLevel"
|
||||
|
||||
fun foo() {
|
||||
val a1 = "a"
|
||||
val a2 = "b"
|
||||
val a3 = a1 + a2
|
||||
|
||||
val a4 = 1
|
||||
val a5 = 1.0
|
||||
|
||||
@Ann(
|
||||
a1,
|
||||
a2,
|
||||
a3,
|
||||
"$topLevel",
|
||||
"$a1",
|
||||
"$a1 $topLevel",
|
||||
"$a4",
|
||||
"$a5",
|
||||
a1 + a2,
|
||||
"a" + a2,
|
||||
"a" + topLevel,
|
||||
"a" + a4
|
||||
) val b = 1
|
||||
}
|
||||
Vendored
+1
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
||||
annotation class Ann(vararg val i: String)
|
||||
|
||||
|
||||
-45
@@ -1,45 +0,0 @@
|
||||
// !LANGUAGE: +ProhibitTypeParametersInClassLiteralsInAnnotationArguments
|
||||
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
annotation class Ann(val k: KClass<*>)
|
||||
annotation class AnnArray(val kk: Array<KClass<*>>)
|
||||
|
||||
object AnObject
|
||||
|
||||
class C {
|
||||
companion object
|
||||
}
|
||||
|
||||
fun foo() = "foo"
|
||||
|
||||
@Ann("foo"::class)
|
||||
fun test1() {}
|
||||
|
||||
@Ann(String::class)
|
||||
fun test2() {}
|
||||
|
||||
@Ann(AnObject::class)
|
||||
fun test4() {}
|
||||
|
||||
@Ann(C::class)
|
||||
fun test5() {}
|
||||
|
||||
@Ann(C.Companion::class)
|
||||
fun test6() {}
|
||||
|
||||
@Ann(foo()::class)
|
||||
fun test7() {}
|
||||
|
||||
@AnnArray(arrayOf(""::class, String::class, AnObject::class))
|
||||
fun test8() {}
|
||||
|
||||
inline val <reified T> T.test9
|
||||
get() = @AnnArray(arrayOf(
|
||||
T::class,
|
||||
Array<T>::class,
|
||||
Array<Array<Array<T>>>::class
|
||||
)) object {}
|
||||
|
||||
inline val <reified T> T.test10
|
||||
get() = @AnnArray([T::class]) object {}
|
||||
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
// !LANGUAGE: +ProhibitTypeParametersInClassLiteralsInAnnotationArguments
|
||||
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
+3
-3
@@ -6,7 +6,7 @@ annotation class Ann(vararg val k: KClass<*>)
|
||||
|
||||
inline val <reified T> T.test
|
||||
get() = @Ann(
|
||||
T::class,
|
||||
Array<T>::class,
|
||||
Array<Array<Array<T>>>::class
|
||||
<!ANNOTATION_ARGUMENT_KCLASS_LITERAL_OF_TYPE_PARAMETER_ERROR!>T::class<!>,
|
||||
<!ANNOTATION_ARGUMENT_KCLASS_LITERAL_OF_TYPE_PARAMETER_ERROR!>Array<T>::class<!>,
|
||||
<!ANNOTATION_ARGUMENT_KCLASS_LITERAL_OF_TYPE_PARAMETER_ERROR!>Array<Array<Array<T>>>::class<!>
|
||||
) object {}
|
||||
|
||||
+2
-2
@@ -24,8 +24,8 @@ val two = 2
|
||||
@Foo([ONE], [], [])
|
||||
fun test6() {}
|
||||
|
||||
@Foo([ONE + two], [], [])
|
||||
@Foo(<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>[<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>ONE + two<!>]<!>, [], [])
|
||||
fun test7() {}
|
||||
|
||||
@Foo([two], [], [])
|
||||
@Foo(<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>[<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>two<!>]<!>, [], [])
|
||||
fun test8() {}
|
||||
@@ -22,5 +22,5 @@ fun main1() {}
|
||||
fun main2() {}
|
||||
|
||||
val q = A()
|
||||
@Ann(q.z)
|
||||
@Ann(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>q.z<!>)
|
||||
fun main3() {}
|
||||
|
||||
+1
-1
@@ -22,7 +22,7 @@ annotation class Ann(
|
||||
Companion.CONST,
|
||||
Nested.CONST,
|
||||
Interface.CONST,
|
||||
a,
|
||||
<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>a<!>,
|
||||
b()
|
||||
)
|
||||
class A {
|
||||
|
||||
+2
-2
@@ -23,7 +23,7 @@ class A
|
||||
Companion.CONST,
|
||||
Nested.CONST,
|
||||
Interface.CONST,
|
||||
a,
|
||||
<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>a<!>,
|
||||
b()
|
||||
)
|
||||
constructor() {
|
||||
@@ -36,7 +36,7 @@ constructor() {
|
||||
Companion.CONST,
|
||||
Nested.CONST,
|
||||
Interface.CONST,
|
||||
a,
|
||||
<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>a<!>,
|
||||
b()
|
||||
)
|
||||
constructor(dummy: Int) : this()
|
||||
|
||||
+4
-4
@@ -2,10 +2,10 @@
|
||||
@Repeatable
|
||||
annotation class Ann(val i: IntArray)
|
||||
|
||||
@Ann(intArrayOf(i))
|
||||
@Ann(<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>intArrayOf(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i<!>)<!>)
|
||||
@Ann(intArrayOf(i2))
|
||||
@Ann(intArrayOf(i3))
|
||||
@Ann(intArrayOf(i, i2, i3))
|
||||
@Ann(<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>intArrayOf(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i3<!>)<!>)
|
||||
@Ann(<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>intArrayOf(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i<!>, i2, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i3<!>)<!>)
|
||||
@Ann(<!INAPPLICABLE_CANDIDATE!>intArrayOf<!>(intArrayOf(i, i2, i3)))
|
||||
class Test
|
||||
|
||||
@@ -19,6 +19,6 @@ fun foo(): Int = 1
|
||||
@Repeatable
|
||||
annotation class AnnAnn(val i: Array<Ann>)
|
||||
@AnnAnn(arrayOf(Ann(intArrayOf(1))))
|
||||
@AnnAnn(arrayOf(iAnn))
|
||||
@AnnAnn(<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>arrayOf(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>iAnn<!>)<!>)
|
||||
class TestAnn
|
||||
val iAnn = Ann(intArrayOf(1))
|
||||
|
||||
-30
@@ -1,30 +0,0 @@
|
||||
@Retention(AnnotationRetention.SOURCE)
|
||||
@Repeatable
|
||||
annotation class Ann(val i: Int)
|
||||
annotation class AnnIA(val ia: IntArray)
|
||||
annotation class AnnSA(val sa: Array<String>)
|
||||
|
||||
@Ann(MyClass().i)
|
||||
@Ann(i)
|
||||
@Ann(i2)
|
||||
@AnnIA(ia)
|
||||
@AnnSA(sa)
|
||||
class Test {
|
||||
val i = 1
|
||||
@Ann(i) val i2 = 1
|
||||
}
|
||||
|
||||
var i = 1
|
||||
val i2 = foo()
|
||||
|
||||
fun foo(): Int = 1
|
||||
|
||||
@AnnSA(emptyArray())
|
||||
class MyClass {
|
||||
val i = 1
|
||||
}
|
||||
|
||||
val ia: IntArray = intArrayOf(1, 2)
|
||||
val sa: Array<String> = arrayOf("a", "b")
|
||||
|
||||
annotation class Ann2
|
||||
+1
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
@Retention(AnnotationRetention.SOURCE)
|
||||
@Repeatable
|
||||
annotation class Ann(val i: Int)
|
||||
|
||||
+3
-3
@@ -4,13 +4,13 @@ const val constConst = nonConst * nonConst + 2
|
||||
|
||||
annotation class Ann(val x: Int, val y: String)
|
||||
|
||||
@Ann(nonConst, "${nonConst}")
|
||||
@Ann(<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>nonConst<!>, <!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>"${nonConst}"<!>)
|
||||
fun foo1() {}
|
||||
|
||||
@Ann(nonConst + constConst, "${constConst}")
|
||||
@Ann(<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>nonConst + constConst<!>, "${constConst}")
|
||||
fun foo2() {}
|
||||
|
||||
annotation class ArrayAnn(val x: IntArray)
|
||||
|
||||
@ArrayAnn(intArrayOf(1, constConst, nonConst))
|
||||
@ArrayAnn(<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>intArrayOf(1, constConst, <!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>nonConst<!>)<!>)
|
||||
fun foo3() {}
|
||||
|
||||
+3
-3
@@ -2,10 +2,10 @@
|
||||
@Repeatable
|
||||
annotation class Ann(vararg val i: Int)
|
||||
|
||||
@Ann(i)
|
||||
@Ann(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i<!>)
|
||||
@Ann(i2)
|
||||
@Ann(i3)
|
||||
@Ann(i, i2, i3)
|
||||
@Ann(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i3<!>)
|
||||
@Ann(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i<!>, i2, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i3<!>)
|
||||
@Ann(*intArrayOf(i))
|
||||
@Ann(*intArrayOf(i2))
|
||||
@Ann(*intArrayOf(i3))
|
||||
|
||||
-20
@@ -1,20 +0,0 @@
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
annotation class Ann1(val arg: KClass<*>)
|
||||
annotation class Ann2(vararg val arg: KClass<*>)
|
||||
annotation class Ann3(val arg: Array<KClass<*>>)
|
||||
|
||||
class A1
|
||||
class A2
|
||||
|
||||
@Ann1(A1::class)
|
||||
@Ann2(A1::class, A2::class)
|
||||
@Ann3(arrayOf(A1::class, A2::class))
|
||||
class MyClass1
|
||||
|
||||
@Ann1(<!UNRESOLVED_REFERENCE!>A3<!>::class)
|
||||
class MyClass2
|
||||
|
||||
val x = A1::class
|
||||
@Ann1(x)
|
||||
class MyClass3
|
||||
+1
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
annotation class Ann1(val arg: KClass<*>)
|
||||
|
||||
Reference in New Issue
Block a user