[FIR JS] Fix the plusAssign generation for dynamics
This commit is contained in:
+13
-7
@@ -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
|
||||
|
||||
// <array>.set(<index_i>, <array>.get(<index_i>).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()
|
||||
}
|
||||
|
||||
// <array>.set(<index_i>, <array>.get(<index_i>).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()
|
||||
|
||||
Reference in New Issue
Block a user