From 454ef4ae46e99fb66e70e748a913e616cee6b20d Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Mon, 4 Mar 2024 13:37:10 +0100 Subject: [PATCH] [FIR] Build resolved argument list for augmented array assignment get call This lets us get rid of some fallback code in FIR2IR that handles unresolved argument lists. After this, we should have an invariant that all non-empty argument lists are resolved when FIR2IR runs. #KT-66124 --- .../generators/CallAndReferenceGenerator.kt | 22 +++----------- .../FirExpressionsResolveTransformer.kt | 30 ++++++++++--------- 2 files changed, 20 insertions(+), 32 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt index 1a3d1618489..311a2616fa3 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt @@ -892,26 +892,12 @@ class CallAndReferenceGenerator( if (argumentsCount <= valueArgumentsCount) { apply { val (valueParameters, argumentMapping, substitutor) = extractArgumentsMapping(call) - if (argumentMapping != null && (visitor.annotationMode || argumentMapping.isNotEmpty())) { - if (valueParameters != null) { - return applyArgumentsWithReorderingIfNeeded( - argumentMapping, valueParameters, substitutor, contextReceiverCount, call, - ) - } - } - // Case without argument mapping (deserialized annotation) - // TODO: support argument mapping in deserialized annotations and remove me - for ((index, argument) in call.arguments.withIndex()) { - val valueParameter = when (argument) { - is FirNamedArgumentExpression -> valueParameters?.find { it.name == argument.name } - else -> null - } ?: valueParameters?.get(index) - val argumentExpression = convertArgument(argument, valueParameter, substitutor) - putValueArgument( - (valueParameters?.indexOf(valueParameter)?.takeIf { it >= 0 } ?: index) + contextReceiverCount, - argumentExpression + if (argumentMapping != null && (visitor.annotationMode || argumentMapping.isNotEmpty()) && valueParameters != null) { + return applyArgumentsWithReorderingIfNeeded( + argumentMapping, valueParameters, substitutor, contextReceiverCount, call, ) } + check(argumentsCount == 0) { "Non-empty unresolved argument list." } } } else { val calleeSymbol = (this as? IrCallImpl)?.symbol diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt index 33afd025695..d73d89220ff 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt @@ -1635,23 +1635,25 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT dispatchReceiver = lhsGetCall.dispatchReceiver } calleeReference = lhsGetCall.calleeReference - argumentList = buildArgumentList { - var i = 0 - for (argument in lhsGetCall.argumentList.arguments) { - arguments += if (argument is FirVarargArgumentsExpression) { - buildVarargArgumentsExpression { - val varargSize = argument.arguments.size - arguments += indicesQualifiedAccessForGet.subList(i, i + varargSize) - i += varargSize - source = argument.source - coneTypeOrNull = argument.resolvedType - coneElementTypeOrNull = argument.coneElementTypeOrNull - } - } else { - indicesQualifiedAccessForGet[i++] + var i = 0 + val newMapping = (lhsGetCall.argumentList as FirResolvedArgumentList).mapping.mapKeysTo(LinkedHashMap()) { (argument) -> + if (argument is FirVarargArgumentsExpression) { + buildVarargArgumentsExpression { + val varargSize = argument.arguments.size + arguments += indicesQualifiedAccessForGet.subList(i, i + varargSize) + i += varargSize + source = argument.source + coneTypeOrNull = argument.resolvedType + coneElementTypeOrNull = argument.coneElementTypeOrNull } + } else { + indicesQualifiedAccessForGet[i++] } } + argumentList = buildResolvedArgumentList( + lhsGetCall.argumentList, + newMapping, + ) origin = FirFunctionCallOrigin.Operator coneTypeOrNull = lhsGetCall.resolvedType }