From 14b3beefb3dc547fa3ad818c5c2bd9abc8db3275 Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Wed, 14 Oct 2020 13:16:32 +0300 Subject: [PATCH] IR: IrDelegatingConstructorCall.fromSymbolDescriptor --- .../lower/JvmOverloadsAnnotationLowering.kt | 4 +- .../jvm/lower/SyntheticAccessorLowering.kt | 4 +- .../kotlin/psi2ir/generators/BodyGenerator.kt | 2 +- .../kotlin/psi2ir/generators/CallGenerator.kt | 2 +- .../impl/IrDelegatingConstructorCallImpl.kt | 39 +++++++++++-------- .../compiler/backend/ir/GeneratorHelpers.kt | 2 +- .../backend/ir/SerializableIrGenerator.kt | 4 +- .../backend/ir/SerializerIrGenerator.kt | 2 +- 8 files changed, 33 insertions(+), 26 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmOverloadsAnnotationLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmOverloadsAnnotationLowering.kt index 0a753472d7a..c39b282dfc8 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmOverloadsAnnotationLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmOverloadsAnnotationLowering.kt @@ -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 -> diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt index 0c083311df8..dfe097166c4 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt @@ -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 diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/BodyGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/BodyGenerator.kt index 80799be7b90..849314096ee 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/BodyGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/BodyGenerator.kt @@ -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) diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/CallGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/CallGenerator.kt index 11ef47b077a..b1fba08cf1a 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/CallGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/CallGenerator.kt @@ -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 diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrDelegatingConstructorCallImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrDelegatingConstructorCallImpl.kt index 8941f39cf5c..586e993f8b4 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrDelegatingConstructorCallImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrDelegatingConstructorCallImpl.kt @@ -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 accept(visitor: IrElementVisitor, 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) + } } diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt index 9f29b0fcd42..d36c612297f 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt @@ -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 diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableIrGenerator.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableIrGenerator.kt index d31bf023e60..07af3bde9cd 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableIrGenerator.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableIrGenerator.kt @@ -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, diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerIrGenerator.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerIrGenerator.kt index 766b851f03d..ebd938b84ed 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerIrGenerator.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerIrGenerator.kt @@ -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,