[FIR] Report not-a-constant diagnostics inside function calls
When function calls are not fully resolved
This commit is contained in:
+24
-16
@@ -59,26 +59,30 @@ object FirAnnotationArgumentChecker : FirAnnotationCallChecker() {
|
|||||||
reporter: DiagnosticReporter,
|
reporter: DiagnosticReporter,
|
||||||
context: CheckerContext
|
context: CheckerContext
|
||||||
): FirDiagnosticFactory0<KtExpression>? {
|
): FirDiagnosticFactory0<KtExpression>? {
|
||||||
when (expression) {
|
|
||||||
is FirArrayOfCall -> {
|
|
||||||
var usedNonConst = false
|
|
||||||
|
|
||||||
for (arg in expression.argumentList.arguments) {
|
fun checkArgumentList(args: FirArgumentList): FirDiagnosticFactory0<KtExpression>? {
|
||||||
val sourceForReport = arg.source
|
var usedNonConst = false
|
||||||
|
|
||||||
when (val err = checkAnnotationArgumentWithSubElements(arg, fqName, session, reporter, context)) {
|
for (arg in args.arguments) {
|
||||||
null -> {
|
val sourceForReport = arg.source
|
||||||
//DO NOTHING
|
|
||||||
}
|
when (val err = checkAnnotationArgumentWithSubElements(arg, fqName, session, reporter, context)) {
|
||||||
else -> {
|
null -> {
|
||||||
if (err != FirErrors.ANNOTATION_ARGUMENT_MUST_BE_KCLASS_LITERAL) usedNonConst = true
|
//DO NOTHING
|
||||||
reporter.reportOn(sourceForReport, err, context)
|
}
|
||||||
}
|
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 -> {
|
is FirVarargArgumentsExpression -> {
|
||||||
for (arg in expression.arguments) {
|
for (arg in expression.arguments) {
|
||||||
val unwrappedArg = if (arg is FirSpreadArgumentExpression) arg.expression else arg
|
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.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.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
|
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) {
|
if (error != null) {
|
||||||
return error
|
return error
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@ annotation class Ann(val i: IntArray)
|
|||||||
@Ann(intArrayOf(i2))
|
@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!>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(<!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
|
class Test
|
||||||
|
|
||||||
var i = 1
|
var i = 1
|
||||||
|
|||||||
Reference in New Issue
Block a user