[IR] Move irCall from JS backend to common utils
This commit is contained in:
@@ -270,68 +270,3 @@ fun IrClass.simpleFunctions(): List<IrSimpleFunction> = this.declarations.flatMa
|
|||||||
else -> emptyList()
|
else -> emptyList()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO extract to common place?
|
|
||||||
|
|
||||||
fun irCall(
|
|
||||||
call: IrCall,
|
|
||||||
newFunction: IrFunction,
|
|
||||||
dispatchReceiverAsFirstArgument: Boolean = false,
|
|
||||||
firstArgumentAsDispatchReceiver: Boolean = false
|
|
||||||
): IrCall =
|
|
||||||
irCall(call, newFunction.symbol, dispatchReceiverAsFirstArgument, firstArgumentAsDispatchReceiver)
|
|
||||||
|
|
||||||
|
|
||||||
fun irCall(
|
|
||||||
call: IrCall,
|
|
||||||
newSymbol: IrFunctionSymbol,
|
|
||||||
dispatchReceiverAsFirstArgument: Boolean = false,
|
|
||||||
firstArgumentAsDispatchReceiver: Boolean = false
|
|
||||||
): IrCall =
|
|
||||||
call.run {
|
|
||||||
IrCallImpl(
|
|
||||||
startOffset,
|
|
||||||
endOffset,
|
|
||||||
type,
|
|
||||||
newSymbol,
|
|
||||||
newSymbol.descriptor,
|
|
||||||
typeArgumentsCount,
|
|
||||||
origin
|
|
||||||
).apply {
|
|
||||||
copyTypeAndValueArgumentsFrom(
|
|
||||||
call,
|
|
||||||
dispatchReceiverAsFirstArgument,
|
|
||||||
firstArgumentAsDispatchReceiver
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO extract to common place?
|
|
||||||
private fun IrCall.copyTypeAndValueArgumentsFrom(
|
|
||||||
call: IrCall,
|
|
||||||
dispatchReceiverAsFirstArgument: Boolean = false,
|
|
||||||
firstArgumentAsDispatchReceiver: Boolean = false
|
|
||||||
) {
|
|
||||||
copyTypeArgumentsFrom(call)
|
|
||||||
|
|
||||||
var toValueArgumentIndex = 0
|
|
||||||
var fromValueArgumentIndex = 0
|
|
||||||
|
|
||||||
when {
|
|
||||||
dispatchReceiverAsFirstArgument -> {
|
|
||||||
putValueArgument(toValueArgumentIndex++, call.dispatchReceiver)
|
|
||||||
}
|
|
||||||
firstArgumentAsDispatchReceiver -> {
|
|
||||||
dispatchReceiver = call.getValueArgument(fromValueArgumentIndex++)
|
|
||||||
}
|
|
||||||
else -> {
|
|
||||||
dispatchReceiver = call.dispatchReceiver
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extensionReceiver = call.extensionReceiver
|
|
||||||
|
|
||||||
while (fromValueArgumentIndex < call.valueArgumentsCount) {
|
|
||||||
putValueArgument(toValueArgumentIndex++, call.getValueArgument(fromValueArgumentIndex++))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+1
-1
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.ir.backend.js.lower
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.backend.common.FileLoweringPass
|
import org.jetbrains.kotlin.backend.common.FileLoweringPass
|
||||||
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
|
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
|
||||||
import org.jetbrains.kotlin.ir.backend.js.ir.irCall
|
import org.jetbrains.kotlin.ir.util.irCall
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrConstructor
|
import org.jetbrains.kotlin.ir.declarations.IrConstructor
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrCall
|
import org.jetbrains.kotlin.ir.expressions.IrCall
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.ir.backend.js.lower.calls
|
package org.jetbrains.kotlin.ir.backend.js.lower.calls
|
||||||
|
|
||||||
import org.jetbrains.kotlin.ir.backend.js.ir.irCall
|
import org.jetbrains.kotlin.ir.util.irCall
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrCall
|
import org.jetbrains.kotlin.ir.expressions.IrCall
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
|
|||||||
+1
-1
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.ir.backend.js.lower.calls
|
|||||||
import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor
|
import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor
|
||||||
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
|
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
|
||||||
import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
|
import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
|
||||||
import org.jetbrains.kotlin.ir.backend.js.ir.irCall
|
import org.jetbrains.kotlin.ir.util.irCall
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrCall
|
import org.jetbrains.kotlin.ir.expressions.IrCall
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin.*
|
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin.*
|
||||||
|
|||||||
+1
-2
@@ -5,9 +5,8 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.ir.backend.js.lower.calls
|
package org.jetbrains.kotlin.ir.backend.js.lower.calls
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.common.ir.isStatic
|
|
||||||
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
|
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
|
||||||
import org.jetbrains.kotlin.ir.backend.js.ir.irCall
|
import org.jetbrains.kotlin.ir.util.irCall
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
||||||
import org.jetbrains.kotlin.ir.declarations.isStaticMethodOfClass
|
import org.jetbrains.kotlin.ir.declarations.isStaticMethodOfClass
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrCall
|
import org.jetbrains.kotlin.ir.expressions.IrCall
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.ir.backend.js.lower.calls
|
package org.jetbrains.kotlin.ir.backend.js.lower.calls
|
||||||
|
|
||||||
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
|
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
|
||||||
import org.jetbrains.kotlin.ir.backend.js.ir.irCall
|
import org.jetbrains.kotlin.ir.util.irCall
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrCall
|
import org.jetbrains.kotlin.ir.expressions.IrCall
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.ir.backend.js.lower.calls
|
package org.jetbrains.kotlin.ir.backend.js.lower.calls
|
||||||
|
|
||||||
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
|
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
|
||||||
import org.jetbrains.kotlin.ir.backend.js.ir.irCall
|
import org.jetbrains.kotlin.ir.util.irCall
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrCall
|
import org.jetbrains.kotlin.ir.expressions.IrCall
|
||||||
import org.jetbrains.kotlin.ir.util.kotlinPackageFqn
|
import org.jetbrains.kotlin.ir.util.kotlinPackageFqn
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.ir.backend.js.lower.calls
|
package org.jetbrains.kotlin.ir.backend.js.lower.calls
|
||||||
|
|
||||||
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
|
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
|
||||||
import org.jetbrains.kotlin.ir.backend.js.ir.irCall
|
import org.jetbrains.kotlin.ir.util.irCall
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrCall
|
import org.jetbrains.kotlin.ir.expressions.IrCall
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
import org.jetbrains.kotlin.ir.types.IrDynamicType
|
import org.jetbrains.kotlin.ir.types.IrDynamicType
|
||||||
|
|||||||
+1
-10
@@ -7,18 +7,9 @@ package org.jetbrains.kotlin.ir.backend.js.lower.calls
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
|
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
|
||||||
import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
|
import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
|
||||||
import org.jetbrains.kotlin.ir.backend.js.ir.irCall
|
|
||||||
import org.jetbrains.kotlin.ir.backend.js.utils.ConversionNames
|
import org.jetbrains.kotlin.ir.backend.js.utils.ConversionNames
|
||||||
import org.jetbrains.kotlin.ir.backend.js.utils.OperatorNames
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrCall
|
import org.jetbrains.kotlin.ir.expressions.IrCall
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
|
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
|
||||||
import org.jetbrains.kotlin.ir.types.*
|
|
||||||
import org.jetbrains.kotlin.ir.util.constructors
|
|
||||||
import org.jetbrains.kotlin.name.Name
|
|
||||||
|
|
||||||
class NumberConversionCallsTransformer(context: JsIrBackendContext) : CallsTransformer {
|
class NumberConversionCallsTransformer(context: JsIrBackendContext) : CallsTransformer {
|
||||||
private val intrinsics = context.intrinsics
|
private val intrinsics = context.intrinsics
|
||||||
@@ -99,4 +90,4 @@ class NumberConversionCallsTransformer(context: JsIrBackendContext) : CallsTrans
|
|||||||
private fun useDispatchReceiver(call: IrCall): IrExpression {
|
private fun useDispatchReceiver(call: IrCall): IrExpression {
|
||||||
return JsIrBuilder.buildImplicitCast(call.dispatchReceiver!!, call.type)
|
return JsIrBuilder.buildImplicitCast(call.dispatchReceiver!!, call.type)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.ir.backend.js.lower.calls
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
|
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
|
||||||
import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
|
import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
|
||||||
import org.jetbrains.kotlin.ir.backend.js.ir.irCall
|
import org.jetbrains.kotlin.ir.util.irCall
|
||||||
import org.jetbrains.kotlin.ir.backend.js.utils.OperatorNames
|
import org.jetbrains.kotlin.ir.backend.js.utils.OperatorNames
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrCall
|
import org.jetbrains.kotlin.ir.expressions.IrCall
|
||||||
@@ -235,4 +235,4 @@ class NumberOperatorCallsTransformer(context: JsIrBackendContext) : CallsTransfo
|
|||||||
putValueArgument(0, e)
|
putValueArgument(0, e)
|
||||||
putValueArgument(1, buildInt(0))
|
putValueArgument(1, buildInt(0))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.ir.backend.js.lower.calls
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.backend.common.utils.isSubtypeOfClass
|
import org.jetbrains.kotlin.backend.common.utils.isSubtypeOfClass
|
||||||
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
|
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
|
||||||
import org.jetbrains.kotlin.ir.backend.js.ir.irCall
|
import org.jetbrains.kotlin.ir.util.irCall
|
||||||
import org.jetbrains.kotlin.ir.backend.js.utils.Namer
|
import org.jetbrains.kotlin.ir.backend.js.utils.Namer
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrCall
|
import org.jetbrains.kotlin.ir.expressions.IrCall
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
|
|||||||
+1
-1
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.backend.common.isBuiltInIntercepted
|
|||||||
import org.jetbrains.kotlin.backend.common.isBuiltInSuspendCoroutineUninterceptedOrReturn
|
import org.jetbrains.kotlin.backend.common.isBuiltInSuspendCoroutineUninterceptedOrReturn
|
||||||
import org.jetbrains.kotlin.config.languageVersionSettings
|
import org.jetbrains.kotlin.config.languageVersionSettings
|
||||||
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
|
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
|
||||||
import org.jetbrains.kotlin.ir.backend.js.ir.irCall
|
import org.jetbrains.kotlin.ir.util.irCall
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrCall
|
import org.jetbrains.kotlin.ir.expressions.IrCall
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.ir.declarations.impl.IrFieldImpl
|
|||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrTypeParameterImpl
|
import org.jetbrains.kotlin.ir.declarations.impl.IrTypeParameterImpl
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl
|
import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl
|
||||||
import org.jetbrains.kotlin.ir.expressions.*
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
|
||||||
import org.jetbrains.kotlin.ir.symbols.*
|
import org.jetbrains.kotlin.ir.symbols.*
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrTypeParameterSymbolImpl
|
import org.jetbrains.kotlin.ir.symbols.impl.IrTypeParameterSymbolImpl
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
|
import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
|
||||||
@@ -481,3 +482,69 @@ fun ReferenceSymbolTable.referenceFunction(callable: CallableDescriptor): IrFunc
|
|||||||
else ->
|
else ->
|
||||||
throw IllegalArgumentException("Unexpected callable descriptor: $callable")
|
throw IllegalArgumentException("Unexpected callable descriptor: $callable")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create new call based on given [call] and [newFunction]
|
||||||
|
* [dispatchReceiverAsFirstArgument]: optionally convert call with dispatch receiver to static call
|
||||||
|
* [firstArgumentAsDispatchReceiver]: optionally convert static call to call with dispatch receiver
|
||||||
|
*/
|
||||||
|
fun irCall(
|
||||||
|
call: IrMemberAccessExpression,
|
||||||
|
newFunction: IrFunction,
|
||||||
|
dispatchReceiverAsFirstArgument: Boolean = false,
|
||||||
|
firstArgumentAsDispatchReceiver: Boolean = false
|
||||||
|
): IrCall =
|
||||||
|
irCall(call, newFunction.symbol, dispatchReceiverAsFirstArgument, firstArgumentAsDispatchReceiver)
|
||||||
|
|
||||||
|
fun irCall(
|
||||||
|
call: IrMemberAccessExpression,
|
||||||
|
newSymbol: IrFunctionSymbol,
|
||||||
|
dispatchReceiverAsFirstArgument: Boolean = false,
|
||||||
|
firstArgumentAsDispatchReceiver: Boolean = false
|
||||||
|
): IrCall =
|
||||||
|
call.run {
|
||||||
|
IrCallImpl(
|
||||||
|
startOffset,
|
||||||
|
endOffset,
|
||||||
|
type,
|
||||||
|
newSymbol,
|
||||||
|
newSymbol.descriptor,
|
||||||
|
typeArgumentsCount,
|
||||||
|
origin
|
||||||
|
).apply {
|
||||||
|
copyTypeAndValueArgumentsFrom(
|
||||||
|
call,
|
||||||
|
dispatchReceiverAsFirstArgument,
|
||||||
|
firstArgumentAsDispatchReceiver
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun IrCall.copyTypeAndValueArgumentsFrom(
|
||||||
|
call: IrMemberAccessExpression,
|
||||||
|
dispatchReceiverAsFirstArgument: Boolean = false,
|
||||||
|
firstArgumentAsDispatchReceiver: Boolean = false
|
||||||
|
) {
|
||||||
|
copyTypeArgumentsFrom(call)
|
||||||
|
|
||||||
|
var toValueArgumentIndex = 0
|
||||||
|
var fromValueArgumentIndex = 0
|
||||||
|
|
||||||
|
when {
|
||||||
|
dispatchReceiverAsFirstArgument -> {
|
||||||
|
putValueArgument(toValueArgumentIndex++, call.dispatchReceiver)
|
||||||
|
}
|
||||||
|
firstArgumentAsDispatchReceiver -> {
|
||||||
|
dispatchReceiver = call.getValueArgument(fromValueArgumentIndex++)
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
dispatchReceiver = call.dispatchReceiver
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extensionReceiver = call.extensionReceiver
|
||||||
|
|
||||||
|
while (fromValueArgumentIndex < call.valueArgumentsCount) {
|
||||||
|
putValueArgument(toValueArgumentIndex++, call.getValueArgument(fromValueArgumentIndex++))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user