From e3ddc843bcc889fc6bb6865725b9cc2a4ce00bdd Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Wed, 17 Jan 2024 21:06:16 +0100 Subject: [PATCH] [FIR] Fix and simplify `FirUnsupportedArrayLiteralChecker` --- .../FirUnsupportedArrayLiteralChecker.kt | 46 ++++--------------- .../standaloneInExpression.fir.kt | 18 -------- .../standaloneInExpression.kt | 1 + ...boutChangingExecutionOrderForVararg.fir.kt | 2 +- .../array.fir.kt | 2 +- 5 files changed, 12 insertions(+), 57 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/annotations/annotationParameterMustBeConstant/standaloneInExpression.fir.kt diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUnsupportedArrayLiteralChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUnsupportedArrayLiteralChecker.kt index 53045d2fa08..8907aae8fc8 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUnsupportedArrayLiteralChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUnsupportedArrayLiteralChecker.kt @@ -14,13 +14,15 @@ import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.impl.FirPrimaryConstructor import org.jetbrains.kotlin.fir.declarations.utils.isCompanion -import org.jetbrains.kotlin.fir.expressions.* +import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall +import org.jetbrains.kotlin.fir.expressions.FirArrayLiteral +import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.types.resolvedType import org.jetbrains.kotlin.fir.types.toRegularClassSymbol object FirUnsupportedArrayLiteralChecker : FirArrayLiteralChecker() { override fun check(expression: FirArrayLiteral, context: CheckerContext, reporter: DiagnosticReporter) { - if (!isInsideAnnotationCall(expression, context) && + if (!isInsideAnnotationCall(context) && (context.callsOrAssignments.isNotEmpty() || !isInsideAnnotationClass(context)) ) { reporter.reportOn( @@ -32,42 +34,12 @@ object FirUnsupportedArrayLiteralChecker : FirArrayLiteralChecker() { } } - private fun isInsideAnnotationCall(expression: FirArrayLiteral, context: CheckerContext): Boolean { - context.callsOrAssignments.lastOrNull()?.let { - val arguments = when (it) { - is FirFunctionCall -> - if (it.resolvedType.toRegularClassSymbol(context.session)?.classKind == ClassKind.ANNOTATION_CLASS) { - it.arguments - } else { - return false - } - is FirAnnotationCall -> it.arguments - else -> return false - } - - return arguments.any { argument -> - val unwrappedArguments = - if (argument is FirVarargArgumentsExpression) { - argument.arguments.map { arg -> arg.unwrapArgument() } - } else { - listOf(argument.unwrapArgument()) - } - - for (unwrapped in unwrappedArguments) { - if (unwrapped == expression || - (unwrapped is FirErrorExpression && unwrapped.expression == expression) || - unwrapped is FirArrayLiteral && - unwrapped.arguments.any { arrayLiteralElement -> arrayLiteralElement.unwrapArgument() == expression } - ) { - return@any true - } - } - - return@any false - } + private fun isInsideAnnotationCall(context: CheckerContext): Boolean = context.callsOrAssignments.asReversed().any { + when (it) { + is FirFunctionCall -> it.resolvedType.toRegularClassSymbol(context.session)?.classKind == ClassKind.ANNOTATION_CLASS + is FirAnnotationCall -> true + else -> false } - - return false } private fun isInsideAnnotationClass(context: CheckerContext): Boolean { diff --git a/compiler/testData/diagnostics/tests/annotations/annotationParameterMustBeConstant/standaloneInExpression.fir.kt b/compiler/testData/diagnostics/tests/annotations/annotationParameterMustBeConstant/standaloneInExpression.fir.kt deleted file mode 100644 index 20a40bd64dc..00000000000 --- a/compiler/testData/diagnostics/tests/annotations/annotationParameterMustBeConstant/standaloneInExpression.fir.kt +++ /dev/null @@ -1,18 +0,0 @@ -annotation class AnnE(val i: String) - -enum class MyEnum { - A -} - -@AnnE("1" + MyEnum.A) -class Test - -@AnnE("1" + MyEnum::class) -class Test2 - -@AnnE("1" + AnnE("23")) -class Test3 - -@AnnE("1" + arrayOf("23", "34")) -class Test4 - diff --git a/compiler/testData/diagnostics/tests/annotations/annotationParameterMustBeConstant/standaloneInExpression.kt b/compiler/testData/diagnostics/tests/annotations/annotationParameterMustBeConstant/standaloneInExpression.kt index abb407b4f6c..f9f9e533d54 100644 --- a/compiler/testData/diagnostics/tests/annotations/annotationParameterMustBeConstant/standaloneInExpression.kt +++ b/compiler/testData/diagnostics/tests/annotations/annotationParameterMustBeConstant/standaloneInExpression.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL annotation class AnnE(val i: String) enum class MyEnum { diff --git a/compiler/testData/diagnostics/tests/annotations/dontReportWarningAboutChangingExecutionOrderForVararg.fir.kt b/compiler/testData/diagnostics/tests/annotations/dontReportWarningAboutChangingExecutionOrderForVararg.fir.kt index ef953ec540d..e8a32f8aa8f 100644 --- a/compiler/testData/diagnostics/tests/annotations/dontReportWarningAboutChangingExecutionOrderForVararg.fir.kt +++ b/compiler/testData/diagnostics/tests/annotations/dontReportWarningAboutChangingExecutionOrderForVararg.fir.kt @@ -4,7 +4,7 @@ annotation class Anno(vararg val x: String, val y: String) @Anno(x = [["a", "b"], ["a", "b"]], y = "a") fun foo1() {} -@Anno(x = [[["a"]]], y = "b") +@Anno(x = [[["a"]]], y = "b") fun foo11() {} @Anno(x = ["a", "b"], y = "a") diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/array.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/array.fir.kt index 69debb93c1b..e97514f7769 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/array.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/array.fir.kt @@ -6,7 +6,7 @@ annotation class Ann(val i: IntArray) @Ann(intArrayOf(i2)) @Ann(intArrayOf(i3)) @Ann(intArrayOf(i, i2, i3)) -@Ann(intArrayOf(intArrayOf(i, i2, i3))) +@Ann(intArrayOf(intArrayOf(i, i2, i3))) class Test var i = 1