[IR] Remove FunctionDescriptor from IrCall-like node's constructor interface

This commit is contained in:
Roman Artemev
2019-10-22 16:38:57 +03:00
committed by romanart
parent bf367003f9
commit ba373c67d7
42 changed files with 90 additions and 190 deletions
@@ -680,8 +680,7 @@ class Fir2IrVisitor(
when { when {
symbol is IrConstructorSymbol -> IrConstructorCallImpl.fromSymbolOwner(startOffset, endOffset, type, symbol) symbol is IrConstructorSymbol -> IrConstructorCallImpl.fromSymbolOwner(startOffset, endOffset, type, symbol)
symbol is IrSimpleFunctionSymbol -> IrCallImpl( symbol is IrSimpleFunctionSymbol -> IrCallImpl(
startOffset, endOffset, type, symbol, symbol.descriptor, startOffset, endOffset, type, symbol, origin = calleeReference.statementOrigin()
origin = calleeReference.statementOrigin()
) )
symbol is IrPropertySymbol && symbol.isBound -> { symbol is IrPropertySymbol && symbol.isBound -> {
val getter = symbol.owner.getter val getter = symbol.owner.getter
@@ -827,7 +826,7 @@ class Fir2IrVisitor(
is IrFunctionSymbol -> { is IrFunctionSymbol -> {
IrFunctionReferenceImpl( IrFunctionReferenceImpl(
startOffset, endOffset, type, symbol, startOffset, endOffset, type, symbol,
symbol.descriptor, 0 0
) )
} }
else -> { else -> {
@@ -904,7 +903,7 @@ class Fir2IrVisitor(
listOf( listOf(
anonymousClass, anonymousClass,
IrConstructorCallImpl.fromSymbolOwner( IrConstructorCallImpl.fromSymbolOwner(
startOffset, endOffset, anonymousClassType, anonymousClass.constructors.first().symbol startOffset, endOffset, anonymousClassType, anonymousClass.constructors.first().symbol, anonymousClass.typeParameters.size
) )
) )
) )
@@ -86,8 +86,8 @@ fun IrClass.addSimpleDelegatingConstructor(
listOf( listOf(
IrDelegatingConstructorCallImpl( IrDelegatingConstructorCallImpl(
startOffset, endOffset, irBuiltIns.unitType, startOffset, endOffset, irBuiltIns.unitType,
superConstructor.symbol, superConstructor.descriptor, superConstructor.symbol, 0,
0, superConstructor.valueParameters.size superConstructor.valueParameters.size
).apply { ).apply {
constructor.valueParameters.forEachIndexed { idx, parameter -> constructor.valueParameters.forEachIndexed { idx, parameter ->
putValueArgument(idx, IrGetValueImpl(startOffset, endOffset, parameter.type, parameter.symbol)) putValueArgument(idx, IrGetValueImpl(startOffset, endOffset, parameter.type, parameter.symbol))
@@ -129,7 +129,7 @@ open class DefaultArgumentStubGenerator(
startOffset = irFunction.startOffset, startOffset = irFunction.startOffset,
endOffset = irFunction.endOffset, endOffset = irFunction.endOffset,
type = context.irBuiltIns.unitType, type = context.irBuiltIns.unitType,
symbol = irFunction.symbol, descriptor = irFunction.symbol.descriptor, symbol = irFunction.symbol,
typeArgumentsCount = newIrFunction.parentAsClass.typeParameters.size + newIrFunction.typeParameters.size typeArgumentsCount = newIrFunction.parentAsClass.typeParameters.size + newIrFunction.typeParameters.size
).apply { ).apply {
passTypeArgumentsFrom(newIrFunction.parentAsClass) passTypeArgumentsFrom(newIrFunction.parentAsClass)
@@ -269,7 +269,6 @@ open class DefaultParameterInjector(
endOffset = expression.endOffset, endOffset = expression.endOffset,
type = context.irBuiltIns.unitType, type = context.irBuiltIns.unitType,
symbol = it as IrConstructorSymbol, symbol = it as IrConstructorSymbol,
descriptor = it.descriptor,
typeArgumentsCount = expression.typeArgumentsCount typeArgumentsCount = expression.typeArgumentsCount
) )
} }
@@ -311,7 +310,6 @@ open class DefaultParameterInjector(
endOffset = expression.endOffset, endOffset = expression.endOffset,
type = expression.type, type = expression.type,
symbol = it, symbol = it,
descriptor = it.descriptor,
typeArgumentsCount = expression.typeArgumentsCount, typeArgumentsCount = expression.typeArgumentsCount,
origin = DEFAULT_DISPATCH_CALL, origin = DEFAULT_DISPATCH_CALL,
superQualifierSymbol = expression.superQualifierSymbol superQualifierSymbol = expression.superQualifierSymbol
@@ -150,8 +150,7 @@ class InnerClassConstructorCallsLowering(val context: BackendContext) : FileLowe
val newCallee = context.declarationFactory.getInnerClassConstructorWithOuterThisParameter(classConstructor) val newCallee = context.declarationFactory.getInnerClassConstructorWithOuterThisParameter(classConstructor)
val newCall = IrDelegatingConstructorCallImpl( val newCall = IrDelegatingConstructorCallImpl(
expression.startOffset, expression.endOffset, context.irBuiltIns.unitType, newCallee.symbol, newCallee.descriptor, expression.startOffset, expression.endOffset, context.irBuiltIns.unitType, newCallee.symbol, expression.typeArgumentsCount
expression.typeArgumentsCount
).apply { copyTypeArgumentsFrom(expression) } ).apply { copyTypeArgumentsFrom(expression) }
newCall.putValueArgument(0, dispatchReceiver) newCall.putValueArgument(0, dispatchReceiver)
@@ -177,7 +176,6 @@ class InnerClassConstructorCallsLowering(val context: BackendContext) : FileLowe
endOffset, endOffset,
type, type,
newCallee.symbol, newCallee.symbol,
newCallee.descriptor,
typeArgumentsCount, typeArgumentsCount,
origin origin
) )
@@ -283,7 +283,6 @@ class LocalDeclarationsLowering(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
context.irBuiltIns.unitType, context.irBuiltIns.unitType,
newCallee.symbol, newCallee.symbol,
newCallee.descriptor,
expression.typeArgumentsCount expression.typeArgumentsCount
).also { ).also {
it.fillArguments2(expression, newCallee) it.fillArguments2(expression, newCallee)
@@ -341,7 +340,6 @@ class LocalDeclarationsLowering(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
expression.type, // TODO functional type for transformed descriptor expression.type, // TODO functional type for transformed descriptor
newCallee.symbol, newCallee.symbol,
newCallee.descriptor,
expression.typeArgumentsCount, expression.typeArgumentsCount,
expression.origin expression.origin
).also { ).also {
@@ -440,9 +438,9 @@ class LocalDeclarationsLowering(
oldCall.startOffset, oldCall.endOffset, oldCall.startOffset, oldCall.endOffset,
newCallee.returnType, newCallee.returnType,
newCallee.symbol, newCallee.symbol,
newCallee.descriptor,
oldCall.typeArgumentsCount, oldCall.typeArgumentsCount,
oldCall.origin, oldCall.superQualifierSymbol oldCall.origin,
oldCall.superQualifierSymbol
).also { ).also {
it.copyTypeArgumentsFrom(oldCall) it.copyTypeArgumentsFrom(oldCall)
} }
@@ -37,8 +37,7 @@ class ProvisionalFunctionExpressionLowering :
function, function,
IrFunctionReferenceImpl( IrFunctionReferenceImpl(
startOffset, endOffset, type, startOffset, endOffset, type,
function.symbol, function.descriptor, 0, function.symbol, 0, origin
origin
) )
) )
) )
@@ -44,7 +44,7 @@ internal fun IrExpression.negate(): IrExpression {
it.name == OperatorNameConventions.UNARY_MINUS && it.name == OperatorNameConventions.UNARY_MINUS &&
it.valueParameters.isEmpty() it.valueParameters.isEmpty()
} }
IrCallImpl(startOffset, endOffset, type, unaryMinusFun.symbol, unaryMinusFun.descriptor).apply { IrCallImpl(startOffset, endOffset, type, unaryMinusFun.symbol).apply {
dispatchReceiver = this@negate dispatchReceiver = this@negate
} }
} }
@@ -62,7 +62,7 @@ internal fun IrExpression.decrement(): IrExpression {
it.name == OperatorNameConventions.DEC && it.name == OperatorNameConventions.DEC &&
it.valueParameters.isEmpty() it.valueParameters.isEmpty()
} }
IrCallImpl(startOffset, endOffset, type, decFun.symbol, decFun.descriptor).apply { IrCallImpl(startOffset, endOffset, type, decFun.symbol).apply {
dispatchReceiver = this@decrement dispatchReceiver = this@decrement
} }
} }
@@ -32,7 +32,6 @@ object JsIrBuilder {
UNDEFINED_OFFSET, UNDEFINED_OFFSET,
type ?: target.owner.returnType, type ?: target.owner.returnType,
target, target,
target.descriptor,
target.descriptor.typeParametersCount, target.descriptor.typeParametersCount,
SYNTHESIZED_STATEMENT SYNTHESIZED_STATEMENT
).apply { ).apply {
@@ -186,7 +185,7 @@ object JsIrBuilder {
IrCompositeImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, SYNTHESIZED_STATEMENT, statements) IrCompositeImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, SYNTHESIZED_STATEMENT, statements)
fun buildFunctionReference(type: IrType, symbol: IrFunctionSymbol) = fun buildFunctionReference(type: IrType, symbol: IrFunctionSymbol) =
IrFunctionReferenceImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, symbol, symbol.descriptor, 0, null) IrFunctionReferenceImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, symbol, 0, null)
fun buildVar( fun buildVar(
type: IrType, type: IrType,
@@ -92,7 +92,6 @@ class CallableReferenceLowering(val context: JsIrBackendContext) : FileLoweringP
callable.startOffset, callable.endOffset, callable.startOffset, callable.endOffset,
newTarget.symbol.owner.returnType, newTarget.symbol.owner.returnType,
newTarget.symbol, newTarget.symbol,
newTarget.symbol.descriptor,
callable.origin callable.origin
).apply { ).apply {
copyTypeArgumentsFrom(callable) copyTypeArgumentsFrom(callable)
@@ -79,7 +79,6 @@ class JsDefaultCallbackGenerator(val context: JsIrBackendContext): BodyLoweringP
endOffset, endOffset,
context.irBuiltIns.anyType, context.irBuiltIns.anyType,
originalFunction.symbol, originalFunction.symbol,
originalFunction.descriptor,
0, 0,
BIND_CALL BIND_CALL
) )
@@ -91,7 +90,6 @@ class JsDefaultCallbackGenerator(val context: JsIrBackendContext): BodyLoweringP
endOffset, endOffset,
context.irBuiltIns.anyType, context.irBuiltIns.anyType,
context.intrinsics.jsBind.symbol, context.intrinsics.jsBind.symbol,
context.intrinsics.jsBind.descriptor,
BIND_CALL, BIND_CALL,
superQualifierSymbol superQualifierSymbol
) )
@@ -82,9 +82,8 @@ class PrivateMembersLowering(val context: JsIrBackendContext) : FileLoweringPass
IrFunctionReferenceImpl( IrFunctionReferenceImpl(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
expression.type, expression.type,
it.symbol, it.descriptor, it.symbol, expression.typeArgumentsCount,
expression.typeArgumentsCount, expression.valueArgumentsCount, expression.valueArgumentsCount, expression.origin
expression.origin
) )
} }
} ?: expression } ?: expression
@@ -113,8 +112,7 @@ class PrivateMembersLowering(val context: JsIrBackendContext) : FileLoweringPass
val newExpression = IrCallImpl( val newExpression = IrCallImpl(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
expression.type, expression.type,
staticTarget.symbol, staticTarget.descriptor, staticTarget.symbol, expression.typeArgumentsCount,
expression.typeArgumentsCount,
expression.origin, expression.origin,
expression.superQualifierSymbol expression.superQualifierSymbol
) )
@@ -75,7 +75,6 @@ private class ScriptRemoveReceiverLowering(val context: CommonBackendContext) :
type.annotations type.annotations
), ),
symbol, symbol,
descriptor,
typeArgumentsCount, typeArgumentsCount,
valueArgumentsCount, valueArgumentsCount,
origin origin
@@ -111,7 +110,6 @@ private class ScriptRemoveReceiverLowering(val context: CommonBackendContext) :
type.annotations type.annotations
), ),
symbol, symbol,
descriptor,
typeArgumentsCount, typeArgumentsCount,
field, field,
getter, getter,
@@ -238,7 +238,7 @@ private class CallsiteRedirectionTransformer(context: JsIrBackendContext) : IrEl
private fun replaceSecondaryConstructorWithFactoryFunction( private fun replaceSecondaryConstructorWithFactoryFunction(
call: IrFunctionAccessExpression, call: IrFunctionAccessExpression,
newTarget: IrSimpleFunctionSymbol newTarget: IrSimpleFunctionSymbol
) = IrCallImpl(call.startOffset, call.endOffset, call.type, newTarget, newTarget.descriptor, call.typeArgumentsCount).apply { ) = IrCallImpl(call.startOffset, call.endOffset, call.type, newTarget, call.typeArgumentsCount).apply {
copyTypeArgumentsFrom(call) copyTypeArgumentsFrom(call)
@@ -6,23 +6,16 @@
package org.jetbrains.kotlin.ir.backend.js.lower 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.backend.common.lower.callsSuper
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
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.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrConstructor
import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent
import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.expressions.impl.*
import org.jetbrains.kotlin.ir.types.isNullableString import org.jetbrains.kotlin.ir.types.isNullableString
import org.jetbrains.kotlin.ir.types.isString
import org.jetbrains.kotlin.ir.types.makeNotNull import org.jetbrains.kotlin.ir.types.makeNotNull
import org.jetbrains.kotlin.ir.util.defaultType
import org.jetbrains.kotlin.ir.util.isThrowable import org.jetbrains.kotlin.ir.util.isThrowable
import org.jetbrains.kotlin.ir.util.isThrowableTypeOrSubtype
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
@@ -74,7 +67,7 @@ class ThrowableLowering(val context: JsIrBackendContext) : FileLoweringPass {
val (messageArg, causeArg) = expression.extractThrowableArguments() val (messageArg, causeArg) = expression.extractThrowableArguments()
return expression.run { return expression.run {
IrCallImpl(startOffset, endOffset, type, newThrowableFunction, newThrowableFunction.descriptor).also { IrCallImpl(startOffset, endOffset, type, newThrowableFunction).also {
it.putValueArgument(0, messageArg) it.putValueArgument(0, messageArg)
it.putValueArgument(1, causeArg) it.putValueArgument(1, causeArg)
} }
@@ -91,7 +84,7 @@ class ThrowableLowering(val context: JsIrBackendContext) : FileLoweringPass {
val thisReceiver = IrGetValueImpl(expression.startOffset, expression.endOffset, klass.thisReceiver!!.symbol) val thisReceiver = IrGetValueImpl(expression.startOffset, expression.endOffset, klass.thisReceiver!!.symbol)
return expression.run { return expression.run {
IrCallImpl(startOffset, endOffset, type, extendThrowableFunction, extendThrowableFunction.descriptor).also { IrCallImpl(startOffset, endOffset, type, extendThrowableFunction).also {
it.putValueArgument(0, thisReceiver) it.putValueArgument(0, thisReceiver)
it.putValueArgument(1, messageArg) it.putValueArgument(1, messageArg)
it.putValueArgument(2, causeArg) it.putValueArgument(2, causeArg)
@@ -284,8 +284,7 @@ private class BridgeLowering(val context: JvmBackendContext) : ClassLoweringPass
IrCallImpl( IrCallImpl(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, UNDEFINED_OFFSET, UNDEFINED_OFFSET,
maybeOrphanedTarget.returnType, maybeOrphanedTarget.returnType,
maybeOrphanedTarget.symbol, maybeOrphanedTarget.descriptor, maybeOrphanedTarget.symbol, origin = IrStatementOrigin.BRIDGE_DELEGATION,
origin = IrStatementOrigin.BRIDGE_DELEGATION,
superQualifierSymbol = if (invokeStatically) maybeOrphanedTarget.parentAsClass.symbol else null superQualifierSymbol = if (invokeStatically) maybeOrphanedTarget.parentAsClass.symbol else null
).apply { ).apply {
passTypeArgumentsFrom(this@createBridgeBody) passTypeArgumentsFrom(this@createBridgeBody)
@@ -271,7 +271,6 @@ private class EnumClassLowering(val context: JvmBackendContext) : ClassLoweringP
endOffset, endOffset,
context.irBuiltIns.unitType, context.irBuiltIns.unitType,
enumConstructorCall.symbol, enumConstructorCall.symbol,
enumConstructorCall.descriptor,
enumConstructorCall.typeArgumentsCount enumConstructorCall.typeArgumentsCount
) )
@@ -309,7 +308,6 @@ private class EnumClassLowering(val context: JvmBackendContext) : ClassLoweringP
endOffset, endOffset,
context.irBuiltIns.unitType, context.irBuiltIns.unitType,
loweredDelegatedConstructor.symbol, loweredDelegatedConstructor.symbol,
loweredDelegatedConstructor.descriptor,
loweredDelegatedConstructor.typeParameters.size loweredDelegatedConstructor.typeParameters.size
) )
@@ -370,7 +368,6 @@ private class EnumClassLowering(val context: JvmBackendContext) : ClassLoweringP
endOffset, endOffset,
context.irBuiltIns.unitType, context.irBuiltIns.unitType,
loweredConstructor.symbol, loweredConstructor.symbol,
loweredConstructor.descriptor,
loweredConstructor.typeParameters.size loweredConstructor.typeParameters.size
) )
} }
@@ -489,7 +486,6 @@ private class EnumClassLowering(val context: JvmBackendContext) : ClassLoweringP
UNDEFINED_OFFSET, UNDEFINED_OFFSET,
returnType, returnType,
enumValueOf, enumValueOf,
substitutedValueOfDescriptor,
enumValueOf.owner.typeParameters.size enumValueOf.owner.typeParameters.size
) )
irValueOfCall.putTypeArgument(0, irClass.defaultType) irValueOfCall.putTypeArgument(0, irClass.defaultType)
@@ -515,7 +511,7 @@ private class EnumClassLowering(val context: JvmBackendContext) : ClassLoweringP
val cloneFun = context.irBuiltIns.arrayClass.owner.functions.find { it.name.asString() == "clone" }!! val cloneFun = context.irBuiltIns.arrayClass.owner.functions.find { it.name.asString() == "clone" }!!
val returnType = valuesFunction.symbol.owner.returnType val returnType = valuesFunction.symbol.owner.returnType
val irCloneValues = val irCloneValues =
IrCallImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, returnType, cloneFun.symbol, cloneFun.descriptor, 0).apply { IrCallImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, returnType, cloneFun.symbol, 0).apply {
dispatchReceiver = dispatchReceiver =
IrGetFieldImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, valuesField.symbol, valuesField.symbol.owner.type) IrGetFieldImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, valuesField.symbol, valuesField.symbol.owner.type)
} }
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.backend.jvm.lower
import org.jetbrains.kotlin.backend.common.FileLoweringPass import org.jetbrains.kotlin.backend.common.FileLoweringPass
import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext
import org.jetbrains.kotlin.backend.common.ir.copyTypeParametersFrom
import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.backend.common.lower.createIrBuilder
import org.jetbrains.kotlin.backend.common.lower.irBlock import org.jetbrains.kotlin.backend.common.lower.irBlock
import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase
@@ -106,7 +105,6 @@ internal class InlineCallableReferenceToLambdaPhase(val context: JvmBackendConte
expression.endOffset, expression.endOffset,
field.type, field.type,
function.symbol, function.symbol,
function.symbol.descriptor,
typeArgumentsCount = 0, typeArgumentsCount = 0,
origin = IrStatementOrigin.LAMBDA origin = IrStatementOrigin.LAMBDA
).apply { ).apply {
@@ -145,7 +143,7 @@ internal class InlineCallableReferenceToLambdaPhase(val context: JvmBackendConte
expression.endOffset expression.endOffset
).run { ).run {
irExprBody(irCall(referencedFunction).apply { irExprBody(irCall(referencedFunction).apply {
this@apply.descriptor.typeParameters.forEach { this@apply.symbol.owner.allTypeParameters.forEach {
putTypeArgument(it.index, expression.getTypeArgument(it.index)) putTypeArgument(it.index, expression.getTypeArgument(it.index))
} }
@@ -176,7 +174,6 @@ internal class InlineCallableReferenceToLambdaPhase(val context: JvmBackendConte
expression.endOffset, expression.endOffset,
referencedFunction.returnType, referencedFunction.returnType,
function.symbol, function.symbol,
function.symbol.descriptor,
referencedFunction.typeParameters.size, referencedFunction.typeParameters.size,
IrStatementOrigin.LAMBDA IrStatementOrigin.LAMBDA
).apply { ).apply {
@@ -218,7 +218,6 @@ internal class InterfaceLowering(val context: JvmBackendContext) : IrElementTran
endOffset, endOffset,
type, type,
newFunction.symbol, newFunction.symbol,
newFunction.descriptor,
typeArgumentsCount, typeArgumentsCount,
origin origin
).apply { ).apply {
@@ -225,9 +225,8 @@ private class JvmInlineClassLowering(private val context: JvmBackendContext) : F
return IrFunctionReferenceImpl( return IrFunctionReferenceImpl(
expression.startOffset, expression.endOffset, expression.type, expression.startOffset, expression.endOffset, expression.type,
function.symbol, function.descriptor, function.symbol, function.typeParameters.size,
function.typeParameters.size, function.valueParameters.size, function.valueParameters.size, expression.origin
expression.origin
).apply { ).apply {
buildReplacement(expression.symbol.owner, expression, replacement) buildReplacement(expression.symbol.owner, expression, replacement)
}.copyAttributes(expression) }.copyAttributes(expression)
@@ -58,7 +58,7 @@ private class JvmOverloadsAnnotationLowering(val context: JvmBackendContext) : C
val wrapperIrFunction = generateWrapperHeader(target, numDefaultParametersToExpect) val wrapperIrFunction = generateWrapperHeader(target, numDefaultParametersToExpect)
val call = if (target is IrConstructor) val call = if (target is IrConstructor)
IrDelegatingConstructorCallImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, context.irBuiltIns.unitType, target.symbol, target.descriptor) IrDelegatingConstructorCallImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, context.irBuiltIns.unitType, target.symbol)
else else
IrCallImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, target.returnType, target.symbol) IrCallImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, target.returnType, target.symbol)
for (arg in wrapperIrFunction.allTypeParameters) { for (arg in wrapperIrFunction.allTypeParameters) {
@@ -23,12 +23,9 @@ import org.jetbrains.kotlin.ir.builders.irReturn
import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl
import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.util.functions import org.jetbrains.kotlin.ir.util.functions
import org.jetbrains.kotlin.ir.util.getAnnotation
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.Variance
internal class MainMethodGenerationLowering(val context: JvmBackendContext) : ClassLoweringPass { internal class MainMethodGenerationLowering(val context: JvmBackendContext) : ClassLoweringPass {
@@ -111,7 +111,7 @@ internal class SyntheticAccessorLowering(val context: JvmBackendContext) : IrEle
expression.transformChildrenVoid() expression.transformChildrenVoid()
return IrFunctionReferenceImpl( return IrFunctionReferenceImpl(
expression.startOffset, expression.endOffset, expression.type, expression.startOffset, expression.endOffset, expression.type,
accessor, accessor.descriptor, accessor.owner.typeParameters.size, accessor, accessor.owner.typeParameters.size,
accessor.owner.valueParameters.size, expression.origin accessor.owner.valueParameters.size, expression.origin
) )
} }
@@ -183,8 +183,7 @@ internal class SyntheticAccessorLowering(val context: JvmBackendContext) : IrEle
IrDelegatingConstructorCallImpl( IrDelegatingConstructorCallImpl(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, UNDEFINED_OFFSET, UNDEFINED_OFFSET,
context.irBuiltIns.unitType, context.irBuiltIns.unitType,
targetSymbol, targetSymbol.descriptor, targetSymbol, targetSymbol.owner.parentAsClass.typeParameters.size + targetSymbol.owner.typeParameters.size
targetSymbol.owner.parentAsClass.typeParameters.size + targetSymbol.owner.typeParameters.size
).also { ).also {
copyAllParamsToArgs(it, accessor) copyAllParamsToArgs(it, accessor)
} }
@@ -250,8 +249,7 @@ internal class SyntheticAccessorLowering(val context: JvmBackendContext) : IrEle
IrCallImpl( IrCallImpl(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, UNDEFINED_OFFSET, UNDEFINED_OFFSET,
accessor.returnType, accessor.returnType,
targetSymbol, targetSymbol.descriptor, targetSymbol, targetSymbol.owner.typeParameters.size,
targetSymbol.owner.typeParameters.size,
superQualifierSymbol = superQualifierSymbol superQualifierSymbol = superQualifierSymbol
).also { ).also {
copyAllParamsToArgs(it, accessor) copyAllParamsToArgs(it, accessor)
@@ -344,15 +342,13 @@ internal class SyntheticAccessorLowering(val context: JvmBackendContext) : IrEle
is IrCall -> IrCallImpl( is IrCall -> IrCallImpl(
oldExpression.startOffset, oldExpression.endOffset, oldExpression.startOffset, oldExpression.endOffset,
oldExpression.type, oldExpression.type,
accessorSymbol, accessorSymbol.descriptor, accessorSymbol, oldExpression.typeArgumentsCount,
oldExpression.typeArgumentsCount,
oldExpression.origin oldExpression.origin
) )
is IrDelegatingConstructorCall -> IrDelegatingConstructorCallImpl( is IrDelegatingConstructorCall -> IrDelegatingConstructorCallImpl(
oldExpression.startOffset, oldExpression.endOffset, oldExpression.startOffset, oldExpression.endOffset,
context.irBuiltIns.unitType, context.irBuiltIns.unitType,
accessorSymbol as IrConstructorSymbol, accessorSymbol.descriptor, accessorSymbol as IrConstructorSymbol, oldExpression.typeArgumentsCount
oldExpression.typeArgumentsCount
) )
is IrConstructorCall -> is IrConstructorCall ->
IrConstructorCallImpl.fromSymbolDescriptor( IrConstructorCallImpl.fromSymbolDescriptor(
@@ -388,8 +384,7 @@ internal class SyntheticAccessorLowering(val context: JvmBackendContext) : IrEle
val call = IrCallImpl( val call = IrCallImpl(
oldExpression.startOffset, oldExpression.endOffset, oldExpression.startOffset, oldExpression.endOffset,
oldExpression.type, oldExpression.type,
accessorSymbol, accessorSymbol.descriptor, accessorSymbol, 0,
0,
oldExpression.origin oldExpression.origin
) )
oldExpression.receiver?.let { oldExpression.receiver?.let {
@@ -405,8 +400,7 @@ internal class SyntheticAccessorLowering(val context: JvmBackendContext) : IrEle
val call = IrCallImpl( val call = IrCallImpl(
oldExpression.startOffset, oldExpression.endOffset, oldExpression.startOffset, oldExpression.endOffset,
oldExpression.type, oldExpression.type,
accessorSymbol, accessorSymbol.descriptor, accessorSymbol, 0,
0,
oldExpression.origin oldExpression.origin
) )
oldExpression.receiver?.let { oldExpression.receiver?.let {
@@ -261,8 +261,7 @@ class BodyGenerator(
IrDelegatingConstructorCallImpl( IrDelegatingConstructorCallImpl(
ktElement.pureStartOffset, ktElement.pureEndOffset, ktElement.pureStartOffset, ktElement.pureEndOffset,
context.irBuiltIns.unitType, context.irBuiltIns.unitType,
context.symbolTable.referenceConstructor(anyConstructor), context.symbolTable.referenceConstructor(anyConstructor)
anyConstructor
) )
) )
} }
@@ -125,8 +125,7 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator
val getterDescriptor = descriptor.getter!! val getterDescriptor = descriptor.getter!!
val getterSymbol = context.symbolTable.referenceFunction(getterDescriptor.original) val getterSymbol = context.symbolTable.referenceFunction(getterDescriptor.original)
IrCallImpl( IrCallImpl(
startOffset, endOffset, descriptor.type.toIrType(), getterSymbol, getterDescriptor, startOffset, endOffset, descriptor.type.toIrType(), getterSymbol, origin ?: IrStatementOrigin.GET_LOCAL_PROPERTY
origin ?: IrStatementOrigin.GET_LOCAL_PROPERTY
).apply { ).apply {
putTypeArguments(typeArguments) { it.toIrType() } putTypeArguments(typeArguments) { it.toIrType() }
} }
@@ -141,8 +140,7 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator
val irCall = IrDelegatingConstructorCallImpl( val irCall = IrDelegatingConstructorCallImpl(
startOffset, endOffset, startOffset, endOffset,
context.irBuiltIns.unitType, context.irBuiltIns.unitType,
constructorSymbol, constructorSymbol
descriptor
).apply { ).apply {
putTypeArguments(call.typeArguments) { it.toIrType() } putTypeArguments(call.typeArguments) { it.toIrType() }
this.dispatchReceiver = dispatchReceiver?.load() this.dispatchReceiver = dispatchReceiver?.load()
@@ -205,7 +203,6 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator
startOffset, endOffset, startOffset, endOffset,
irType, irType,
getterSymbol, getterSymbol,
getMethodDescriptor,
descriptor.typeParametersCount, descriptor.typeParametersCount,
0, 0,
IrStatementOrigin.GET_PROPERTY, IrStatementOrigin.GET_PROPERTY,
@@ -249,11 +246,12 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator
): IrExpression = ): IrExpression =
call.callReceiver.call { dispatchReceiverValue, extensionReceiverValue -> call.callReceiver.call { dispatchReceiverValue, extensionReceiverValue ->
val irType = constructorDescriptor.returnType.toIrType() val irType = constructorDescriptor.returnType.toIrType()
val originalSymbol = context.symbolTable.referenceConstructor(constructorDescriptor.original)
IrConstructorCallImpl.fromSubstitutedDescriptor( IrConstructorCallImpl.fromSubstitutedDescriptor(
startOffset, endOffset, startOffset, endOffset,
irType, irType,
context.symbolTable.referenceConstructor(constructorDescriptor.original), originalSymbol,
constructorDescriptor,
origin origin
).run { ).run {
putTypeArguments(call.typeArguments) { it.toIrType() } putTypeArguments(call.typeArguments) { it.toIrType() }
@@ -322,11 +320,11 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator
) )
} }
} else { } else {
val originalSymbol = context.symbolTable.referenceFunction(functionDescriptor.original)
IrCallImpl( IrCallImpl(
startOffset, endOffset, startOffset, endOffset,
irType, irType,
context.symbolTable.referenceFunction(functionDescriptor.original), originalSymbol,
functionDescriptor,
origin, origin,
call.superQualifier?.let { context.symbolTable.referenceClass(it) } call.superQualifier?.let { context.symbolTable.referenceClass(it) }
).run { ).run {
@@ -279,10 +279,10 @@ class ClassGenerator(
val substitutedOverridden = substituteOverriddenDescriptorForDelegate(delegated, overridden) val substitutedOverridden = substituteOverriddenDescriptorForDelegate(delegated, overridden)
val returnType = substitutedOverridden.returnType!! val returnType = substitutedOverridden.returnType!!
val irReturnType = returnType.toIrType() val irReturnType = returnType.toIrType()
val originalSymbol = context.symbolTable.referenceFunction(overridden.original)
val irCall = IrCallImpl( val irCall = IrCallImpl(
startOffset, endOffset, irReturnType, startOffset, endOffset, irReturnType,
context.symbolTable.referenceFunction(overridden.original), originalSymbol,
substitutedOverridden,
substitutedOverridden.typeParametersCount substitutedOverridden.typeParametersCount
).apply { ).apply {
val typeArguments = getTypeArgumentsForOverriddenDescriptorDelegatingCall(delegated, overridden) val typeArguments = getTypeArgumentsForOverriddenDescriptorDelegatingCall(delegated, overridden)
@@ -258,7 +258,7 @@ class DataClassMembersGenerator(
val hashCodeFunctionDescriptor = getHashCodeFunction(kotlinType) val hashCodeFunctionDescriptor = getHashCodeFunction(kotlinType)
val hashCodeFunctionSymbol = declarationGenerator.context.symbolTable.referenceFunction(hashCodeFunctionDescriptor.original) val hashCodeFunctionSymbol = declarationGenerator.context.symbolTable.referenceFunction(hashCodeFunctionDescriptor.original)
return irCall(hashCodeFunctionSymbol, context.irBuiltIns.intType).apply { return irCall(hashCodeFunctionSymbol, context.irBuiltIns.intType).apply {
if (descriptor.dispatchReceiverParameter != null) { if (hashCodeFunctionDescriptor.dispatchReceiverParameter != null) {
dispatchReceiver = irValue dispatchReceiver = irValue
} else { } else {
putValueArgument(0, irValue) putValueArgument(0, irValue)
@@ -412,18 +412,19 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat
endOffset: Int, endOffset: Int,
functionDescriptor: FunctionDescriptor, functionDescriptor: FunctionDescriptor,
receiver: IrExpression receiver: IrExpression
): IrExpression = ): IrExpression {
IrCallImpl( val originalSymbol = context.symbolTable.referenceFunction(functionDescriptor.original)
return IrCallImpl(
startOffset, startOffset,
endOffset, endOffset,
functionDescriptor.returnType!!.toIrType(), functionDescriptor.returnType!!.toIrType(),
context.symbolTable.referenceFunction(functionDescriptor.original), originalSymbol,
functionDescriptor, origin = null,
origin = null, // TODO origin for widening conversions?
superQualifierSymbol = null superQualifierSymbol = null
).apply { ).apply {
dispatchReceiver = receiver dispatchReceiver = receiver
} }
}
private fun KotlinType.findConversionFunctionTo(targetType: KotlinType): FunctionDescriptor? { private fun KotlinType.findConversionFunctionTo(targetType: KotlinType): FunctionDescriptor? {
val targetTypeName = targetType.constructor.declarationDescriptor?.name?.asString() ?: return null val targetTypeName = targetType.constructor.declarationDescriptor?.name?.asString() ?: return null
@@ -498,11 +499,11 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat
) )
) ?: throw AssertionError("Substitution failed for $checkNotNull: T=$argumentType") ) ?: throw AssertionError("Substitution failed for $checkNotNull: T=$argumentType")
val checkNotNullSymbol = context.irBuiltIns.checkNotNullSymbol
return IrCallImpl( return IrCallImpl(
ktOperator.startOffsetSkippingComments, ktOperator.endOffset, ktOperator.startOffsetSkippingComments, ktOperator.endOffset,
expressionType.toIrType(), expressionType.toIrType(),
context.irBuiltIns.checkNotNullSymbol, checkNotNullSymbol,
checkNotNullSubstituted,
origin origin
).apply { ).apply {
putTypeArgument(0, argumentType.toIrType().makeNotNull()) putTypeArgument(0, argumentType.toIrType().makeNotNull())
@@ -137,11 +137,11 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
val originalProperty = propertyDescriptor.original val originalProperty = propertyDescriptor.original
val originalGetter = originalProperty.getter?.original val originalGetter = originalProperty.getter?.original
val originalSetter = if (mutable) originalProperty.setter?.original else null val originalSetter = if (mutable) originalProperty.setter?.original else null
val originalSymbol = context.symbolTable.referenceProperty(originalProperty)
return IrPropertyReferenceImpl( return IrPropertyReferenceImpl(
startOffset, endOffset, type.toIrType(), startOffset, endOffset, type.toIrType(),
context.symbolTable.referenceProperty(originalProperty), originalSymbol,
propertyDescriptor,
propertyDescriptor.typeParametersCount, propertyDescriptor.typeParametersCount,
getFieldForPropertyReference(originalProperty), getFieldForPropertyReference(originalProperty),
originalGetter?.let { context.symbolTable.referenceSimpleFunction(it) }, originalGetter?.let { context.symbolTable.referenceSimpleFunction(it) },
@@ -172,8 +172,7 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
): IrFunctionReference = ): IrFunctionReference =
IrFunctionReferenceImpl( IrFunctionReferenceImpl(
startOffset, endOffset, type.toIrType(), startOffset, endOffset, type.toIrType(),
symbol, descriptor, descriptor.typeParametersCount, symbol, descriptor.typeParametersCount, origin
origin
).apply { ).apply {
putTypeArguments(typeArguments) { it.toIrType() } putTypeArguments(typeArguments) { it.toIrType() }
} }
@@ -22,7 +22,6 @@ import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.types.KotlinType
class DelegatedLocalPropertyLValue( class DelegatedLocalPropertyLValue(
private val context: IrGeneratorContext, private val context: IrGeneratorContext,
@@ -37,10 +36,10 @@ class DelegatedLocalPropertyLValue(
AssignmentReceiver { AssignmentReceiver {
override fun load(): IrExpression = override fun load(): IrExpression =
IrCallImpl(startOffset, endOffset, type, getterSymbol!!, getterSymbol.descriptor, origin) IrCallImpl(startOffset, endOffset, type, getterSymbol!!, origin)
override fun store(irExpression: IrExpression): IrExpression = override fun store(irExpression: IrExpression): IrExpression =
IrCallImpl(startOffset, endOffset, context.irBuiltIns.unitType, setterSymbol!!, setterSymbol.descriptor, origin).apply { IrCallImpl(startOffset, endOffset, context.irBuiltIns.unitType, setterSymbol!!, origin).apply {
putValueArgument(0, irExpression) putValueArgument(0, irExpression)
} }
@@ -145,8 +145,7 @@ class AccessorPropertyLValue(
IrCallImpl( IrCallImpl(
startOffset, endOffset, startOffset, endOffset,
type, type,
getter!!, getterDescriptor, getter!!, typeArgumentsCount,
typeArgumentsCount,
0, 0,
origin, origin,
superQualifier superQualifier
@@ -162,8 +161,7 @@ class AccessorPropertyLValue(
IrCallImpl( IrCallImpl(
startOffset, endOffset, startOffset, endOffset,
context.irBuiltIns.unitType, context.irBuiltIns.unitType,
setter!!, setterDescriptor, setter!!, typeArgumentsCount,
typeArgumentsCount,
1, 1,
origin, origin,
superQualifier superQualifier
@@ -196,7 +196,6 @@ fun IrBuilderWithScope.irGet(type: IrType, receiver: IrExpression?, getterSymbol
startOffset, endOffset, startOffset, endOffset,
type, type,
getterSymbol as IrSimpleFunctionSymbol, getterSymbol as IrSimpleFunctionSymbol,
getterSymbol.descriptor,
typeArgumentsCount = getterSymbol.owner.typeParameters.size, typeArgumentsCount = getterSymbol.owner.typeParameters.size,
valueArgumentsCount = 0, valueArgumentsCount = 0,
origin = IrStatementOrigin.GET_PROPERTY origin = IrStatementOrigin.GET_PROPERTY
@@ -209,7 +208,6 @@ fun IrBuilderWithScope.irSet(type: IrType, receiver: IrExpression?, setterSymbol
startOffset, endOffset, startOffset, endOffset,
type, type,
setterSymbol as IrSimpleFunctionSymbol, setterSymbol as IrSimpleFunctionSymbol,
setterSymbol.descriptor,
typeArgumentsCount = setterSymbol.owner.typeParameters.size, typeArgumentsCount = setterSymbol.owner.typeParameters.size,
valueArgumentsCount = 1, valueArgumentsCount = 1,
origin = IrStatementOrigin.EQ origin = IrStatementOrigin.EQ
@@ -242,7 +240,7 @@ fun IrBuilderWithScope.irCallConstructor(callee: IrConstructorSymbol, typeArgume
} }
fun IrBuilderWithScope.irCall(callee: IrSimpleFunctionSymbol, type: IrType): IrCall = fun IrBuilderWithScope.irCall(callee: IrSimpleFunctionSymbol, type: IrType): IrCall =
IrCallImpl(startOffset, endOffset, type, callee, callee.descriptor) IrCallImpl(startOffset, endOffset, type, callee)
fun IrBuilderWithScope.irCall(callee: IrConstructorSymbol, type: IrType): IrConstructorCall = fun IrBuilderWithScope.irCall(callee: IrConstructorSymbol, type: IrType): IrConstructorCall =
IrConstructorCallImpl.fromSymbolDescriptor(startOffset, endOffset, type, callee) IrConstructorCallImpl.fromSymbolDescriptor(startOffset, endOffset, type, callee)
@@ -264,7 +262,7 @@ fun IrBuilderWithScope.irCall(callee: IrFunctionSymbol): IrFunctionAccessExpress
irCall(callee, callee.owner.returnType) irCall(callee, callee.owner.returnType)
fun IrBuilderWithScope.irCall(callee: IrFunctionSymbol, descriptor: FunctionDescriptor, type: IrType): IrCall = fun IrBuilderWithScope.irCall(callee: IrFunctionSymbol, descriptor: FunctionDescriptor, type: IrType): IrCall =
IrCallImpl(startOffset, endOffset, type, callee as IrSimpleFunctionSymbol, descriptor) IrCallImpl(startOffset, endOffset, type, callee as IrSimpleFunctionSymbol)
fun IrBuilderWithScope.irCall(callee: IrFunction): IrFunctionAccessExpression = fun IrBuilderWithScope.irCall(callee: IrFunction): IrFunctionAccessExpression =
irCall(callee.symbol) irCall(callee.symbol)
@@ -273,12 +271,13 @@ fun IrBuilderWithScope.irCall(callee: IrFunction, origin: IrStatementOrigin): Ir
IrCallImpl( IrCallImpl(
startOffset, endOffset, callee.returnType, startOffset, endOffset, callee.returnType,
callee.symbol as IrSimpleFunctionSymbol, callee.symbol as IrSimpleFunctionSymbol,
callee.descriptor, origin callee.typeParameters.size, callee.valueParameters.size,
origin
) )
fun IrBuilderWithScope.irDelegatingConstructorCall(callee: IrConstructor): IrDelegatingConstructorCall = fun IrBuilderWithScope.irDelegatingConstructorCall(callee: IrConstructor): IrDelegatingConstructorCall =
IrDelegatingConstructorCallImpl( IrDelegatingConstructorCallImpl(
startOffset, endOffset, context.irBuiltIns.unitType, callee.symbol, callee.descriptor, startOffset, endOffset, context.irBuiltIns.unitType, callee.symbol,
callee.parentAsClass.typeParameters.size, callee.valueParameters.size callee.parentAsClass.typeParameters.size, callee.valueParameters.size
) )
@@ -379,14 +378,3 @@ inline fun IrBuilderWithScope.irBlockBody(
endOffset endOffset
).blockBody(body) ).blockBody(body)
fun IrBuilderWithScope.irThrowIse(origin: IrStatementOrigin? = null) =
IrCallImpl(
startOffset, endOffset,
context.irBuiltIns.nothingType,
context.irBuiltIns.throwIseSymbol,
context.irBuiltIns.throwIseSymbol.descriptor,
typeArgumentsCount = 0,
valueArgumentsCount = 0,
origin = origin
)
@@ -33,7 +33,7 @@ fun primitiveOp1(
origin: IrStatementOrigin, origin: IrStatementOrigin,
dispatchReceiver: IrExpression dispatchReceiver: IrExpression
): IrExpression = ): IrExpression =
IrCallImpl(startOffset, endOffset, primitiveOpReturnType, primitiveOpSymbol, primitiveOpSymbol.descriptor, origin = origin).also { IrCallImpl(startOffset, endOffset, primitiveOpReturnType, primitiveOpSymbol, origin = origin).also {
it.dispatchReceiver = dispatchReceiver it.dispatchReceiver = dispatchReceiver
} }
@@ -47,8 +47,7 @@ fun primitiveOp2(
IrCallImpl( IrCallImpl(
startOffset, endOffset, startOffset, endOffset,
primitiveOpReturnType, primitiveOpReturnType,
primitiveOpSymbol, primitiveOpSymbol.descriptor, primitiveOpSymbol, typeArgumentsCount = 0,
typeArgumentsCount = 0,
valueArgumentsCount = 2, valueArgumentsCount = 2,
origin = origin origin = origin
).apply { ).apply {
@@ -16,13 +16,12 @@
package org.jetbrains.kotlin.ir.expressions.impl package org.jetbrains.kotlin.ir.expressions.impl
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
import org.jetbrains.kotlin.ir.expressions.typeParametersCount import org.jetbrains.kotlin.ir.expressions.typeParametersCount
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
@@ -32,7 +31,6 @@ class IrCallImpl(
endOffset: Int, endOffset: Int,
type: IrType, type: IrType,
override val symbol: IrFunctionSymbol, override val symbol: IrFunctionSymbol,
override val descriptor: FunctionDescriptor,
typeArgumentsCount: Int, typeArgumentsCount: Int,
valueArgumentsCount: Int, valueArgumentsCount: Int,
origin: IrStatementOrigin? = null, origin: IrStatementOrigin? = null,
@@ -47,22 +45,23 @@ class IrCallImpl(
IrCall { IrCall {
init { init {
if (descriptor is ConstructorDescriptor) { if (symbol is IrConstructorSymbol) {
throw AssertionError("Should be IrConstructorCall: $descriptor") throw AssertionError("Should be IrConstructorCall: ${symbol.descriptor}")
} }
} }
override val descriptor: FunctionDescriptor get() = symbol.descriptor
constructor( constructor(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
type: IrType, type: IrType,
symbol: IrFunctionSymbol, symbol: IrFunctionSymbol,
descriptor: FunctionDescriptor,
origin: IrStatementOrigin? = null, origin: IrStatementOrigin? = null,
superQualifierSymbol: IrClassSymbol? = null superQualifierSymbol: IrClassSymbol? = null
) : this( ) : this(
startOffset, endOffset, type, symbol, descriptor, descriptor.typeParametersCount, startOffset, endOffset, type, symbol, symbol.descriptor.typeParametersCount, symbol.descriptor.valueParameters.size,
descriptor.valueParameters.size, origin, superQualifierSymbol origin, superQualifierSymbol
) )
constructor( constructor(
@@ -70,13 +69,12 @@ class IrCallImpl(
endOffset: Int, endOffset: Int,
type: IrType, type: IrType,
symbol: IrFunctionSymbol, symbol: IrFunctionSymbol,
descriptor: FunctionDescriptor,
typeArgumentsCount: Int, typeArgumentsCount: Int,
origin: IrStatementOrigin? = null, origin: IrStatementOrigin? = null,
superQualifierSymbol: IrClassSymbol? = null superQualifierSymbol: IrClassSymbol? = null
) : this( ) : this(
startOffset, endOffset, type, symbol, descriptor, typeArgumentsCount, startOffset, endOffset, type, symbol, typeArgumentsCount, symbol.descriptor.valueParameters.size,
descriptor.valueParameters.size, origin, superQualifierSymbol origin, superQualifierSymbol
) )
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
@@ -19,7 +19,6 @@ class IrConstructorCallImpl(
endOffset: Int, endOffset: Int,
type: IrType, type: IrType,
override val symbol: IrConstructorSymbol, override val symbol: IrConstructorSymbol,
override val descriptor: ClassConstructorDescriptor,
typeArgumentsCount: Int, typeArgumentsCount: Int,
override val constructorTypeArgumentsCount: Int, override val constructorTypeArgumentsCount: Int,
valueArgumentsCount: Int, valueArgumentsCount: Int,
@@ -31,6 +30,8 @@ class IrConstructorCallImpl(
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
visitor.visitConstructorCall(this, data) visitor.visitConstructorCall(this, data)
override val descriptor: ClassConstructorDescriptor get() = symbol.descriptor
companion object { companion object {
fun fromSubstitutedDescriptor( fun fromSubstitutedDescriptor(
startOffset: Int, startOffset: Int,
@@ -48,7 +49,6 @@ class IrConstructorCallImpl(
startOffset, endOffset, startOffset, endOffset,
type, type,
constructorSymbol, constructorSymbol,
constructorDescriptor,
totalTypeParametersCount, totalTypeParametersCount,
totalTypeParametersCount - classTypeParametersCount, totalTypeParametersCount - classTypeParametersCount,
valueParametersCount, valueParametersCount,
@@ -83,7 +83,6 @@ class IrConstructorCallImpl(
startOffset, endOffset, startOffset, endOffset,
type, type,
constructorSymbol, constructorSymbol,
constructorSymbol.descriptor,
totalTypeParametersCount, totalTypeParametersCount,
constructorTypeParametersCount, constructorTypeParametersCount,
valueParametersCount, valueParametersCount,
@@ -28,7 +28,6 @@ class IrDelegatingConstructorCallImpl(
endOffset: Int, endOffset: Int,
type: IrType, type: IrType,
override val symbol: IrConstructorSymbol, override val symbol: IrConstructorSymbol,
override val descriptor: ClassConstructorDescriptor,
typeArgumentsCount: Int, typeArgumentsCount: Int,
valueArgumentsCount: Int valueArgumentsCount: Int
) : ) :
@@ -41,29 +40,22 @@ class IrDelegatingConstructorCallImpl(
), ),
IrDelegatingConstructorCall { IrDelegatingConstructorCall {
constructor(
startOffset: Int,
endOffset: Int,
type: IrType,
symbol: IrConstructorSymbol,
descriptor: ClassConstructorDescriptor
) : this(startOffset, endOffset, type, symbol, descriptor, descriptor.typeParametersCount, descriptor.valueParameters.size)
constructor( constructor(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
type: IrType, type: IrType,
symbol: IrConstructorSymbol symbol: IrConstructorSymbol
) : this(startOffset, endOffset, type, symbol, symbol.descriptor) ) : this(startOffset, endOffset, type, symbol, symbol.descriptor.typeParametersCount, symbol.descriptor.valueParameters.size)
constructor( constructor(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
type: IrType, type: IrType,
symbol: IrConstructorSymbol, symbol: IrConstructorSymbol,
descriptor: ClassConstructorDescriptor,
typeArgumentsCount: Int typeArgumentsCount: Int
) : this(startOffset, endOffset, type, symbol, descriptor, typeArgumentsCount, descriptor.valueParameters.size) ) : this(startOffset, endOffset, type, symbol, typeArgumentsCount, symbol.descriptor.valueParameters.size)
override val descriptor: ClassConstructorDescriptor get() = symbol.descriptor
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R { override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
return visitor.visitDelegatingConstructorCall(this, data) return visitor.visitDelegatingConstructorCall(this, data)
@@ -28,7 +28,6 @@ class IrFunctionReferenceImpl(
endOffset: Int, endOffset: Int,
type: IrType, type: IrType,
override val symbol: IrFunctionSymbol, override val symbol: IrFunctionSymbol,
override val descriptor: FunctionDescriptor,
typeArgumentsCount: Int, typeArgumentsCount: Int,
valueArgumentsCount: Int, valueArgumentsCount: Int,
origin: IrStatementOrigin? = null origin: IrStatementOrigin? = null
@@ -48,10 +47,11 @@ class IrFunctionReferenceImpl(
endOffset: Int, endOffset: Int,
type: IrType, type: IrType,
symbol: IrFunctionSymbol, symbol: IrFunctionSymbol,
descriptor: FunctionDescriptor,
typeArgumentsCount: Int, typeArgumentsCount: Int,
origin: IrStatementOrigin? = null origin: IrStatementOrigin? = null
) : this(startOffset, endOffset, type, symbol, descriptor, typeArgumentsCount, descriptor.valueParameters.size, origin) ) : this(startOffset, endOffset, type, symbol, typeArgumentsCount, symbol.descriptor.valueParameters.size, origin)
override val descriptor: FunctionDescriptor get() = symbol.descriptor
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
visitor.visitFunctionReference(this, data) visitor.visitFunctionReference(this, data)
@@ -31,7 +31,6 @@ class IrPropertyReferenceImpl(
endOffset: Int, endOffset: Int,
type: IrType, type: IrType,
override val symbol: IrPropertySymbol, override val symbol: IrPropertySymbol,
override val descriptor: PropertyDescriptor,
typeArgumentsCount: Int, typeArgumentsCount: Int,
override val field: IrFieldSymbol?, override val field: IrFieldSymbol?,
override val getter: IrSimpleFunctionSymbol?, override val getter: IrSimpleFunctionSymbol?,
@@ -41,22 +40,6 @@ class IrPropertyReferenceImpl(
IrNoArgumentsCallableReferenceBase(startOffset, endOffset, type, typeArgumentsCount, origin), IrNoArgumentsCallableReferenceBase(startOffset, endOffset, type, typeArgumentsCount, origin),
IrPropertyReference { IrPropertyReference {
constructor(
startOffset: Int,
endOffset: Int,
type: IrType,
symbol: IrPropertySymbol,
typeArgumentsCount: Int,
field: IrFieldSymbol?,
getter: IrSimpleFunctionSymbol?,
setter: IrSimpleFunctionSymbol?,
origin: IrStatementOrigin? = null
) : this(
startOffset, endOffset, type,
symbol, symbol.descriptor,
typeArgumentsCount, field, getter, setter, origin
)
@Deprecated(message = "Don't use descriptor-based API for IrPropertyReference", level = DeprecationLevel.WARNING) @Deprecated(message = "Don't use descriptor-based API for IrPropertyReference", level = DeprecationLevel.WARNING)
constructor( constructor(
startOffset: Int, startOffset: Int,
@@ -74,6 +57,8 @@ class IrPropertyReferenceImpl(
typeArgumentsCount, field, getter, setter, origin typeArgumentsCount, field, getter, setter, origin
) )
override val descriptor: PropertyDescriptor get() = symbol.descriptor
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
visitor.visitPropertyReference(this, data) visitor.visitPropertyReference(this, data)
} }
@@ -495,7 +495,6 @@ open class DeepCopyIrTreeWithSymbols(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
expression.type.remapType(), expression.type.remapType(),
constructorSymbol, constructorSymbol,
constructorSymbol.descriptor,
expression.typeArgumentsCount, expression.typeArgumentsCount,
expression.constructorTypeArgumentsCount, expression.constructorTypeArgumentsCount,
expression.valueArgumentsCount, expression.valueArgumentsCount,
@@ -521,7 +520,6 @@ open class DeepCopyIrTreeWithSymbols(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
expression.type.remapType(), expression.type.remapType(),
newCallee, newCallee,
newCallee.descriptor,
expression.typeArgumentsCount, expression.typeArgumentsCount,
expression.valueArgumentsCount, expression.valueArgumentsCount,
mapStatementOrigin(expression.origin), mapStatementOrigin(expression.origin),
@@ -550,7 +548,6 @@ open class DeepCopyIrTreeWithSymbols(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
expression.type.remapType(), expression.type.remapType(),
newConstructor, newConstructor,
newConstructor.descriptor,
expression.typeArgumentsCount expression.typeArgumentsCount
).apply { ).apply {
copyRemappedTypeArgumentsFrom(expression) copyRemappedTypeArgumentsFrom(expression)
@@ -584,7 +581,6 @@ open class DeepCopyIrTreeWithSymbols(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
expression.type.remapType(), expression.type.remapType(),
symbol, symbol,
symbol.descriptor,
expression.typeArgumentsCount, expression.typeArgumentsCount,
expression.valueArgumentsCount, expression.valueArgumentsCount,
mapStatementOrigin(expression.origin) mapStatementOrigin(expression.origin)
@@ -482,7 +482,6 @@ fun irConstructorCall(
endOffset, endOffset,
type, type,
newSymbol, newSymbol,
newSymbol.descriptor,
typeArgumentsCount, typeArgumentsCount,
0, 0,
call.valueArgumentsCount, call.valueArgumentsCount,
@@ -521,7 +520,6 @@ fun irCall(
endOffset, endOffset,
type, type,
newSymbol, newSymbol,
newSymbol.descriptor,
typeArgumentsCount, typeArgumentsCount,
origin origin
).apply { ).apply {
@@ -350,8 +350,7 @@ abstract class IrFileDeserializer(
val symbol = deserializeIrSymbol(proto.symbol) as IrConstructorSymbol val symbol = deserializeIrSymbol(proto.symbol) as IrConstructorSymbol
return IrConstructorCallImpl( return IrConstructorCallImpl(
start, end, type, start, end, type,
symbol, symbol.descriptor, symbol, typeArgumentsCount = proto.memberAccess.typeArguments.typeArgumentCount,
typeArgumentsCount = proto.memberAccess.typeArguments.typeArgumentCount,
constructorTypeArgumentsCount = proto.constructorTypeArgumentsCount, constructorTypeArgumentsCount = proto.constructorTypeArgumentsCount,
valueArgumentsCount = proto.memberAccess.valueArgumentCount valueArgumentsCount = proto.memberAccess.valueArgumentCount
).also { ).also {
@@ -372,8 +371,7 @@ abstract class IrFileDeserializer(
// TODO: implement the last three args here. // TODO: implement the last three args here.
IrCallImpl( IrCallImpl(
start, end, type, start, end, type,
symbol, symbol.descriptor, symbol, proto.memberAccess.typeArguments.typeArgumentCount,
proto.memberAccess.typeArguments.typeArgumentCount,
proto.memberAccess.valueArgumentList.size, proto.memberAccess.valueArgumentList.size,
origin, origin,
superSymbol superSymbol
@@ -404,7 +402,6 @@ abstract class IrFileDeserializer(
end, end,
builtIns.unitType, builtIns.unitType,
symbol, symbol,
symbol.descriptor,
proto.memberAccess.typeArguments.typeArgumentCount, proto.memberAccess.typeArguments.typeArgumentCount,
proto.memberAccess.valueArgumentList.size proto.memberAccess.valueArgumentList.size
) )
@@ -457,7 +454,6 @@ abstract class IrFileDeserializer(
end, end,
type, type,
symbol, symbol,
symbol.descriptor,
proto.memberAccess.typeArguments.typeArgumentCount, proto.memberAccess.typeArguments.typeArgumentCount,
proto.memberAccess.valueArgumentCount, proto.memberAccess.valueArgumentCount,
origin origin
@@ -226,8 +226,7 @@ interface IrBuilderExtension {
+IrDelegatingConstructorCallImpl( +IrDelegatingConstructorCallImpl(
startOffset, endOffset, startOffset, endOffset,
compilerContext.irBuiltIns.unitType, compilerContext.irBuiltIns.unitType,
compilerContext.externalSymbols.referenceConstructor(anyConstructor), compilerContext.externalSymbols.referenceConstructor(anyConstructor)
anyConstructor
) )
} }
} }
@@ -119,8 +119,7 @@ class SerializableIrGenerator(
startOffset, startOffset,
endOffset, endOffset,
compilerContext.irBuiltIns.unitType, compilerContext.irBuiltIns.unitType,
ctorRef, ctorRef
suitableCtor
) )
call.insertTypeArgumentsForSuperClass(superClass) call.insertTypeArgumentsForSuperClass(superClass)
+call +call
@@ -152,8 +151,7 @@ class SerializableIrGenerator(
startOffset, startOffset,
endOffset, endOffset,
compilerContext.irBuiltIns.unitType, compilerContext.irBuiltIns.unitType,
superCtorRef, superCtorRef
superCtorRef.owner.descriptor
) )
arguments.forEachIndexed { index, parameter -> call.putValueArgument(index, irGet(parameter)) } arguments.forEachIndexed { index, parameter -> call.putValueArgument(index, irGet(parameter)) }
call.insertTypeArgumentsForSuperClass(superClass) call.insertTypeArgumentsForSuperClass(superClass)