FIR checker: fix ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION

Currently this checker is missing `arrayOf` calls inside annotation.
This commit is contained in:
Tianyu Geng
2021-09-07 09:10:15 -07:00
committed by teamcityserver
parent 3ef9649344
commit b8b9502db4
4 changed files with 26 additions and 8 deletions
@@ -22,7 +22,10 @@ import org.jetbrains.kotlin.fir.types.isArrayType
object FirNamedVarargChecker : FirCallChecker() { object FirNamedVarargChecker : FirCallChecker() {
override fun check(expression: FirCall, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(expression: FirCall, context: CheckerContext, reporter: DiagnosticReporter) {
if (expression !is FirFunctionCall && expression !is FirAnnotation && expression !is FirDelegatedConstructorCall) return if (expression !is FirFunctionCall &&
expression !is FirAnnotation &&
expression !is FirDelegatedConstructorCall &&
expression !is FirArrayOfCall) return
val isAnnotation = expression is FirAnnotation val isAnnotation = expression is FirAnnotation
val errorFactory = val errorFactory =
if (isAnnotation) FirErrors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION if (isAnnotation) FirErrors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION
@@ -44,13 +47,18 @@ object FirNamedVarargChecker : FirCallChecker() {
reporter.reportOn(argument.expression.source, errorFactory, context) reporter.reportOn(argument.expression.source, errorFactory, context)
} }
val argumentMap = expression.argumentMapping ?: return if (expression is FirArrayOfCall) {
for ((argument, parameter) in argumentMap) { // FirArrayOfCall has the `vararg` argument expression pre-flattened and doesn't have an argument mapping.
if (!parameter.isVararg) continue expression.arguments.forEach(::checkArgument)
if (argument is FirVarargArgumentsExpression) { } else {
argument.arguments.forEach(::checkArgument) val argumentMap = expression.argumentMapping ?: return
} else { for ((argument, parameter) in argumentMap) {
checkArgument(argument) if (!parameter.isVararg) continue
if (argument is FirVarargArgumentsExpression) {
argument.arguments.forEach(::checkArgument)
} else {
checkArgument(argument)
}
} }
} }
} }
@@ -12,6 +12,10 @@ fun f1() {}
@Anno2(i = intArrayOf(1)) @Anno2(i = intArrayOf(1))
fun f2() {} fun f2() {}
@Anno1(s = arrayOf(elements = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION_ERROR!>"foo"<!>))
@Anno2(i = intArrayOf(elements = *intArrayOf(1)))
fun f3() {}
fun foo(vararg ints: Int) {} fun foo(vararg ints: Int) {}
fun test() { fun test() {
@@ -12,6 +12,10 @@ fun f1() {}
@Anno2(i = intArrayOf(1)) @Anno2(i = intArrayOf(1))
fun f2() {} fun f2() {}
@Anno1(s = arrayOf(elements = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION_ERROR, TYPE_MISMATCH!>"foo"<!>))
@Anno2(i = intArrayOf(elements = *<!REDUNDANT_SPREAD_OPERATOR_IN_NAMED_FORM_IN_FUNCTION!>intArrayOf(1)<!>))
fun f3() {}
fun foo(vararg ints: Int) {} fun foo(vararg ints: Int) {}
fun test() { fun test() {
@@ -2,6 +2,7 @@ package
@Anno1(s = {"foo"}) @Anno2(i = {1}) public fun f1(): kotlin.Unit @Anno1(s = {"foo"}) @Anno2(i = {1}) public fun f1(): kotlin.Unit
@Anno1(s = {"foo"}) @Anno2(i = {1}) public fun f2(): kotlin.Unit @Anno1(s = {"foo"}) @Anno2(i = {1}) public fun f2(): kotlin.Unit
@Anno1(s = {"foo"}) @Anno2(i = {{1}}) public fun f3(): kotlin.Unit
public fun foo(/*0*/ vararg ints: kotlin.Int /*kotlin.IntArray*/): kotlin.Unit public fun foo(/*0*/ vararg ints: kotlin.Int /*kotlin.IntArray*/): kotlin.Unit
public fun test(): kotlin.Unit public fun test(): kotlin.Unit
@@ -20,3 +21,4 @@ public final annotation class Anno2 : kotlin.Annotation {
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
} }