diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDelegatedPropertyChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDelegatedPropertyChecker.kt index c4a1f08d08d..8bf1ede196e 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDelegatedPropertyChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDelegatedPropertyChecker.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.expressions.FirFunctionCall +import org.jetbrains.kotlin.fir.expressions.FirImplicitInvokeCall import org.jetbrains.kotlin.fir.expressions.arguments import org.jetbrains.kotlin.fir.references.FirErrorNamedReference import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeAmbiguityError @@ -55,6 +56,10 @@ object FirDelegatedPropertyChecker : FirPropertyChecker() { checkFunctionCall(functionCall) } + override fun visitImplicitInvokeCall(implicitInvokeCall: FirImplicitInvokeCall) { + checkFunctionCall(implicitInvokeCall) + } + private fun checkFunctionCall(functionCall: FirFunctionCall) { val hasReferenceError = checkFunctionReferenceErrors(functionCall) if (isGet && !hasReferenceError) checkReturnType(functionCall) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/CopyUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/CopyUtils.kt index c40c2010a02..b9a60c7d881 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/CopyUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/CopyUtils.kt @@ -58,6 +58,25 @@ fun FirFunctionCall.copy( return (builder as FirCallBuilder).build() as FirFunctionCall } +internal fun FirFunctionCall.copyAsImplicitInvokeCall( + setupCopy: FirImplicitInvokeCallBuilder.() -> Unit +): FirImplicitInvokeCall { + val original = this + + return buildImplicitInvokeCall { + source = original.source + annotations.addAll(original.annotations) + typeArguments.addAll(original.typeArguments) + explicitReceiver = original.explicitReceiver + dispatchReceiver = original.dispatchReceiver + extensionReceiver = original.extensionReceiver + argumentList = original.argumentList + calleeReference = original.calleeReference + + setupCopy() + } +} + fun FirAnonymousFunction.copy( receiverTypeRef: FirTypeRef? = this.receiverTypeRef, source: FirSourceElement? = this.source, diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt index 3b6e1014aa9..62b531d0b36 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt @@ -44,7 +44,6 @@ import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind import org.jetbrains.kotlin.resolve.calls.tower.CandidateApplicability import org.jetbrains.kotlin.resolve.calls.tower.isSuccess import org.jetbrains.kotlin.types.Variance -import java.lang.annotation.ElementType class FirCallResolver( private val components: FirAbstractBodyResolveTransformer.BodyResolveTransformerComponents, @@ -115,12 +114,12 @@ class FirCallResolver( // We need desugaring val resultFunctionCall = if (candidate != null && candidate.callInfo != result.info) { - functionCall.copy( - explicitReceiver = candidate.callInfo.explicitReceiver, - dispatchReceiver = candidate.dispatchReceiverExpression(), - extensionReceiver = candidate.extensionReceiverExpression(), - argumentList = candidate.callInfo.argumentList, - ) + functionCall.copyAsImplicitInvokeCall { + explicitReceiver = candidate.callInfo.explicitReceiver + dispatchReceiver = candidate.dispatchReceiverExpression() + extensionReceiver = candidate.extensionReceiverExpression() + argumentList = candidate.callInfo.argumentList + } } else { resultExpression }