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) {
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 ->
IrCallImpl.fromSymbolOwner(UNDEFINED_OFFSET, UNDEFINED_OFFSET, target.returnType, target.symbol)
else ->
@@ -279,7 +279,7 @@ internal class SyntheticAccessorLowering(val context: JvmBackendContext) : IrEle
}
private fun createConstructorCall(accessor: IrConstructor, targetSymbol: IrConstructorSymbol) =
IrDelegatingConstructorCallImpl(
IrDelegatingConstructorCallImpl.fromSymbolOwner(
UNDEFINED_OFFSET, UNDEFINED_OFFSET,
context.irBuiltIns.unitType,
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,
origin = oldExpression.origin
)
is IrDelegatingConstructorCall -> IrDelegatingConstructorCallImpl(
is IrDelegatingConstructorCall -> IrDelegatingConstructorCallImpl.fromSymbolOwner(
oldExpression.startOffset, oldExpression.endOffset,
context.irBuiltIns.unitType,
accessorSymbol as IrConstructorSymbol, oldExpression.typeArgumentsCount
@@ -258,7 +258,7 @@ class BodyGenerator(
private fun generateAnySuperConstructorCall(body: IrBlockBody, ktElement: KtPureElement) {
val anyConstructor = context.builtIns.any.constructors.single()
body.statements.add(
IrDelegatingConstructorCallImpl(
IrDelegatingConstructorCallImpl.fromSymbolDescriptor(
ktElement.pureStartOffset, ktElement.pureEndOffset,
context.irBuiltIns.unitType,
context.symbolTable.referenceConstructor(anyConstructor)
@@ -136,7 +136,7 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator
val descriptor = call.descriptor as? ClassConstructorDescriptor
?: throw AssertionError("Class constructor expected: ${call.descriptor}")
val constructorSymbol = context.symbolTable.referenceConstructor(descriptor.original)
val irCall = IrDelegatingConstructorCallImpl(
val irCall = IrDelegatingConstructorCallImpl.fromSymbolDescriptor(
startOffset, endOffset,
context.irBuiltIns.unitType,
constructorSymbol
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
import org.jetbrains.kotlin.ir.expressions.typeParametersCount
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.util.allTypeParameters
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
class IrDelegatingConstructorCallImpl(
@@ -35,24 +36,28 @@ class IrDelegatingConstructorCallImpl(
override val origin: IrStatementOrigin?
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 {
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) {
val anyConstructor = compilerContext.irBuiltIns.anyClass.owner.declarations.single { it is IrConstructor } as IrConstructor
with(toBuilder) {
+IrDelegatingConstructorCallImpl(
+IrDelegatingConstructorCallImpl.fromSymbolDescriptor(
startOffset, endOffset,
compilerContext.irBuiltIns.unitType,
anyConstructor.symbol
@@ -121,7 +121,7 @@ class SerializableIrGenerator(
?: error("Non-serializable parent of serializable $serializableDescriptor must have no arg constructor")
val call = IrDelegatingConstructorCallImpl(
val call = IrDelegatingConstructorCallImpl.fromSymbolDescriptor(
startOffset,
endOffset,
compilerContext.irBuiltIns.unitType,
@@ -153,7 +153,7 @@ class SerializableIrGenerator(
val arguments = allValueParameters.subList(0, superSlots) +
allValueParameters.subList(propertiesStart, propertiesStart + superProperties.size) +
allValueParameters.last() // SerializationConstructorMarker
val call = IrDelegatingConstructorCallImpl(
val call = IrDelegatingConstructorCallImpl.fromSymbolDescriptor(
startOffset,
endOffset,
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()
val primaryCtor = irClass.constructors.find { it.isPrimary }
?: throw AssertionError("Serializer class must have primary constructor")
+IrDelegatingConstructorCallImpl(
+IrDelegatingConstructorCallImpl.fromSymbolDescriptor(
startOffset,
endOffset,
compilerContext.irBuiltIns.unitType,