[FIR] Report not-a-constant diagnostics inside function calls

When function calls are not fully resolved
This commit is contained in:
Andrey Zinovyev
2021-05-11 19:03:08 +03:00
parent e74141ded6
commit 5d30576d28
2 changed files with 25 additions and 17 deletions
@@ -59,26 +59,30 @@ object FirAnnotationArgumentChecker : FirAnnotationCallChecker() {
reporter: DiagnosticReporter,
context: CheckerContext
): FirDiagnosticFactory0<KtExpression>? {
when (expression) {
is FirArrayOfCall -> {
var usedNonConst = false
for (arg in expression.argumentList.arguments) {
val sourceForReport = arg.source
fun checkArgumentList(args: FirArgumentList): FirDiagnosticFactory0<KtExpression>? {
var usedNonConst = false
when (val err = checkAnnotationArgumentWithSubElements(arg, fqName, session, reporter, context)) {
null -> {
//DO NOTHING
}
else -> {
if (err != FirErrors.ANNOTATION_ARGUMENT_MUST_BE_KCLASS_LITERAL) usedNonConst = true
reporter.reportOn(sourceForReport, err, context)
}
for (arg in args.arguments) {
val sourceForReport = arg.source
when (val err = checkAnnotationArgumentWithSubElements(arg, fqName, session, reporter, context)) {
null -> {
//DO NOTHING
}
else -> {
if (err != FirErrors.ANNOTATION_ARGUMENT_MUST_BE_KCLASS_LITERAL) usedNonConst = true
reporter.reportOn(sourceForReport, err, context)
}
}
if (usedNonConst) return FirErrors.NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION
}
return if (usedNonConst) FirErrors.NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION
else null
}
when (expression) {
is FirArrayOfCall -> return checkArgumentList(expression.argumentList)
is FirVarargArgumentsExpression -> {
for (arg in expression.arguments) {
val unwrappedArg = if (arg is FirSpreadArgumentExpression) arg.expression else arg
@@ -93,7 +97,11 @@ object FirAnnotationArgumentChecker : FirAnnotationCallChecker() {
ConstantArgumentKind.NOT_KCLASS_LITERAL -> FirErrors.ANNOTATION_ARGUMENT_MUST_BE_KCLASS_LITERAL
ConstantArgumentKind.KCLASS_LITERAL_OF_TYPE_PARAMETER_ERROR -> FirErrors.ANNOTATION_ARGUMENT_KCLASS_LITERAL_OF_TYPE_PARAMETER_ERROR
ConstantArgumentKind.NOT_CONST_VAL_IN_CONST_EXPRESSION -> FirErrors.NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION
null -> null
null ->
//try to go deeper if we are not sure about this function call
//to report non-constant val in not fully resolved calls
if (expression is FirFunctionCall) checkArgumentList(expression.argumentList)
else null
}
if (error != null) {
return error
@@ -6,7 +6,7 @@ annotation class Ann(val i: IntArray)
@Ann(intArrayOf(i2))
@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(intArrayOf(<!ARGUMENT_TYPE_MISMATCH!>intArrayOf(i, i2, i3)<!>))
@Ann(<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>intArrayOf(<!ARGUMENT_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
var i = 1