Refactoring: rename parameter to argument for annotation diagnostics

This commit is contained in:
Mikhail Zarechenskiy
2018-03-07 14:38:01 +03:00
parent baf16895f2
commit 4ebd11a7ae
34 changed files with 91 additions and 88 deletions
@@ -218,9 +218,9 @@ public interface Errors {
DiagnosticFactory0<PsiElement> ANNOTATION_CLASS_MEMBER = DiagnosticFactory0.create(ERROR); DiagnosticFactory0<PsiElement> ANNOTATION_CLASS_MEMBER = DiagnosticFactory0.create(ERROR);
DiagnosticFactory0<KtTypeReference> INVALID_TYPE_OF_ANNOTATION_MEMBER = DiagnosticFactory0.create(ERROR); DiagnosticFactory0<KtTypeReference> INVALID_TYPE_OF_ANNOTATION_MEMBER = DiagnosticFactory0.create(ERROR);
DiagnosticFactory0<KtTypeReference> NULLABLE_TYPE_OF_ANNOTATION_MEMBER = DiagnosticFactory0.create(ERROR); DiagnosticFactory0<KtTypeReference> NULLABLE_TYPE_OF_ANNOTATION_MEMBER = DiagnosticFactory0.create(ERROR);
DiagnosticFactory0<KtExpression> ANNOTATION_PARAMETER_MUST_BE_CONST = DiagnosticFactory0.create(ERROR); DiagnosticFactory0<KtExpression> ANNOTATION_ARGUMENT_MUST_BE_CONST = DiagnosticFactory0.create(ERROR);
DiagnosticFactory0<KtExpression> ANNOTATION_PARAMETER_MUST_BE_KCLASS_LITERAL = DiagnosticFactory0.create(ERROR); DiagnosticFactory0<KtExpression> ANNOTATION_ARGUMENT_MUST_BE_KCLASS_LITERAL = DiagnosticFactory0.create(ERROR);
DiagnosticFactory0<KtExpression> ANNOTATION_PARAMETER_MUST_BE_ENUM_CONST = DiagnosticFactory0.create(ERROR); DiagnosticFactory0<KtExpression> ANNOTATION_ARGUMENT_MUST_BE_ENUM_CONST = DiagnosticFactory0.create(ERROR);
DiagnosticFactory0<KtExpression> ANNOTATION_PARAMETER_DEFAULT_VALUE_MUST_BE_CONSTANT = DiagnosticFactory0.create(ERROR); DiagnosticFactory0<KtExpression> ANNOTATION_PARAMETER_DEFAULT_VALUE_MUST_BE_CONSTANT = DiagnosticFactory0.create(ERROR);
DiagnosticFactory0<KtAnnotatedExpression> ANNOTATIONS_ON_BLOCK_LEVEL_EXPRESSION_ON_THE_SAME_LINE = DiagnosticFactory0.create(WARNING); DiagnosticFactory0<KtAnnotatedExpression> ANNOTATIONS_ON_BLOCK_LEVEL_EXPRESSION_ON_THE_SAME_LINE = DiagnosticFactory0.create(WARNING);
DiagnosticFactory0<KtAnnotationEntry> ANNOTATION_USED_AS_ANNOTATION_ARGUMENT = DiagnosticFactory0.create(ERROR); DiagnosticFactory0<KtAnnotationEntry> ANNOTATION_USED_AS_ANNOTATION_ARGUMENT = DiagnosticFactory0.create(ERROR);
@@ -818,9 +818,9 @@ public class DefaultErrorMessages {
MAP.put(ANNOTATION_CLASS_MEMBER, "Members are not allowed in annotation class"); MAP.put(ANNOTATION_CLASS_MEMBER, "Members are not allowed in annotation class");
MAP.put(INVALID_TYPE_OF_ANNOTATION_MEMBER, "Invalid type of annotation member"); MAP.put(INVALID_TYPE_OF_ANNOTATION_MEMBER, "Invalid type of annotation member");
MAP.put(NULLABLE_TYPE_OF_ANNOTATION_MEMBER, "An annotation parameter cannot be nullable"); MAP.put(NULLABLE_TYPE_OF_ANNOTATION_MEMBER, "An annotation parameter cannot be nullable");
MAP.put(ANNOTATION_PARAMETER_MUST_BE_CONST, "An annotation parameter must be a compile-time constant"); MAP.put(ANNOTATION_ARGUMENT_MUST_BE_CONST, "An annotation argument must be a compile-time constant");
MAP.put(ANNOTATION_PARAMETER_MUST_BE_ENUM_CONST, "An enum annotation parameter must be a enum constant"); MAP.put(ANNOTATION_ARGUMENT_MUST_BE_ENUM_CONST, "An enum annotation argument must be a enum constant");
MAP.put(ANNOTATION_PARAMETER_MUST_BE_KCLASS_LITERAL, "An annotation parameter must be a class literal (T::class)"); MAP.put(ANNOTATION_ARGUMENT_MUST_BE_KCLASS_LITERAL, "An annotation argument must be a class literal (T::class)");
MAP.put(ANNOTATION_PARAMETER_DEFAULT_VALUE_MUST_BE_CONSTANT, "Default value of annotation parameter must be a compile-time constant"); MAP.put(ANNOTATION_PARAMETER_DEFAULT_VALUE_MUST_BE_CONSTANT, "Default value of annotation parameter must be a compile-time constant");
MAP.put(ANNOTATIONS_ON_BLOCK_LEVEL_EXPRESSION_ON_THE_SAME_LINE, MAP.put(ANNOTATIONS_ON_BLOCK_LEVEL_EXPRESSION_ON_THE_SAME_LINE,
@@ -120,9 +120,9 @@ class ConstantExpressionEvaluator(
val descriptor = expressionType.constructor.declarationDescriptor val descriptor = expressionType.constructor.declarationDescriptor
val diagnosticFactory = when { val diagnosticFactory = when {
DescriptorUtils.isEnumClass(descriptor) -> Errors.ANNOTATION_PARAMETER_MUST_BE_ENUM_CONST DescriptorUtils.isEnumClass(descriptor) -> Errors.ANNOTATION_ARGUMENT_MUST_BE_ENUM_CONST
descriptor is ClassDescriptor && KotlinBuiltIns.isKClass(descriptor) -> Errors.ANNOTATION_PARAMETER_MUST_BE_KCLASS_LITERAL descriptor is ClassDescriptor && KotlinBuiltIns.isKClass(descriptor) -> Errors.ANNOTATION_ARGUMENT_MUST_BE_KCLASS_LITERAL
else -> Errors.ANNOTATION_PARAMETER_MUST_BE_CONST else -> Errors.ANNOTATION_ARGUMENT_MUST_BE_CONST
} }
trace.report(diagnosticFactory.on(argumentExpression)) trace.report(diagnosticFactory.on(argumentExpression))
@@ -156,7 +156,7 @@ class ConstantExpressionEvaluator(
if (lhsExpression != null) { if (lhsExpression != null) {
val doubleColonLhs = trace.bindingContext.get(BindingContext.DOUBLE_COLON_LHS, lhsExpression) val doubleColonLhs = trace.bindingContext.get(BindingContext.DOUBLE_COLON_LHS, lhsExpression)
if (doubleColonLhs is DoubleColonLHS.Expression && !doubleColonLhs.isObjectQualifier) { if (doubleColonLhs is DoubleColonLHS.Expression && !doubleColonLhs.isObjectQualifier) {
trace.report(Errors.ANNOTATION_PARAMETER_MUST_BE_KCLASS_LITERAL.on(argumentExpression)) trace.report(Errors.ANNOTATION_ARGUMENT_MUST_BE_KCLASS_LITERAL.on(argumentExpression))
} }
} }
} }
@@ -1,4 +1,4 @@
// Functions can be recursively annotated // Functions can be recursively annotated
annotation class ann(val x: Int) annotation class ann(val x: Int)
@ann(<!ANNOTATION_PARAMETER_MUST_BE_CONST!>bar()<!>) fun foo() = 1 @ann(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>bar()<!>) fun foo() = 1
@ann(<!ANNOTATION_PARAMETER_MUST_BE_CONST!>foo()<!>) fun bar() = 2 @ann(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>foo()<!>) fun bar() = 2
@@ -1,3 +1,3 @@
// Function parameter CAN be recursively annotated // Function parameter CAN be recursively annotated
annotation class ann(val x: Int) annotation class ann(val x: Int)
fun foo(@ann(<!ANNOTATION_PARAMETER_MUST_BE_CONST!>foo(1)<!>) x: Int): Int = x fun foo(@ann(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>foo(1)<!>) x: Int): Int = x
@@ -1,3 +1,3 @@
// Functions can be recursively annotated // Functions can be recursively annotated
annotation class ann(val x: Int) annotation class ann(val x: Int)
@ann(<!ANNOTATION_PARAMETER_MUST_BE_CONST!>foo()<!>) fun foo() = 1 @ann(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>foo()<!>) fun foo() = 1
@@ -1,5 +1,5 @@
// Properties can be recursively annotated // Properties can be recursively annotated
annotation class ann(val x: Int) annotation class ann(val x: Int)
class My { class My {
@ann(<!ANNOTATION_PARAMETER_MUST_BE_CONST!>x<!>) val x: Int = 1 @ann(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>x<!>) val x: Int = 1
} }
@@ -2,5 +2,5 @@ annotation class Ann(vararg val i: Boolean)
fun foo() { fun foo() {
val bool1 = true val bool1 = true
@Ann(<!ANNOTATION_PARAMETER_MUST_BE_CONST!>bool1<!>) val <!UNUSED_VARIABLE!>a<!> = bool1 @Ann(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>bool1<!>) val <!UNUSED_VARIABLE!>a<!> = bool1
} }
@@ -7,10 +7,10 @@ fun foo() {
val a4 = a1 > a2 val a4 = a1 > a2
@Ann( @Ann(
<!ANNOTATION_PARAMETER_MUST_BE_CONST!>a1<!>, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>a1<!>,
<!ANNOTATION_PARAMETER_MUST_BE_CONST!>a2<!>, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>a2<!>,
<!ANNOTATION_PARAMETER_MUST_BE_CONST!>a3<!>, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>a3<!>,
<!ANNOTATION_PARAMETER_MUST_BE_CONST!>a1 > a2<!>, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>a1 > a2<!>,
<!ANNOTATION_PARAMETER_MUST_BE_CONST!>a1 == a2<!> <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>a1 == a2<!>
) val b = 1 ) val b = 1
} }
@@ -1,6 +1,6 @@
annotation class AnnE(val i: MyEnum) annotation class AnnE(val i: MyEnum)
@AnnE(<!ANNOTATION_PARAMETER_MUST_BE_ENUM_CONST!>e<!>) @AnnE(<!ANNOTATION_ARGUMENT_MUST_BE_ENUM_CONST!>e<!>)
class Test class Test
val e: MyEnum = MyEnum.A val e: MyEnum = MyEnum.A
@@ -14,12 +14,12 @@ public class Test {
annotation class Ann(vararg val i: Int) annotation class Ann(vararg val i: Int)
@Ann( @Ann(
<!ANNOTATION_PARAMETER_MUST_BE_CONST!>Test.i1<!>, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>Test.i1<!>,
Test.i2, Test.i2,
<!ANNOTATION_PARAMETER_MUST_BE_CONST!>Test.i3<!>, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>Test.i3<!>,
Test.i4, Test.i4,
<!ANNOTATION_PARAMETER_MUST_BE_CONST!>Test.i5<!>, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>Test.i5<!>,
<!ANNOTATION_PARAMETER_MUST_BE_CONST!>Test.i6<!>, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>Test.i6<!>,
<!ANNOTATION_PARAMETER_MUST_BE_CONST!>Test().i7<!> <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>Test().i7<!>
) )
class A class A
@@ -1,12 +1,12 @@
annotation class Ann(vararg val i: Int) annotation class Ann(vararg val i: Int)
@Ann( @Ann(
<!ANNOTATION_PARAMETER_MUST_BE_CONST!>i1<!>, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i1<!>,
i2, i2,
<!ANNOTATION_PARAMETER_MUST_BE_CONST!>i3<!>, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i3<!>,
i4, i4,
<!ANNOTATION_PARAMETER_MUST_BE_CONST!>i5<!>, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i5<!>,
<!ANNOTATION_PARAMETER_MUST_BE_CONST!>i6<!> <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i6<!>
) )
class Test class Test
@@ -4,15 +4,15 @@ enum class MyEnum {
A A
} }
@AnnE(<!ANNOTATION_PARAMETER_MUST_BE_CONST!>"1" + MyEnum.A<!>) @AnnE(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>"1" + MyEnum.A<!>)
class Test class Test
@AnnE(<!ANNOTATION_PARAMETER_MUST_BE_CONST!>"1" + MyEnum::class<!>) @AnnE(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>"1" + MyEnum::class<!>)
class Test2 class Test2
@AnnE(<!ANNOTATION_PARAMETER_MUST_BE_CONST!>"1" + AnnE("23")<!>) @AnnE(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>"1" + AnnE("23")<!>)
class Test3 class Test3
@AnnE(<!ANNOTATION_PARAMETER_MUST_BE_CONST!>"1" + arrayOf("23", "34")<!>) @AnnE(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>"1" + arrayOf("23", "34")<!>)
class Test4 class Test4
@@ -12,17 +12,17 @@ fun foo() {
val a5 = 1.0 val a5 = 1.0
@Ann( @Ann(
<!ANNOTATION_PARAMETER_MUST_BE_CONST!>a1<!>, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>a1<!>,
<!ANNOTATION_PARAMETER_MUST_BE_CONST!>a2<!>, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>a2<!>,
<!ANNOTATION_PARAMETER_MUST_BE_CONST!>a3<!>, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>a3<!>,
"$topLevel", "$topLevel",
<!ANNOTATION_PARAMETER_MUST_BE_CONST!>"$a1"<!>, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>"$a1"<!>,
<!ANNOTATION_PARAMETER_MUST_BE_CONST!>"$a1 $topLevel"<!>, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>"$a1 $topLevel"<!>,
<!ANNOTATION_PARAMETER_MUST_BE_CONST!>"$a4"<!>, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>"$a4"<!>,
<!ANNOTATION_PARAMETER_MUST_BE_CONST!>"$a5"<!>, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>"$a5"<!>,
<!ANNOTATION_PARAMETER_MUST_BE_CONST!>a1 + a2<!>, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>a1 + a2<!>,
<!ANNOTATION_PARAMETER_MUST_BE_CONST!>"a" + a2<!>, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>"a" + a2<!>,
"a" + topLevel, "a" + topLevel,
<!ANNOTATION_PARAMETER_MUST_BE_CONST!>"a" + a4<!> <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>"a" + a4<!>
) val b = 1 ) val b = 1
} }
@@ -13,7 +13,7 @@ class C {
fun foo() = "foo" fun foo() = "foo"
@Ann(<!ANNOTATION_PARAMETER_MUST_BE_KCLASS_LITERAL!>"foo"::class<!>) @Ann(<!ANNOTATION_ARGUMENT_MUST_BE_KCLASS_LITERAL!>"foo"::class<!>)
fun test1() {} fun test1() {}
@Ann(String::class) @Ann(String::class)
@@ -28,8 +28,8 @@ fun test5() {}
@Ann(C.Companion::class) @Ann(C.Companion::class)
fun test6() {} fun test6() {}
@Ann(<!ANNOTATION_PARAMETER_MUST_BE_KCLASS_LITERAL!>foo()::class<!>) @Ann(<!ANNOTATION_ARGUMENT_MUST_BE_KCLASS_LITERAL!>foo()::class<!>)
fun test7() {} fun test7() {}
@AnnArray(arrayOf(<!ANNOTATION_PARAMETER_MUST_BE_KCLASS_LITERAL!>""::class<!>, String::class, AnObject::class)) @AnnArray(arrayOf(<!ANNOTATION_ARGUMENT_MUST_BE_KCLASS_LITERAL!>""::class<!>, String::class, AnObject::class))
fun test8() {} fun test8() {}
@@ -17,7 +17,7 @@ fun test1_0() {}
@Ann1(*["a", "b"]) @Ann1(*["a", "b"])
fun test1_1() {} fun test1_1() {}
@Ann1(*<!NI;TYPE_MISMATCH, NI;TYPE_MISMATCH, OI;TYPE_INFERENCE_EXPECTED_TYPE_MISMATCH!>["a", 1, <!OI;ANNOTATION_PARAMETER_MUST_BE_CONST!>null<!>]<!>) @Ann1(*<!NI;TYPE_MISMATCH, NI;TYPE_MISMATCH, OI;TYPE_INFERENCE_EXPECTED_TYPE_MISMATCH!>["a", 1, <!OI;ANNOTATION_ARGUMENT_MUST_BE_CONST!>null<!>]<!>)
fun test1_2() {} fun test1_2() {}
@Ann2(*[]) @Ann2(*[])
@@ -13,6 +13,6 @@ val a8 = 1.div(a2)
val a9 = 2 * (<!DIVISION_BY_ZERO!>1.div(0)<!>) val a9 = 2 * (<!DIVISION_BY_ZERO!>1.div(0)<!>)
val b1: Byte = <!NI;TYPE_MISMATCH, DIVISION_BY_ZERO, TYPE_MISMATCH!>1 / 0<!> val b1: Byte = <!NI;TYPE_MISMATCH, DIVISION_BY_ZERO, TYPE_MISMATCH!>1 / 0<!>
@Ann(<!DIVISION_BY_ZERO, ANNOTATION_PARAMETER_MUST_BE_CONST!>1 / 0<!>) val b2 = 1 @Ann(<!DIVISION_BY_ZERO, ANNOTATION_ARGUMENT_MUST_BE_CONST!>1 / 0<!>) val b2 = 1
annotation class Ann(val i : Int) annotation class Ann(val i : Int)
@@ -18,9 +18,9 @@ annotation class Ann(val x: Int)
@Ann(A.X) @Ann(A.X)
fun main1() {} fun main1() {}
@Ann(<!ANNOTATION_PARAMETER_MUST_BE_CONST!>A.Y<!>) @Ann(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>A.Y<!>)
fun main2() {} fun main2() {}
val q = A() val q = A()
@Ann(<!ANNOTATION_PARAMETER_MUST_BE_CONST!>q.z<!>) @Ann(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>q.z<!>)
fun main3() {} fun main3() {}
@@ -15,13 +15,13 @@ annotation class Ann(
) )
@Ann( @Ann(
<!ANNOTATION_PARAMETER_MUST_BE_CONST!><!UNRESOLVED_REFERENCE!>Nested<!>::class<!>, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!><!UNRESOLVED_REFERENCE!>Nested<!>::class<!>,
<!ANNOTATION_PARAMETER_MUST_BE_CONST!><!UNRESOLVED_REFERENCE!>Inner<!>::class<!>, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!><!UNRESOLVED_REFERENCE!>Inner<!>::class<!>,
<!ANNOTATION_PARAMETER_MUST_BE_CONST!><!UNRESOLVED_REFERENCE!>Interface<!>::class<!>, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!><!UNRESOLVED_REFERENCE!>Interface<!>::class<!>,
<!UNRESOLVED_REFERENCE!>CONST<!>, <!UNRESOLVED_REFERENCE!>CONST<!>,
<!ANNOTATION_PARAMETER_MUST_BE_CONST!><!UNRESOLVED_REFERENCE!>Companion<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>CONST<!><!>, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!><!UNRESOLVED_REFERENCE!>Companion<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>CONST<!><!>,
<!ANNOTATION_PARAMETER_MUST_BE_CONST!><!UNRESOLVED_REFERENCE!>Nested<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>CONST<!><!>, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!><!UNRESOLVED_REFERENCE!>Nested<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>CONST<!><!>,
<!ANNOTATION_PARAMETER_MUST_BE_CONST!><!UNRESOLVED_REFERENCE!>Interface<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>CONST<!><!>, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!><!UNRESOLVED_REFERENCE!>Interface<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>CONST<!><!>,
<!UNRESOLVED_REFERENCE!>a<!>, <!UNRESOLVED_REFERENCE!>a<!>,
<!UNRESOLVED_REFERENCE!>b<!>() <!UNRESOLVED_REFERENCE!>b<!>()
) )
@@ -2,11 +2,11 @@
@Repeatable @Repeatable
annotation class Ann(val i: IntArray) annotation class Ann(val i: IntArray)
@Ann(<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>intArrayOf(<!ANNOTATION_PARAMETER_MUST_BE_CONST!>i<!>)<!>) @Ann(<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>intArrayOf(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i<!>)<!>)
@Ann(intArrayOf(i2)) @Ann(intArrayOf(i2))
@Ann(<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>intArrayOf(<!ANNOTATION_PARAMETER_MUST_BE_CONST!>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_PARAMETER_MUST_BE_CONST!>i<!>, i2, <!ANNOTATION_PARAMETER_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(<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>intArrayOf(<!TYPE_MISMATCH!>intArrayOf(i, i2, i3)<!>)<!>) @Ann(<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>intArrayOf(<!TYPE_MISMATCH, NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>intArrayOf(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i<!>, i2, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i3<!>)<!>)<!>)
class Test class Test
var i = 1 var i = 1
@@ -19,6 +19,6 @@ fun foo(): Int = 1
@Repeatable @Repeatable
annotation class AnnAnn(val i: Array<Ann>) annotation class AnnAnn(val i: Array<Ann>)
@AnnAnn(arrayOf(Ann(intArrayOf(1)))) @AnnAnn(arrayOf(Ann(intArrayOf(1))))
@AnnAnn(<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>arrayOf(<!ANNOTATION_PARAMETER_MUST_BE_CONST!>iAnn<!>)<!>) @AnnAnn(<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>arrayOf(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>iAnn<!>)<!>)
class TestAnn class TestAnn
val iAnn = <!ANNOTATION_CLASS_CONSTRUCTOR_CALL!>Ann(intArrayOf(1))<!> val iAnn = <!ANNOTATION_CLASS_CONSTRUCTOR_CALL!>Ann(intArrayOf(1))<!>
@@ -4,14 +4,14 @@ annotation class Ann(val i: Int)
annotation class AnnIA(val ia: IntArray) annotation class AnnIA(val ia: IntArray)
annotation class AnnSA(val sa: Array<String>) annotation class AnnSA(val sa: Array<String>)
@Ann(<!ANNOTATION_PARAMETER_MUST_BE_CONST!>MyClass().i<!>) @Ann(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>MyClass().i<!>)
@Ann(<!ANNOTATION_PARAMETER_MUST_BE_CONST!>i<!>) @Ann(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i<!>)
@Ann(<!ANNOTATION_PARAMETER_MUST_BE_CONST!>i2<!>) @Ann(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i2<!>)
@AnnIA(<!ANNOTATION_PARAMETER_MUST_BE_CONST!>ia<!>) @AnnIA(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>ia<!>)
@AnnSA(<!ANNOTATION_PARAMETER_MUST_BE_CONST!>sa<!>) @AnnSA(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>sa<!>)
class Test { class Test {
val i = 1 val i = 1
@Ann(<!ANNOTATION_PARAMETER_MUST_BE_CONST!>i<!>) val i2 = 1 @Ann(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i<!>) val i2 = 1
} }
var i = 1 var i = 1
@@ -2,14 +2,14 @@
@Repeatable @Repeatable
annotation class Ann(vararg val i: Int) annotation class Ann(vararg val i: Int)
@Ann(<!ANNOTATION_PARAMETER_MUST_BE_CONST!>i<!>) @Ann(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i<!>)
@Ann(i2) @Ann(i2)
@Ann(<!ANNOTATION_PARAMETER_MUST_BE_CONST!>i3<!>) @Ann(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i3<!>)
@Ann(<!ANNOTATION_PARAMETER_MUST_BE_CONST!>i<!>, i2, <!ANNOTATION_PARAMETER_MUST_BE_CONST!>i3<!>) @Ann(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i<!>, i2, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i3<!>)
@Ann(*<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>intArrayOf(<!ANNOTATION_PARAMETER_MUST_BE_CONST!>i<!>)<!>) @Ann(*<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>intArrayOf(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i<!>)<!>)
@Ann(*intArrayOf(i2)) @Ann(*intArrayOf(i2))
@Ann(*<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>intArrayOf(<!ANNOTATION_PARAMETER_MUST_BE_CONST!>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_PARAMETER_MUST_BE_CONST!>i<!>, i2, <!ANNOTATION_PARAMETER_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<!>)<!>)
class Test class Test
var i = 1 var i = 1
@@ -22,6 +22,6 @@ fun foo(): Int = 1
@Repeatable @Repeatable
annotation class AnnAnn(vararg val i: Ann) annotation class AnnAnn(vararg val i: Ann)
@AnnAnn(*arrayOf(Ann(1))) @AnnAnn(*arrayOf(Ann(1)))
@AnnAnn(*<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>arrayOf(<!ANNOTATION_PARAMETER_MUST_BE_CONST!>iAnn<!>)<!>) @AnnAnn(*<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>arrayOf(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>iAnn<!>)<!>)
class TestAnn class TestAnn
val iAnn = <!ANNOTATION_CLASS_CONSTRUCTOR_CALL!>Ann(1)<!> val iAnn = <!ANNOTATION_CLASS_CONSTRUCTOR_CALL!>Ann(1)<!>
@@ -12,9 +12,9 @@ class A2
@Ann3(arrayOf(A1::class, A2::class)) @Ann3(arrayOf(A1::class, A2::class))
class MyClass1 class MyClass1
@Ann1(<!ANNOTATION_PARAMETER_MUST_BE_CONST!><!UNRESOLVED_REFERENCE!>A3<!>::class<!>) @Ann1(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!><!UNRESOLVED_REFERENCE!>A3<!>::class<!>)
class MyClass2 class MyClass2
val x = A1::class val x = A1::class
@Ann1(<!ANNOTATION_PARAMETER_MUST_BE_KCLASS_LITERAL!>x<!>) @Ann1(<!ANNOTATION_ARGUMENT_MUST_BE_KCLASS_LITERAL!>x<!>)
class MyClass3 class MyClass3
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget
import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.idea.project.languageVersionSettings
import org.jetbrains.kotlin.idea.search.restrictToKotlinSources import org.jetbrains.kotlin.idea.search.restrictToKotlinSources
@@ -65,6 +66,8 @@ class AddAnnotationTargetFix(annotationEntry: KtAnnotationEntry) : KotlinQuickFi
} }
override fun createAction(diagnostic: Diagnostic): KotlinQuickFixAction<KtAnnotationEntry>? { override fun createAction(diagnostic: Diagnostic): KotlinQuickFixAction<KtAnnotationEntry>? {
if (diagnostic.factory != Errors.WRONG_ANNOTATION_TARGET) return null
val entry = diagnostic.psiElement as? KtAnnotationEntry ?: return null val entry = diagnostic.psiElement as? KtAnnotationEntry ?: return null
val annotationClass = entry.toAnnotationClass() ?: return null val annotationClass = entry.toAnnotationClass() ?: return null
if (entry.useSiteTarget != null && entry.getRequiredAnnotationTargets(annotationClass, entry.project).isEmpty()) return null if (entry.useSiteTarget != null && entry.getRequiredAnnotationTargets(annotationClass, entry.project).isEmpty()) return null
@@ -1,5 +1,5 @@
// "Move annotation to receiver type" "false" // "Move annotation to receiver type" "false"
// ERROR: This annotation is not applicable to target 'top level function' and use site target '@receiver' // ERROR: This annotation is not applicable to target 'declaration' and use site target '@receiver'
// ACTION: Make internal // ACTION: Make internal
// ACTION: Make private // ACTION: Make private
@@ -1,5 +1,5 @@
// "Move annotation to receiver type" "false" // "Move annotation to receiver type" "false"
// ERROR: This annotation is not applicable to target 'top level property without backing field or delegate' and use site target '@receiver' // ERROR: This annotation is not applicable to target 'declaration' and use site target '@receiver'
// ACTION: Make internal // ACTION: Make internal
// ACTION: Make private // ACTION: Make private
// ACTION: Specify type explicitly // ACTION: Specify type explicitly
@@ -1,5 +1,5 @@
// "Remove @ from annotation argument" "true" // "Remove @ from annotation argument" "true"
// ERROR: An annotation parameter must be a compile-time constant // ERROR: An annotation argument must be a compile-time constant
annotation class Y() annotation class Y()
annotation class X(val value: Y, val y: Y) annotation class X(val value: Y, val y: Y)
@@ -1,5 +1,5 @@
// "Remove @ from annotation argument" "true" // "Remove @ from annotation argument" "true"
// ERROR: An annotation parameter must be a compile-time constant // ERROR: An annotation argument must be a compile-time constant
annotation class Y() annotation class Y()
annotation class X(val value: Y, val y: Y) annotation class X(val value: Y, val y: Y)
@@ -1,5 +1,5 @@
// "Remove @ from annotation argument" "true" // "Remove @ from annotation argument" "true"
// ERROR: An annotation parameter must be a compile-time constant // ERROR: An annotation argument must be a compile-time constant
annotation class Y() annotation class Y()
annotation class X(val value: Y) annotation class X(val value: Y)
@@ -1,5 +1,5 @@
// "Remove @ from annotation argument" "true" // "Remove @ from annotation argument" "true"
// ERROR: An annotation parameter must be a compile-time constant // ERROR: An annotation argument must be a compile-time constant
annotation class Y() annotation class Y()
annotation class X(val value: Y) annotation class X(val value: Y)
@@ -21,4 +21,4 @@ Exit code: ABORT
------------------------------------------ ------------------------------------------
COMPILATION FAILED COMPILATION FAILED
Unresolved reference: test Unresolved reference: test
An annotation parameter must be a compile-time constant An annotation argument must be a compile-time constant
@@ -10,7 +10,7 @@
// EXPECTED_ERROR(kotlin:32:5) cannot find symbol // EXPECTED_ERROR(kotlin:32:5) cannot find symbol
// EXPECTED_ERROR(kotlin:35:5) cannot find symbol // EXPECTED_ERROR(kotlin:35:5) cannot find symbol
@file:Suppress("UNRESOLVED_REFERENCE", "ANNOTATION_PARAMETER_MUST_BE_CONST", "NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION") @file:Suppress("UNRESOLVED_REFERENCE", "ANNOTATION_ARGUMENT_MUST_BE_CONST", "NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION")
import kotlin.reflect.KClass import kotlin.reflect.KClass
@Anno(ABC::class) @Anno(ABC::class)
@@ -3,7 +3,7 @@
// NO_VALIDATION // NO_VALIDATION
// WITH_RUNTIME // WITH_RUNTIME
@file:Suppress("UNRESOLVED_REFERENCE", "ANNOTATION_PARAMETER_MUST_BE_CONST", "NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION", "UNSUPPORTED_FEATURE") @file:Suppress("UNRESOLVED_REFERENCE", "ANNOTATION_ARGUMENT_MUST_BE_CONST", "NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION", "UNSUPPORTED_FEATURE")
import java.util.Calendar import java.util.Calendar
import kotlin.reflect.KClass import kotlin.reflect.KClass
@@ -34,7 +34,7 @@ public final class MyType<T extends java.lang.Object> {
import java.util.Calendar; import java.util.Calendar;
import kotlin.reflect.KClass; import kotlin.reflect.KClass;
@kotlin.Suppress(names = {"UNRESOLVED_REFERENCE", "ANNOTATION_PARAMETER_MUST_BE_CONST", "NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION", "UNSUPPORTED_FEATURE"}) @kotlin.Suppress(names = {"UNRESOLVED_REFERENCE", "ANNOTATION_ARGUMENT_MUST_BE_CONST", "NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION", "UNSUPPORTED_FEATURE"})
@kotlin.Metadata() @kotlin.Metadata()
public final class NonExistentClassTypesConversionKt { public final class NonExistentClassTypesConversionKt {
} }