JVM_IR: implement single-abstract-method conversions

This commit is contained in:
pyos
2019-03-26 12:19:51 +01:00
committed by max-kammerer
parent 141e8d553e
commit b74586f84e
77 changed files with 178 additions and 84 deletions
@@ -379,7 +379,7 @@ private fun StatementGenerator.pregenerateValueArguments(call: CallBuilder, reso
generateSamConversionForValueArgumentsIfRequired(call, resolvedCall.resultingDescriptor)
}
private fun StatementGenerator.generateSamConversionForValueArgumentsIfRequired(call: CallBuilder, originalDescriptor: CallableDescriptor) {
fun StatementGenerator.generateSamConversionForValueArgumentsIfRequired(call: CallBuilder, originalDescriptor: CallableDescriptor) {
val underlyingDescriptor = context.extensions.samConversion.getOriginalForSamAdapter(originalDescriptor) ?: return
val originalValueParameters = originalDescriptor.valueParameters
@@ -72,6 +72,7 @@ class AssignmentGenerator(statementGenerator: StatementGenerator) : StatementGen
val opCall = statementGenerator.pregenerateCallReceivers(opResolvedCall)
opCall.setExplicitReceiverValue(irLValue)
opCall.irValueArgumentsByIndex[0] = ktRight.genExpr()
statementGenerator.generateSamConversionForValueArgumentsIfRequired(opCall, opResolvedCall.resultingDescriptor)
val irOpCall = CallGenerator(statementGenerator).generateCall(ktExpression, opCall, origin)
if (isSimpleAssignment) {
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.inlineStatement
import org.jetbrains.kotlin.ir.expressions.isAssignmentOperatorWithResult
import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.psi2ir.generators.CallGenerator
import org.jetbrains.kotlin.psi2ir.generators.generateSamConversionForValueArgumentsIfRequired
import org.jetbrains.kotlin.psi2ir.generators.pregenerateValueArgumentsUsing
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
import org.jetbrains.kotlin.resolve.calls.tasks.isDynamic
@@ -98,8 +99,8 @@ class ArrayAccessAssignmentReceiver(
return LValueWithGetterAndSetterCalls(
callGenerator,
descriptor,
{ indexedGetCall()?.fillArrayAndIndexArguments(irArrayValue, indexedGetResolvedCall!!, ktExpressionToIrIndexValue) },
{ indexedSetCall()?.fillArrayAndIndexArguments(irArrayValue, indexedSetResolvedCall!!, ktExpressionToIrIndexValue) },
{ indexedGetCall()?.fillArguments(irArrayValue, indexedGetResolvedCall!!, ktExpressionToIrIndexValue, null) },
{ indexedSetCall()?.fillArguments(irArrayValue, indexedSetResolvedCall!!, ktExpressionToIrIndexValue, it) },
callGenerator.translateType(kotlinType),
startOffset, endOffset, origin
)
@@ -107,24 +108,22 @@ class ArrayAccessAssignmentReceiver(
override fun assign(value: IrExpression): IrExpression {
val call = indexedSetCall() ?: throw AssertionError("Array access without indexed-get call")
val ktExpressionToIrIndexExpression = ktIndexExpressions.zip(irIndexExpressions).toMap()
call.setExplicitReceiverValue(OnceExpressionValue(irArray))
callGenerator.statementGenerator.pregenerateValueArgumentsUsing(call, indexedSetResolvedCall!!) {
ktExpressionToIrIndexExpression[it]
}
call.lastArgument = value
val ktExpressionToIrIndexExpression = ktIndexExpressions.zip(irIndexExpressions.map { OnceExpressionValue(it) }).toMap()
call.fillArguments(OnceExpressionValue(irArray), indexedSetResolvedCall!!, ktExpressionToIrIndexExpression, value)
return callGenerator.generateCall(startOffset, endOffset, call, IrStatementOrigin.EQ)
}
private fun CallBuilder.fillArrayAndIndexArguments(
private fun CallBuilder.fillArguments(
arrayValue: IntermediateValue,
resolvedCall: ResolvedCall<FunctionDescriptor>,
ktExpressionToIrIndexValue: Map<KtExpression, IntermediateValue>
ktExpressionToIrIndexValue: Map<KtExpression, IntermediateValue>,
value: IrExpression?
) = apply {
setExplicitReceiverValue(arrayValue)
callGenerator.statementGenerator.pregenerateValueArgumentsUsing(this, resolvedCall) { ktExpression ->
ktExpressionToIrIndexValue[ktExpression]?.load()
}
value?.let { lastArgument = it }
callGenerator.statementGenerator.generateSamConversionForValueArgumentsIfRequired(this, resolvedCall.resultingDescriptor)
}
}
@@ -26,7 +26,7 @@ class LValueWithGetterAndSetterCalls(
val callGenerator: CallGenerator,
val descriptor: CallableDescriptor,
val getterCall: () -> CallBuilder?,
val setterCall: () -> CallBuilder?,
val setterCall: (IrExpression) -> CallBuilder?,
override val type: IrType,
val startOffset: Int,
val endOffset: Int,
@@ -39,8 +39,7 @@ class LValueWithGetterAndSetterCalls(
}
override fun store(irExpression: IrExpression): IrExpression {
val call = setterCall() ?: throw AssertionError("No setter call for $descriptor")
call.irValueArgumentsByIndex[call.argumentsCount - 1] = irExpression
val call = setterCall(irExpression) ?: throw AssertionError("No setter call for $descriptor")
return callGenerator.generateCall(startOffset, endOffset, call, origin)
}