[FIR] Add parameter flattenArrays to FirExpression.unwrapAndFlattenArgument

This commit is contained in:
Kirill Rakhman
2023-11-15 11:16:10 +01:00
committed by Space Team
parent 28a14ebd42
commit ebb6f4c70f
4 changed files with 15 additions and 9 deletions
@@ -144,7 +144,7 @@ private fun <T> FirAnnotation.findFromRawArguments(expectedEnumClass: ClassId, t
if (this@findFromRawArguments is FirAnnotationCall) { if (this@findFromRawArguments is FirAnnotationCall) {
for (arg in argumentList.arguments) { for (arg in argumentList.arguments) {
arg.unwrapAndFlattenArgument().forEach(::addIfMatching) arg.unwrapAndFlattenArgument(flattenArrays = true).forEach(::addIfMatching)
} }
} }
} }
@@ -58,7 +58,7 @@ fun FirRegularClass.getAllowedAnnotationTargets(session: FirSession): Set<Kotlin
fun FirClassLikeSymbol<*>.getAllowedAnnotationTargets(session: FirSession): Set<KotlinTarget> { fun FirClassLikeSymbol<*>.getAllowedAnnotationTargets(session: FirSession): Set<KotlinTarget> {
lazyResolveToPhase(FirResolvePhase.ANNOTATION_ARGUMENTS) lazyResolveToPhase(FirResolvePhase.ANNOTATION_ARGUMENTS)
val targetAnnotation = getTargetAnnotation(session) ?: return defaultAnnotationTargets 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 -> return arguments.mapNotNullTo(mutableSetOf()) { argument ->
val targetExpression = argument as? FirQualifiedAccessExpression val targetExpression = argument as? FirQualifiedAccessExpression
@@ -83,7 +83,7 @@ fun FirClassLikeSymbol<*>.getTargetAnnotation(session: FirSession): FirAnnotatio
} }
fun FirExpression.extractClassesFromArgument(session: FirSession): List<FirRegularClassSymbol> { fun FirExpression.extractClassesFromArgument(session: FirSession): List<FirRegularClassSymbol> {
return unwrapAndFlattenArgument().mapNotNull { return unwrapAndFlattenArgument(flattenArrays = true).mapNotNull {
it.extractClassFromArgument(session) it.extractClassFromArgument(session)
} }
} }
@@ -88,11 +88,11 @@ private fun FirAnnotation.findUseSiteTargets(): Set<AnnotationUseSiteTarget> = b
if (this@findUseSiteTargets is FirAnnotationCall) { if (this@findUseSiteTargets is FirAnnotationCall) {
for (arg in argumentList.arguments) { for (arg in argumentList.arguments) {
arg.unwrapAndFlattenArgument().forEach(::addIfMatching) arg.unwrapAndFlattenArgument(flattenArrays = true).forEach(::addIfMatching)
} }
} else { } else {
argumentMapping.mapping[StandardClassIds.Annotations.ParameterNames.targetAllowedTargets] argumentMapping.mapping[StandardClassIds.Annotations.ParameterNames.targetAllowedTargets]
?.unwrapAndFlattenArgument() ?.unwrapAndFlattenArgument(flattenArrays = true)
?.forEach(::addIfMatching) ?.forEach(::addIfMatching)
} }
} }
@@ -122,12 +122,18 @@ fun <T : FirStatement> FirBlock.replaceFirstStatement(factory: (T) -> FirStateme
fun FirExpression.unwrapArgument(): FirExpression = (this as? FirWrappedArgumentExpression)?.expression ?: this fun FirExpression.unwrapArgument(): FirExpression = (this as? FirWrappedArgumentExpression)?.expression ?: this
fun FirExpression.unwrapAndFlattenArgument(): List<FirExpression> = buildList { unwrapAndFlattenArgumentTo(this) } fun FirExpression.unwrapAndFlattenArgument(flattenArrays: Boolean): List<FirExpression> = buildList { unwrapAndFlattenArgumentTo(this, flattenArrays) }
private fun FirExpression.unwrapAndFlattenArgumentTo(list: MutableList<FirExpression>) { private fun FirExpression.unwrapAndFlattenArgumentTo(list: MutableList<FirExpression>, flattenArrays: Boolean) {
when (val unwrapped = unwrapArgument()) { when (val unwrapped = unwrapArgument()) {
is FirArrayLiteral, is FirFunctionCall -> (unwrapped as FirCall).arguments.forEach { it.unwrapAndFlattenArgumentTo(list) } is FirArrayLiteral, is FirFunctionCall -> {
is FirVarargArgumentsExpression -> unwrapped.arguments.forEach { it.unwrapAndFlattenArgumentTo(list) } 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) else -> list.add(unwrapped)
} }
} }