[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:
committed by
Space Team
parent
1a5fa8d3f6
commit
03fc0fd381
+1
-1
@@ -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 {
|
||||
|
||||
+1
-1
@@ -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 {
|
||||
|
||||
+5
-6
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user