[FIR] Remove FirLambdaArgumentExpression

It's not really necessary if the information about if the lambda was a
trailing lambda can be directly saved in FirAnonymousFunctionExpression.

Removing the FIR node uncovered a couple of bugs
(UNINITIALIZED_ENUM_ENTRY, ERROR_IN_CONTRACT_DESCRIPTION) that were
caused by assuming that a lambda is always a trailing lambda.

#KT-66124
This commit is contained in:
Kirill Rakhman
2024-03-04 11:59:13 +01:00
committed by Space Team
parent 1a5fa8d3f6
commit 03fc0fd381
66 changed files with 302 additions and 351 deletions
@@ -75,7 +75,7 @@ fun BodyResolveComponents.mapArguments(
val excessLambdaArguments: MutableList<FirExpression> = mutableListOf()
var externalArgument: FirExpression? = null
for (argument in arguments) {
if (argument is FirLambdaArgumentExpression) {
if (argument is FirAnonymousFunctionExpression && argument.isTrailingLambda) {
if (externalArgument == null) {
externalArgument = argument
} else {
@@ -298,7 +298,7 @@ class FirCallCompleter(
val matchedParameter = candidate.argumentMapping?.firstNotNullOfOrNull { (currentArgument, currentValueParameter) ->
val currentLambdaArgument =
((currentArgument as? FirLambdaArgumentExpression)?.expression as? FirAnonymousFunctionExpression)?.anonymousFunction
(currentArgument as? FirAnonymousFunctionExpression)?.anonymousFunction
if (currentLambdaArgument === lambdaArgument) {
currentValueParameter
} else {
@@ -170,10 +170,10 @@ abstract class FirAbstractContractResolveTransformerDispatcher(
owner.body.replaceFirstStatement<FirContractCallBlock> { FirContractCallBlock(resolvedContractCall) }
}
val argument = resolvedContractCall.arguments.singleOrNull() as? FirLambdaArgumentExpression
val argument = resolvedContractCall.arguments.singleOrNull() as? FirAnonymousFunctionExpression
?: return transformOwnerOfErrorContract(owner)
val lambdaBody = (argument.expression as FirAnonymousFunctionExpression).anonymousFunction.body
val lambdaBody = argument.anonymousFunction.body
?: return transformOwnerOfErrorContract(owner)
val resolvedContractDescription = buildResolvedContractDescription {
@@ -227,10 +227,9 @@ abstract class FirAbstractContractResolveTransformerDispatcher(
}
}
val lambdaArgument = buildLambdaArgumentExpression {
expression = buildAnonymousFunctionExpression {
anonymousFunction = effectsBlock
}
val lambdaArgument = buildAnonymousFunctionExpression {
anonymousFunction = effectsBlock
isTrailingLambda = true
}
val contractCall = buildFunctionCall {