FIR: report ANNOTATION_PARAMETER_DEFAULT_VALUE_MUST_BE_CONSTANT

This commit is contained in:
Mikhail Glukhikh
2021-05-11 18:05:57 +03:00
parent 55104a594c
commit 1a3aa1bff0
7 changed files with 8 additions and 42 deletions
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.KtNodeTypes.VALUE_PARAMETER
import org.jetbrains.kotlin.descriptors.ClassKind.ANNOTATION_CLASS
import org.jetbrains.kotlin.descriptors.ClassKind.ENUM_CLASS
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.analysis.checkers.checkConstantArguments
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.diagnostics.*
import org.jetbrains.kotlin.fir.declarations.*
@@ -38,6 +39,10 @@ object FirAnnotationClassDeclarationChecker : FirRegularClassChecker() {
} else if (source.hasVar()) {
reporter.reportOn(source, FirErrors.VAR_ANNOTATION_PARAMETER, context)
}
val defaultValue = parameter.defaultValue
if (defaultValue != null && checkConstantArguments(defaultValue, context.session) != null) {
reporter.reportOn(defaultValue.source, FirErrors.ANNOTATION_PARAMETER_DEFAULT_VALUE_MUST_BE_CONSTANT, context)
}
val typeRef = parameter.returnTypeRef
val coneType = typeRef.coneTypeSafe<ConeLookupTagBasedType>()
@@ -1,12 +0,0 @@
const val iConst = 42
val iVal = 42
fun iFun() = 42
annotation class Ann(val x: Int)
annotation class Test1(val x: Int = 42)
annotation class Test2(val x: Int = iConst)
annotation class Test3(val x: Int = 1 + iConst + 1)
annotation class Test4(val x: Int = iVal)
annotation class Test5(val x: Int = 1 + iVal + 1)
annotation class Test6(val x: Int = iFun())
annotation class Test7(val x: Int = 1 + iFun() + 1)
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
const val iConst = 42
val iVal = 42
fun iFun() = 42
@@ -1,8 +0,0 @@
annotation class A
annotation class A1(val x: Int)
annotation class B(
val a: A = A(),
val x: Int = A1(42).x,
val aa: Array<A> = arrayOf(A())
)
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
annotation class A
annotation class A1(val x: Int)
@@ -1,22 +0,0 @@
import kotlin.reflect.KClass
const val CONST = 1
fun foo() = 1
val nonConst = foo()
annotation class ValidAnn(
val p1: Int = 1 + CONST,
val p2: String = "",
val p3: KClass<*> = String::class,
val p4: IntArray = intArrayOf(1, 2, 3),
val p5: Array<String> = arrayOf("abc"),
val p6: Array<KClass<*>> = arrayOf(Int::class)
)
val nonConstKClass = String::class
annotation class InvalidAnn(
val p1: Int = foo(),
val p2: Int = nonConst,
val p3: KClass<*> = nonConstKClass
)
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
import kotlin.reflect.KClass
const val CONST = 1