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 e379e8027d0..74f0654b916 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 @@ -637,7 +637,8 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform } !assignIsSuccessful && operatorIsSuccessful -> chooseOperator() assignIsSuccessful && !operatorIsSuccessful -> chooseAssign() - assignIsSuccessful && operatorIsSuccessful && !operatorReturnTypeMatches -> chooseAssign() + leftArgument.typeRef.coneType is ConeDynamicType -> chooseAssign() + !operatorReturnTypeMatches -> chooseAssign() else -> reportAmbiguity() } } @@ -1188,12 +1189,6 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform val assignCallReference = resolvedAssignCall.calleeReference as? FirNamedReferenceWithCandidate val assignIsSuccessful = assignCallReference?.isError == false - // .set(, .get().plus(c)) - val info = tryResolveAugmentedArraySetCallAsSetGetBlock(augmentedArraySetCall, transformedLhsCall, transformedRhs) - val resolvedOperatorCall = info.operatorCall - val operatorCallReference = resolvedOperatorCall.calleeReference as? FirNamedReferenceWithCandidate - val operatorIsSuccessful = operatorCallReference?.isError == false - fun completeAssignCall() { dataFlowAnalyzer.enterFunctionCall(resolvedAssignCall) callCompleter.completeCall(resolvedAssignCall, noExpectedType) @@ -1205,6 +1200,17 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform return resolvedAssignCall } + // prefer a "simpler" variant for dynamics + if (transformedLhsCall.calleeReference.resolvedSymbol?.origin == FirDeclarationOrigin.DynamicScope) { + return chooseAssign() + } + + // .set(, .get().plus(c)) + val info = tryResolveAugmentedArraySetCallAsSetGetBlock(augmentedArraySetCall, transformedLhsCall, transformedRhs) + val resolvedOperatorCall = info.operatorCall + val operatorCallReference = resolvedOperatorCall.calleeReference as? FirNamedReferenceWithCandidate + val operatorIsSuccessful = operatorCallReference?.isError == false + // if `plus` call already inapplicable then there is no need to try to resolve `set` call if (assignIsSuccessful && !operatorIsSuccessful) { return chooseAssign()