diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/firAnnotationUtils.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/firAnnotationUtils.kt index d2f2633e30c..270b9d12340 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/firAnnotationUtils.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/firAnnotationUtils.kt @@ -144,7 +144,7 @@ private fun FirAnnotation.findFromRawArguments(expectedEnumClass: ClassId, t if (this@findFromRawArguments is FirAnnotationCall) { for (arg in argumentList.arguments) { - arg.unwrapAndFlattenArgument().forEach(::addIfMatching) + arg.unwrapAndFlattenArgument(flattenArrays = true).forEach(::addIfMatching) } } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirAnnotationHelpers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirAnnotationHelpers.kt index d328a85fbbc..45396d779b8 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirAnnotationHelpers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirAnnotationHelpers.kt @@ -58,7 +58,7 @@ fun FirRegularClass.getAllowedAnnotationTargets(session: FirSession): Set.getAllowedAnnotationTargets(session: FirSession): Set { lazyResolveToPhase(FirResolvePhase.ANNOTATION_ARGUMENTS) val targetAnnotation = getTargetAnnotation(session) ?: return defaultAnnotationTargets - val arguments = targetAnnotation.findArgumentByName(ParameterNames.targetAllowedTargets)?.unwrapAndFlattenArgument().orEmpty() + val arguments = targetAnnotation.findArgumentByName(ParameterNames.targetAllowedTargets)?.unwrapAndFlattenArgument(flattenArrays = true).orEmpty() return arguments.mapNotNullTo(mutableSetOf()) { argument -> val targetExpression = argument as? FirQualifiedAccessExpression @@ -83,7 +83,7 @@ fun FirClassLikeSymbol<*>.getTargetAnnotation(session: FirSession): FirAnnotatio } fun FirExpression.extractClassesFromArgument(session: FirSession): List { - return unwrapAndFlattenArgument().mapNotNull { + return unwrapAndFlattenArgument(flattenArrays = true).mapNotNull { it.extractClassFromArgument(session) } } diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/FirAnnotationUtils.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/FirAnnotationUtils.kt index bc9df29af64..583c937c543 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/FirAnnotationUtils.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/FirAnnotationUtils.kt @@ -88,11 +88,11 @@ private fun FirAnnotation.findUseSiteTargets(): Set = b if (this@findUseSiteTargets is FirAnnotationCall) { for (arg in argumentList.arguments) { - arg.unwrapAndFlattenArgument().forEach(::addIfMatching) + arg.unwrapAndFlattenArgument(flattenArrays = true).forEach(::addIfMatching) } } else { argumentMapping.mapping[StandardClassIds.Annotations.ParameterNames.targetAllowedTargets] - ?.unwrapAndFlattenArgument() + ?.unwrapAndFlattenArgument(flattenArrays = true) ?.forEach(::addIfMatching) } } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionUtil.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionUtil.kt index 17a8d1c0621..e6cf83026cb 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionUtil.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionUtil.kt @@ -122,12 +122,18 @@ fun FirBlock.replaceFirstStatement(factory: (T) -> FirStateme fun FirExpression.unwrapArgument(): FirExpression = (this as? FirWrappedArgumentExpression)?.expression ?: this -fun FirExpression.unwrapAndFlattenArgument(): List = buildList { unwrapAndFlattenArgumentTo(this) } +fun FirExpression.unwrapAndFlattenArgument(flattenArrays: Boolean): List = buildList { unwrapAndFlattenArgumentTo(this, flattenArrays) } -private fun FirExpression.unwrapAndFlattenArgumentTo(list: MutableList) { +private fun FirExpression.unwrapAndFlattenArgumentTo(list: MutableList, flattenArrays: Boolean) { when (val unwrapped = unwrapArgument()) { - is FirArrayLiteral, is FirFunctionCall -> (unwrapped as FirCall).arguments.forEach { it.unwrapAndFlattenArgumentTo(list) } - is FirVarargArgumentsExpression -> unwrapped.arguments.forEach { it.unwrapAndFlattenArgumentTo(list) } + is FirArrayLiteral, is FirFunctionCall -> { + if (flattenArrays) { + (unwrapped as FirCall).arguments.forEach { it.unwrapAndFlattenArgumentTo(list, flattenArrays) } + } else { + list.add(unwrapped) + } + } + is FirVarargArgumentsExpression -> unwrapped.arguments.forEach { it.unwrapAndFlattenArgumentTo(list, flattenArrays) } else -> list.add(unwrapped) } }