IR: IrDelegatingConstructorCall.fromSymbolDescriptor

This commit is contained in:
Georgy Bronnikov
2020-10-14 13:16:32 +03:00
parent b28c85f5ea
commit 14b3beefb3
8 changed files with 33 additions and 26 deletions
@@ -58,7 +58,9 @@ private class JvmOverloadsAnnotationLowering(val context: JvmBackendContext) : C
val call = when (target) { val call = when (target) {
is IrConstructor -> is IrConstructor ->
IrDelegatingConstructorCallImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, context.irBuiltIns.unitType, target.symbol) IrDelegatingConstructorCallImpl.fromSymbolOwner(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, context.irBuiltIns.unitType, target.symbol
)
is IrSimpleFunction -> is IrSimpleFunction ->
IrCallImpl.fromSymbolOwner(UNDEFINED_OFFSET, UNDEFINED_OFFSET, target.returnType, target.symbol) IrCallImpl.fromSymbolOwner(UNDEFINED_OFFSET, UNDEFINED_OFFSET, target.returnType, target.symbol)
else -> else ->
@@ -279,7 +279,7 @@ internal class SyntheticAccessorLowering(val context: JvmBackendContext) : IrEle
} }
private fun createConstructorCall(accessor: IrConstructor, targetSymbol: IrConstructorSymbol) = private fun createConstructorCall(accessor: IrConstructor, targetSymbol: IrConstructorSymbol) =
IrDelegatingConstructorCallImpl( IrDelegatingConstructorCallImpl.fromSymbolOwner(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, UNDEFINED_OFFSET, UNDEFINED_OFFSET,
context.irBuiltIns.unitType, context.irBuiltIns.unitType,
targetSymbol, targetSymbol.owner.parentAsClass.typeParameters.size + targetSymbol.owner.typeParameters.size targetSymbol, targetSymbol.owner.parentAsClass.typeParameters.size + targetSymbol.owner.typeParameters.size
@@ -418,7 +418,7 @@ internal class SyntheticAccessorLowering(val context: JvmBackendContext) : IrEle
accessorSymbol as IrSimpleFunctionSymbol, oldExpression.typeArgumentsCount, accessorSymbol as IrSimpleFunctionSymbol, oldExpression.typeArgumentsCount,
origin = oldExpression.origin origin = oldExpression.origin
) )
is IrDelegatingConstructorCall -> IrDelegatingConstructorCallImpl( is IrDelegatingConstructorCall -> IrDelegatingConstructorCallImpl.fromSymbolOwner(
oldExpression.startOffset, oldExpression.endOffset, oldExpression.startOffset, oldExpression.endOffset,
context.irBuiltIns.unitType, context.irBuiltIns.unitType,
accessorSymbol as IrConstructorSymbol, oldExpression.typeArgumentsCount accessorSymbol as IrConstructorSymbol, oldExpression.typeArgumentsCount
@@ -258,7 +258,7 @@ class BodyGenerator(
private fun generateAnySuperConstructorCall(body: IrBlockBody, ktElement: KtPureElement) { private fun generateAnySuperConstructorCall(body: IrBlockBody, ktElement: KtPureElement) {
val anyConstructor = context.builtIns.any.constructors.single() val anyConstructor = context.builtIns.any.constructors.single()
body.statements.add( body.statements.add(
IrDelegatingConstructorCallImpl( IrDelegatingConstructorCallImpl.fromSymbolDescriptor(
ktElement.pureStartOffset, ktElement.pureEndOffset, ktElement.pureStartOffset, ktElement.pureEndOffset,
context.irBuiltIns.unitType, context.irBuiltIns.unitType,
context.symbolTable.referenceConstructor(anyConstructor) context.symbolTable.referenceConstructor(anyConstructor)
@@ -136,7 +136,7 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator
val descriptor = call.descriptor as? ClassConstructorDescriptor val descriptor = call.descriptor as? ClassConstructorDescriptor
?: throw AssertionError("Class constructor expected: ${call.descriptor}") ?: throw AssertionError("Class constructor expected: ${call.descriptor}")
val constructorSymbol = context.symbolTable.referenceConstructor(descriptor.original) val constructorSymbol = context.symbolTable.referenceConstructor(descriptor.original)
val irCall = IrDelegatingConstructorCallImpl( val irCall = IrDelegatingConstructorCallImpl.fromSymbolDescriptor(
startOffset, endOffset, startOffset, endOffset,
context.irBuiltIns.unitType, context.irBuiltIns.unitType,
constructorSymbol constructorSymbol
@@ -22,6 +22,7 @@ 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.IrConstructorSymbol import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.util.allTypeParameters
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
class IrDelegatingConstructorCallImpl( class IrDelegatingConstructorCallImpl(
@@ -35,24 +36,28 @@ class IrDelegatingConstructorCallImpl(
override val origin: IrStatementOrigin? override val origin: IrStatementOrigin?
get() = null get() = null
@ObsoleteDescriptorBasedAPI
constructor(
startOffset: Int,
endOffset: Int,
type: IrType,
symbol: IrConstructorSymbol
) : this(startOffset, endOffset, type, symbol, symbol.descriptor.typeParametersCount, symbol.descriptor.valueParameters.size)
@ObsoleteDescriptorBasedAPI
constructor(
startOffset: Int,
endOffset: Int,
type: IrType,
symbol: IrConstructorSymbol,
typeArgumentsCount: Int
) : this(startOffset, endOffset, type, symbol, typeArgumentsCount, symbol.descriptor.valueParameters.size)
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)
} }
companion object {
@ObsoleteDescriptorBasedAPI
fun fromSymbolDescriptor(
startOffset: Int,
endOffset: Int,
type: IrType,
symbol: IrConstructorSymbol,
typeArgumentsCount: Int = symbol.descriptor.typeParametersCount,
valueArgumentsCount: Int = symbol.descriptor.valueParameters.size
) = IrDelegatingConstructorCallImpl(startOffset, endOffset, type, symbol, typeArgumentsCount, valueArgumentsCount)
fun fromSymbolOwner(
startOffset: Int,
endOffset: Int,
type: IrType,
symbol: IrConstructorSymbol,
typeArgumentsCount: Int = symbol.owner.allTypeParameters.size,
valueArgumentsCount: Int = symbol.owner.valueParameters.size
) = IrDelegatingConstructorCallImpl(startOffset, endOffset, type, symbol, typeArgumentsCount, valueArgumentsCount)
}
} }
@@ -210,7 +210,7 @@ interface IrBuilderExtension {
fun IrBuilderWithScope.generateAnySuperConstructorCall(toBuilder: IrBlockBodyBuilder) { fun IrBuilderWithScope.generateAnySuperConstructorCall(toBuilder: IrBlockBodyBuilder) {
val anyConstructor = compilerContext.irBuiltIns.anyClass.owner.declarations.single { it is IrConstructor } as IrConstructor val anyConstructor = compilerContext.irBuiltIns.anyClass.owner.declarations.single { it is IrConstructor } as IrConstructor
with(toBuilder) { with(toBuilder) {
+IrDelegatingConstructorCallImpl( +IrDelegatingConstructorCallImpl.fromSymbolDescriptor(
startOffset, endOffset, startOffset, endOffset,
compilerContext.irBuiltIns.unitType, compilerContext.irBuiltIns.unitType,
anyConstructor.symbol anyConstructor.symbol
@@ -121,7 +121,7 @@ class SerializableIrGenerator(
?: error("Non-serializable parent of serializable $serializableDescriptor must have no arg constructor") ?: error("Non-serializable parent of serializable $serializableDescriptor must have no arg constructor")
val call = IrDelegatingConstructorCallImpl( val call = IrDelegatingConstructorCallImpl.fromSymbolDescriptor(
startOffset, startOffset,
endOffset, endOffset,
compilerContext.irBuiltIns.unitType, compilerContext.irBuiltIns.unitType,
@@ -153,7 +153,7 @@ class SerializableIrGenerator(
val arguments = allValueParameters.subList(0, superSlots) + val arguments = allValueParameters.subList(0, superSlots) +
allValueParameters.subList(propertiesStart, propertiesStart + superProperties.size) + allValueParameters.subList(propertiesStart, propertiesStart + superProperties.size) +
allValueParameters.last() // SerializationConstructorMarker allValueParameters.last() // SerializationConstructorMarker
val call = IrDelegatingConstructorCallImpl( val call = IrDelegatingConstructorCallImpl.fromSymbolDescriptor(
startOffset, startOffset,
endOffset, endOffset,
compilerContext.irBuiltIns.unitType, compilerContext.irBuiltIns.unitType,
@@ -165,7 +165,7 @@ open class SerializerIrGenerator(val irClass: IrClass, final override val compil
// generate call to primary ctor to init serialClassDesc and super() // generate call to primary ctor to init serialClassDesc and super()
val primaryCtor = irClass.constructors.find { it.isPrimary } val primaryCtor = irClass.constructors.find { it.isPrimary }
?: throw AssertionError("Serializer class must have primary constructor") ?: throw AssertionError("Serializer class must have primary constructor")
+IrDelegatingConstructorCallImpl( +IrDelegatingConstructorCallImpl.fromSymbolDescriptor(
startOffset, startOffset,
endOffset, endOffset,
compilerContext.irBuiltIns.unitType, compilerContext.irBuiltIns.unitType,