[FIR] Support several annotation argument diagnostics

This commit is contained in:
Лихолетов Михаил
2020-09-13 15:44:09 +03:00
committed by Mikhail Glukhikh
parent 0c13d3197c
commit cfc1ebb4be
50 changed files with 580 additions and 219 deletions
@@ -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
@@ -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
@@ -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,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
@@ -1,3 +0,0 @@
// Functions can be recursively annotated
annotation class ann(val x: Int)
@ann(foo()) fun foo() = 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
@@ -1,5 +0,0 @@
// Properties can be recursively annotated
annotation class ann(val x: Int)
class My {
@ann(x) val x: Int = 1
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// Properties can be recursively annotated
annotation class ann(val x: Int)
class My {
@@ -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
}
@@ -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,3 +1,4 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_VARIABLE
annotation class Ann(vararg val i: Boolean)
fun foo() {
@@ -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
@@ -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
@@ -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
@@ -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,3 +1,4 @@
// FIR_IDENTICAL
annotation class Ann(vararg val i: Int)
@Ann(
@@ -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,3 +1,4 @@
// FIR_IDENTICAL
annotation class AnnE(val i: String)
enum class MyEnum {
@@ -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
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_VARIABLE
annotation class Ann(vararg val i: String)
@@ -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
@@ -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 {}
@@ -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() {}
@@ -22,7 +22,7 @@ annotation class Ann(
Companion.CONST,
Nested.CONST,
Interface.CONST,
a,
<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>a<!>,
b()
)
class A {
@@ -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()
@@ -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))
@@ -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,3 +1,4 @@
// FIR_IDENTICAL
@Retention(AnnotationRetention.SOURCE)
@Repeatable
annotation class Ann(val i: Int)
@@ -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() {}
@@ -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))
@@ -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,3 +1,4 @@
// FIR_IDENTICAL
import kotlin.reflect.KClass
annotation class Ann1(val arg: KClass<*>)