[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) {
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> {
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<FirRegularClassSymbol> {
return unwrapAndFlattenArgument().mapNotNull {
return unwrapAndFlattenArgument(flattenArrays = true).mapNotNull {
it.extractClassFromArgument(session)
}
}
@@ -88,11 +88,11 @@ private fun FirAnnotation.findUseSiteTargets(): Set<AnnotationUseSiteTarget> = 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)
}
}
@@ -122,12 +122,18 @@ fun <T : FirStatement> FirBlock.replaceFirstStatement(factory: (T) -> FirStateme
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()) {
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)
}
}