Postpone call arguments generation in compound assignment expressions
Otherwise RHS is generated twice, causing ISE in symbol binding
This commit is contained in:
+2
-2
@@ -232,7 +232,7 @@ fun StatementGenerator.pregenerateCall(resolvedCall: ResolvedCall<*>): CallBuild
|
||||
return pregenerateExtensionInvokeCall(resolvedCall)
|
||||
}
|
||||
|
||||
val call = pregenerateCallWithReceivers(resolvedCall)
|
||||
val call = pregenerateCallReceivers(resolvedCall)
|
||||
pregenerateValueArguments(call, resolvedCall)
|
||||
return call
|
||||
}
|
||||
@@ -310,7 +310,7 @@ private fun StatementGenerator.pregenerateValueArguments(call: CallBuilder, reso
|
||||
}
|
||||
}
|
||||
|
||||
fun StatementGenerator.pregenerateCallWithReceivers(resolvedCall: ResolvedCall<*>): CallBuilder {
|
||||
fun StatementGenerator.pregenerateCallReceivers(resolvedCall: ResolvedCall<*>): CallBuilder {
|
||||
val call = CallBuilder(resolvedCall, unwrapCallableDescriptor(resolvedCall.resultingDescriptor))
|
||||
|
||||
call.callReceiver = generateCallReceiver(resolvedCall.call.callElement,
|
||||
|
||||
+3
-3
@@ -50,7 +50,7 @@ class AssignmentGenerator(statementGenerator: StatementGenerator) : StatementGen
|
||||
val irAssignmentReceiver = generateAssignmentReceiver(ktLeft, origin)
|
||||
|
||||
return irAssignmentReceiver.assign { irLValue ->
|
||||
val opCall = statementGenerator.pregenerateCall(opResolvedCall)
|
||||
val opCall = statementGenerator.pregenerateCallReceivers(opResolvedCall)
|
||||
opCall.setExplicitReceiverValue(irLValue)
|
||||
opCall.irValueArgumentsByIndex[0] = statementGenerator.generateExpression(ktRight)
|
||||
val irOpCall = CallGenerator(statementGenerator).generateCall(expression, opCall, origin)
|
||||
@@ -239,10 +239,10 @@ class AssignmentGenerator(statementGenerator: StatementGenerator) : StatementGen
|
||||
val irIndexExpressions = ktLeft.indexExpressions.map { statementGenerator.generateExpression(it) }
|
||||
|
||||
val indexedGetResolvedCall = get(BindingContext.INDEXED_LVALUE_GET, ktLeft)
|
||||
val indexedGetCall = indexedGetResolvedCall?.let { statementGenerator.pregenerateCallWithReceivers(it) }
|
||||
val indexedGetCall = indexedGetResolvedCall?.let { statementGenerator.pregenerateCallReceivers(it) }
|
||||
|
||||
val indexedSetResolvedCall = get(BindingContext.INDEXED_LVALUE_SET, ktLeft)
|
||||
val indexedSetCall = indexedSetResolvedCall?.let { statementGenerator.pregenerateCallWithReceivers(it) }
|
||||
val indexedSetCall = indexedSetResolvedCall?.let { statementGenerator.pregenerateCallReceivers(it) }
|
||||
|
||||
return ArrayAccessAssignmentReceiver(irArray, irIndexExpressions, indexedGetCall, indexedSetCall,
|
||||
CallGenerator(statementGenerator),
|
||||
|
||||
Reference in New Issue
Block a user