PregeneratedCall -> CallBuilder
This commit is contained in:
committed by
Dmitry Petrov
parent
17758d8c00
commit
6830a7db43
@@ -96,7 +96,7 @@ fun StatementGenerator.generateValueArgument(valueArgument: ResolvedValueArgumen
|
|||||||
TODO("Unexpected valueArgument: ${valueArgument.javaClass.simpleName}")
|
TODO("Unexpected valueArgument: ${valueArgument.javaClass.simpleName}")
|
||||||
}
|
}
|
||||||
|
|
||||||
fun StatementGenerator.pregenerateCall(resolvedCall: ResolvedCall<*>): PregeneratedCall {
|
fun StatementGenerator.pregenerateCall(resolvedCall: ResolvedCall<*>): CallBuilder {
|
||||||
val call = pregenerateCallReceivers(resolvedCall)
|
val call = pregenerateCallReceivers(resolvedCall)
|
||||||
|
|
||||||
resolvedCall.valueArgumentsByIndex!!.forEachIndexed { index, valueArgument ->
|
resolvedCall.valueArgumentsByIndex!!.forEachIndexed { index, valueArgument ->
|
||||||
@@ -106,8 +106,8 @@ fun StatementGenerator.pregenerateCall(resolvedCall: ResolvedCall<*>): Pregenera
|
|||||||
return call
|
return call
|
||||||
}
|
}
|
||||||
|
|
||||||
fun StatementGenerator.pregenerateCallReceivers(resolvedCall: ResolvedCall<*>): PregeneratedCall {
|
fun StatementGenerator.pregenerateCallReceivers(resolvedCall: ResolvedCall<*>): CallBuilder {
|
||||||
val call = PregeneratedCall(resolvedCall)
|
val call = CallBuilder(resolvedCall)
|
||||||
|
|
||||||
val ktDefaultCallElement = resolvedCall.call.callElement
|
val ktDefaultCallElement = resolvedCall.call.callElement
|
||||||
call.callReceiver = generateCallReceiver(ktDefaultCallElement, resolvedCall.dispatchReceiver, resolvedCall.extensionReceiver, resolvedCall.call.isSafeCall())
|
call.callReceiver = generateCallReceiver(ktDefaultCallElement, resolvedCall.dispatchReceiver, resolvedCall.extensionReceiver, resolvedCall.call.isSafeCall())
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.ir.expressions.*
|
|||||||
import org.jetbrains.kotlin.psi.KtElement
|
import org.jetbrains.kotlin.psi.KtElement
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.endOffset
|
import org.jetbrains.kotlin.psi.psiUtil.endOffset
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.startOffset
|
import org.jetbrains.kotlin.psi.psiUtil.startOffset
|
||||||
import org.jetbrains.kotlin.psi2ir.intermediate.PregeneratedCall
|
import org.jetbrains.kotlin.psi2ir.intermediate.CallBuilder
|
||||||
import org.jetbrains.kotlin.psi2ir.intermediate.getValueArgumentsInParameterOrder
|
import org.jetbrains.kotlin.psi2ir.intermediate.getValueArgumentsInParameterOrder
|
||||||
import org.jetbrains.kotlin.psi2ir.intermediate.isValueArgumentReorderingRequired
|
import org.jetbrains.kotlin.psi2ir.intermediate.isValueArgumentReorderingRequired
|
||||||
import org.jetbrains.kotlin.psi2ir.intermediate.IntermediateValue
|
import org.jetbrains.kotlin.psi2ir.intermediate.IntermediateValue
|
||||||
@@ -42,7 +42,7 @@ class CallGenerator(
|
|||||||
fun generateCall(
|
fun generateCall(
|
||||||
startOffset: Int,
|
startOffset: Int,
|
||||||
endOffset: Int,
|
endOffset: Int,
|
||||||
call: PregeneratedCall,
|
call: CallBuilder,
|
||||||
operator: IrOperator? = null
|
operator: IrOperator? = null
|
||||||
): IrExpression {
|
): IrExpression {
|
||||||
val descriptor = call.descriptor
|
val descriptor = call.descriptor
|
||||||
@@ -61,7 +61,7 @@ class CallGenerator(
|
|||||||
descriptor: PropertyDescriptor,
|
descriptor: PropertyDescriptor,
|
||||||
startOffset: Int,
|
startOffset: Int,
|
||||||
endOffset: Int,
|
endOffset: Int,
|
||||||
call: PregeneratedCall
|
call: CallBuilder
|
||||||
): IrExpression {
|
): IrExpression {
|
||||||
return call.callReceiver.call { dispatchReceiverValue, extensionReceiverValue ->
|
return call.callReceiver.call { dispatchReceiverValue, extensionReceiverValue ->
|
||||||
IrGetterCallImpl(startOffset, endOffset, descriptor.getter!!,
|
IrGetterCallImpl(startOffset, endOffset, descriptor.getter!!,
|
||||||
@@ -76,7 +76,7 @@ class CallGenerator(
|
|||||||
startOffset: Int,
|
startOffset: Int,
|
||||||
endOffset: Int,
|
endOffset: Int,
|
||||||
operator: IrOperator?,
|
operator: IrOperator?,
|
||||||
call: PregeneratedCall
|
call: CallBuilder
|
||||||
): IrExpression {
|
): IrExpression {
|
||||||
val returnType = descriptor.returnType
|
val returnType = descriptor.returnType
|
||||||
|
|
||||||
@@ -105,7 +105,7 @@ class CallGenerator(
|
|||||||
irCall: IrCall,
|
irCall: IrCall,
|
||||||
startOffset: Int,
|
startOffset: Int,
|
||||||
endOffset: Int,
|
endOffset: Int,
|
||||||
call: PregeneratedCall,
|
call: CallBuilder,
|
||||||
resultType: KotlinType?
|
resultType: KotlinType?
|
||||||
): IrExpression {
|
): IrExpression {
|
||||||
val resolvedCall = call.original
|
val resolvedCall = call.original
|
||||||
@@ -141,8 +141,8 @@ class CallGenerator(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun CallGenerator.generateCall(ktElement: KtElement, call: PregeneratedCall, operator: IrOperator? = null) =
|
fun CallGenerator.generateCall(ktElement: KtElement, call: CallBuilder, operator: IrOperator? = null) =
|
||||||
generateCall(ktElement.startOffset, ktElement.endOffset, call, operator)
|
generateCall(ktElement.startOffset, ktElement.endOffset, call, operator)
|
||||||
|
|
||||||
fun CallGenerator.generateCall(irExpression: IrExpression, call: PregeneratedCall, operator: IrOperator? = null) =
|
fun CallGenerator.generateCall(irExpression: IrExpression, call: CallBuilder, operator: IrOperator? = null) =
|
||||||
generateCall(irExpression.startOffset, irExpression.endOffset, call, operator)
|
generateCall(irExpression.startOffset, irExpression.endOffset, call, operator)
|
||||||
|
|||||||
+3
-3
@@ -24,8 +24,8 @@ import java.lang.AssertionError
|
|||||||
class ArrayAccessAssignmentReceiver(
|
class ArrayAccessAssignmentReceiver(
|
||||||
val irArray: IrExpression,
|
val irArray: IrExpression,
|
||||||
val irIndices: List<IrExpression>,
|
val irIndices: List<IrExpression>,
|
||||||
val indexedGetCall: PregeneratedCall?,
|
val indexedGetCall: CallBuilder?,
|
||||||
val indexedSetCall: PregeneratedCall?,
|
val indexedSetCall: CallBuilder?,
|
||||||
val callGenerator: CallGenerator,
|
val callGenerator: CallGenerator,
|
||||||
val startOffset: Int,
|
val startOffset: Int,
|
||||||
val endOffset: Int,
|
val endOffset: Int,
|
||||||
@@ -54,7 +54,7 @@ class ArrayAccessAssignmentReceiver(
|
|||||||
return irBlock
|
return irBlock
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun PregeneratedCall.fillArrayAndIndexArguments(arrayValue: IntermediateValue, indexValues: List<IntermediateValue>) {
|
private fun CallBuilder.fillArrayAndIndexArguments(arrayValue: IntermediateValue, indexValues: List<IntermediateValue>) {
|
||||||
setExplicitReceiverValue(arrayValue)
|
setExplicitReceiverValue(arrayValue)
|
||||||
indexValues.forEachIndexed { i, irIndexValue ->
|
indexValues.forEachIndexed { i, irIndexValue ->
|
||||||
irValueArgumentsByIndex[i] = irIndexValue.load()
|
irValueArgumentsByIndex[i] = irIndexValue.load()
|
||||||
|
|||||||
+11
-11
@@ -25,7 +25,7 @@ import org.jetbrains.kotlin.psi2ir.isValueArgumentReorderingRequired
|
|||||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
|
|
||||||
class PregeneratedCall(val original: ResolvedCall<*>) {
|
class CallBuilder(val original: ResolvedCall<*>) {
|
||||||
val descriptor: CallableDescriptor = original.resultingDescriptor
|
val descriptor: CallableDescriptor = original.resultingDescriptor
|
||||||
|
|
||||||
var superQualifier: ClassDescriptor? = null
|
var superQualifier: ClassDescriptor? = null
|
||||||
@@ -38,34 +38,34 @@ class PregeneratedCall(val original: ResolvedCall<*>) {
|
|||||||
irValueArgumentsByIndex[valueParameterDescriptor.index]
|
irValueArgumentsByIndex[valueParameterDescriptor.index]
|
||||||
}
|
}
|
||||||
|
|
||||||
val PregeneratedCall.argumentsCount: Int get() =
|
val CallBuilder.argumentsCount: Int get() =
|
||||||
irValueArgumentsByIndex.size
|
irValueArgumentsByIndex.size
|
||||||
|
|
||||||
fun PregeneratedCall.getValueArgumentsInParameterOrder(): List<IrExpression?> =
|
fun CallBuilder.getValueArgumentsInParameterOrder(): List<IrExpression?> =
|
||||||
descriptor.valueParameters.map { irValueArgumentsByIndex[it.index] }
|
descriptor.valueParameters.map { irValueArgumentsByIndex[it.index] }
|
||||||
|
|
||||||
fun PregeneratedCall.isValueArgumentReorderingRequired() =
|
fun CallBuilder.isValueArgumentReorderingRequired() =
|
||||||
original.isValueArgumentReorderingRequired()
|
original.isValueArgumentReorderingRequired()
|
||||||
|
|
||||||
val PregeneratedCall.hasExtensionReceiver: Boolean get() =
|
val CallBuilder.hasExtensionReceiver: Boolean get() =
|
||||||
descriptor.extensionReceiverParameter != null
|
descriptor.extensionReceiverParameter != null
|
||||||
|
|
||||||
val PregeneratedCall.hasDispatchReceiver: Boolean get() =
|
val CallBuilder.hasDispatchReceiver: Boolean get() =
|
||||||
descriptor.dispatchReceiverParameter != null
|
descriptor.dispatchReceiverParameter != null
|
||||||
|
|
||||||
val PregeneratedCall.extensionReceiverType: KotlinType? get() =
|
val CallBuilder.extensionReceiverType: KotlinType? get() =
|
||||||
descriptor.extensionReceiverParameter?.type
|
descriptor.extensionReceiverParameter?.type
|
||||||
|
|
||||||
val PregeneratedCall.dispatchReceiverType: KotlinType? get() =
|
val CallBuilder.dispatchReceiverType: KotlinType? get() =
|
||||||
descriptor.dispatchReceiverParameter?.type
|
descriptor.dispatchReceiverParameter?.type
|
||||||
|
|
||||||
val PregeneratedCall.explicitReceiverParameter: ReceiverParameterDescriptor? get() =
|
val CallBuilder.explicitReceiverParameter: ReceiverParameterDescriptor? get() =
|
||||||
descriptor.extensionReceiverParameter ?: descriptor.dispatchReceiverParameter
|
descriptor.extensionReceiverParameter ?: descriptor.dispatchReceiverParameter
|
||||||
|
|
||||||
val PregeneratedCall.explicitReceiverType: KotlinType? get() =
|
val CallBuilder.explicitReceiverType: KotlinType? get() =
|
||||||
explicitReceiverParameter?.type
|
explicitReceiverParameter?.type
|
||||||
|
|
||||||
fun PregeneratedCall.setExplicitReceiverValue(explicitReceiverValue: IntermediateValue) {
|
fun CallBuilder.setExplicitReceiverValue(explicitReceiverValue: IntermediateValue) {
|
||||||
val previousCallReceiver = callReceiver
|
val previousCallReceiver = callReceiver
|
||||||
callReceiver = object : CallReceiver {
|
callReceiver = object : CallReceiver {
|
||||||
override fun call(withDispatchAndExtensionReceivers: (IntermediateValue?, IntermediateValue?) -> IrExpression): IrExpression {
|
override fun call(withDispatchAndExtensionReceivers: (IntermediateValue?, IntermediateValue?) -> IrExpression): IrExpression {
|
||||||
+3
-3
@@ -20,14 +20,14 @@ import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
|||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrOperator
|
import org.jetbrains.kotlin.ir.expressions.IrOperator
|
||||||
import org.jetbrains.kotlin.psi2ir.generators.CallGenerator
|
import org.jetbrains.kotlin.psi2ir.generators.CallGenerator
|
||||||
import org.jetbrains.kotlin.psi2ir.intermediate.PregeneratedCall
|
import org.jetbrains.kotlin.psi2ir.intermediate.CallBuilder
|
||||||
import org.jetbrains.kotlin.psi2ir.intermediate.argumentsCount
|
import org.jetbrains.kotlin.psi2ir.intermediate.argumentsCount
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
|
|
||||||
class LValueWithGetterAndSetterCalls(
|
class LValueWithGetterAndSetterCalls(
|
||||||
val callGenerator: CallGenerator,
|
val callGenerator: CallGenerator,
|
||||||
val getterCall: PregeneratedCall?,
|
val getterCall: CallBuilder?,
|
||||||
val setterCall: PregeneratedCall?,
|
val setterCall: CallBuilder?,
|
||||||
val startOffset: Int,
|
val startOffset: Int,
|
||||||
val endOffset: Int,
|
val endOffset: Int,
|
||||||
val operator: IrOperator? = null
|
val operator: IrOperator? = null
|
||||||
|
|||||||
@@ -20,12 +20,12 @@ import org.jetbrains.kotlin.ir.expressions.IrExpression
|
|||||||
import org.jetbrains.kotlin.ir.expressions.IrOperator
|
import org.jetbrains.kotlin.ir.expressions.IrOperator
|
||||||
import org.jetbrains.kotlin.psi2ir.generators.CallGenerator
|
import org.jetbrains.kotlin.psi2ir.generators.CallGenerator
|
||||||
import org.jetbrains.kotlin.psi2ir.generators.StatementGenerator
|
import org.jetbrains.kotlin.psi2ir.generators.StatementGenerator
|
||||||
import org.jetbrains.kotlin.psi2ir.intermediate.PregeneratedCall
|
import org.jetbrains.kotlin.psi2ir.intermediate.CallBuilder
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
|
|
||||||
class OnceCallValue(
|
class OnceCallValue(
|
||||||
val statementGenerator: StatementGenerator,
|
val statementGenerator: StatementGenerator,
|
||||||
val call: PregeneratedCall,
|
val call: CallBuilder,
|
||||||
val startOffset: Int,
|
val startOffset: Int,
|
||||||
val endOffset: Int,
|
val endOffset: Int,
|
||||||
val operator: IrOperator? = null
|
val operator: IrOperator? = null
|
||||||
|
|||||||
Reference in New Issue
Block a user