diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt index b3fbec2687a..db26c4b04b0 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt @@ -283,6 +283,7 @@ open class DefaultParameterInjector( expression.endOffset, expression.type, it as IrConstructorSymbol, + it.owner.parentAsClass.typeParameters.size, DEFAULT_DISPATCH_CALL ) } diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InnerClassesLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InnerClassesLowering.kt index 5077b5c3a1c..5f0f6fcfbee 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InnerClassesLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InnerClassesLowering.kt @@ -128,8 +128,9 @@ class InnerClassConstructorCallsLowering(val context: BackendContext) : FileLowe if (!parent.isInner) return expression val newCallee = context.declarationFactory.getInnerClassConstructorWithOuterThisParameter(callee.owner) + val classTypeParametersCount = expression.typeArgumentsCount - expression.constructorTypeArgumentsCount val newCall = IrConstructorCallImpl.fromSymbolOwner( - expression.startOffset, expression.endOffset, expression.type, newCallee.symbol, expression.origin + expression.startOffset, expression.endOffset, expression.type, newCallee.symbol, classTypeParametersCount, expression.origin ) newCall.copyTypeArgumentsFrom(expression) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt index bbdddd02c05..46e22ceec3a 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt @@ -33,6 +33,7 @@ import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.util.constructedClass import org.jetbrains.kotlin.ir.util.dump +import org.jetbrains.kotlin.ir.util.parentAsClass import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid @@ -450,6 +451,7 @@ class LocalDeclarationsLowering( oldCall.startOffset, oldCall.endOffset, newCallee.returnType, newCallee.symbol, + newCallee.parentAsClass.typeParameters.size, oldCall.origin ).also { it.copyTypeArgumentsFrom(oldCall) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/FunctionInlining.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/FunctionInlining.kt index ade99274fec..2f25c74a9ee 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/FunctionInlining.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/FunctionInlining.kt @@ -202,9 +202,10 @@ class FunctionInlining(val context: CommonBackendContext) : IrElementTransformer val valueParameters = expression.getArgumentsWithIr().drop(1) // Skip dispatch receiver. val immediateCall = with(expression) { - if (function is IrConstructor) - IrConstructorCallImpl.fromSymbolOwner(startOffset, endOffset, function.returnType, function.symbol) - else + if (function is IrConstructor) { + val classTypeParametersCount = function.parentAsClass.typeParameters.size + IrConstructorCallImpl.fromSymbolOwner(startOffset, endOffset, function.returnType, function.symbol, classTypeParametersCount) + } else IrCallImpl(startOffset, endOffset, function.returnType, functionArgument.symbol) }.apply { functionParameters.forEach { diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/VarargLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/VarargLowering.kt index 36cda0b477a..37f9ed0aa35 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/VarargLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/VarargLowering.kt @@ -79,7 +79,8 @@ private class VarargTransformer( startOffset, endOffset, arrayInlineClass.defaultType, - arrayInlineClass.constructors.single { it.isPrimary }.symbol + arrayInlineClass.constructors.single { it.isPrimary }.symbol, + arrayInlineClass.typeParameters.size ).also { it.putValueArgument(0, array) } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AdditionalClassAnnotationLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AdditionalClassAnnotationLowering.kt index 06436216ddd..8719f367c4d 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AdditionalClassAnnotationLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AdditionalClassAnnotationLowering.kt @@ -141,7 +141,7 @@ private class AdditionalClassAnnotationLowering(private val context: JvmBackendC irClass.annotations.add( IrConstructorCallImpl.fromSymbolOwner( - UNDEFINED_OFFSET, UNDEFINED_OFFSET, documentedConstructor.returnType, documentedConstructor.symbol + UNDEFINED_OFFSET, UNDEFINED_OFFSET, documentedConstructor.returnType, documentedConstructor.symbol, 0 ) ) } @@ -162,7 +162,7 @@ private class AdditionalClassAnnotationLowering(private val context: JvmBackendC irClass.annotations.add( IrConstructorCallImpl.fromSymbolOwner( - UNDEFINED_OFFSET, UNDEFINED_OFFSET, retentionConstructor.returnType, retentionConstructor.symbol + UNDEFINED_OFFSET, UNDEFINED_OFFSET, retentionConstructor.returnType, retentionConstructor.symbol, 0 ).apply { putValueArgument( 0, @@ -225,7 +225,7 @@ private class AdditionalClassAnnotationLowering(private val context: JvmBackendC irClass.annotations.add( IrConstructorCallImpl.fromSymbolOwner( - UNDEFINED_OFFSET, UNDEFINED_OFFSET, targetConstructor.returnType, targetConstructor.symbol + UNDEFINED_OFFSET, UNDEFINED_OFFSET, targetConstructor.returnType, targetConstructor.symbol, 0 ).apply { putValueArgument(0, vararg) } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AnonymousObjectSuperConstructorLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AnonymousObjectSuperConstructorLowering.kt index 74b6e60790a..b29aa7f4ec5 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AnonymousObjectSuperConstructorLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AnonymousObjectSuperConstructorLowering.kt @@ -12,13 +12,13 @@ import org.jetbrains.kotlin.backend.common.lower.irBlock import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.ir.builders.declarations.addValueParameter -import org.jetbrains.kotlin.ir.builders.irCallConstructor import org.jetbrains.kotlin.ir.builders.irGet import org.jetbrains.kotlin.ir.builders.irTemporary import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrValueParameter import org.jetbrains.kotlin.ir.declarations.IrVariable import org.jetbrains.kotlin.ir.expressions.* +import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl import org.jetbrains.kotlin.ir.util.transform @@ -105,9 +105,13 @@ private class AnonymousObjectSuperConstructorLowering(val context: JvmBackendCon } } + val classTypeParametersCount = objectConstructorCall.typeArgumentsCount - objectConstructorCall.symbol.owner.typeParameters.size context.createIrBuilder(currentScope!!.scope.scopeOwnerSymbol).run { expression.statements[expression.statements.size - 1] = irBlock(objectConstructorCall) { - +irCallConstructor(objectConstructor.symbol, listOf()).apply { + +IrConstructorCallImpl.fromSymbolOwner( + objectConstructorCall.startOffset, objectConstructorCall.endOffset, objectConstructorCall.type, + objectConstructorCall.symbol, classTypeParametersCount, objectConstructorCall.origin + ).apply { for (i in 0 until objectConstructorCall.valueArgumentsCount) putValueArgument(i, objectConstructorCall.getValueArgument(i)) // Avoid complex expressions between `new` and ``, as the inliner gets confused if 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 e99130a25c6..088d8731739 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 @@ -248,7 +248,7 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator val irType = constructorDescriptor.returnType.toIrType() val originalSymbol = context.symbolTable.referenceConstructor(constructorDescriptor.original) - IrConstructorCallImpl.fromSubstitutedDescriptor( + IrConstructorCallImpl.fromSymbolDescriptor( startOffset, endOffset, irType, originalSymbol, diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/ExpressionHelpers.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/ExpressionHelpers.kt index 64af781c7dd..e1bbb62d320 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/ExpressionHelpers.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/ExpressionHelpers.kt @@ -232,7 +232,8 @@ fun IrBuilderWithScope.irCallConstructor(callee: IrConstructorSymbol, typeArgume startOffset, endOffset, callee.owner.returnType, - callee + callee, + typeArguments.size - callee.owner.typeParameters.size ).apply { typeArguments.forEachIndexed { index, irType -> this.putTypeArgument(index, irType) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrConstructorCallImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrConstructorCallImpl.kt index 175756094be..5a106239e61 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrConstructorCallImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrConstructorCallImpl.kt @@ -33,18 +33,18 @@ class IrConstructorCallImpl( override val descriptor: ClassConstructorDescriptor get() = symbol.descriptor companion object { - fun fromSubstitutedDescriptor( + + fun fromSymbolDescriptor( startOffset: Int, endOffset: Int, type: IrType, constructorSymbol: IrConstructorSymbol, - constructorDescriptor: ClassConstructorDescriptor, origin: IrStatementOrigin? = null ): IrConstructorCallImpl { + val constructorDescriptor = constructorSymbol.descriptor val classTypeParametersCount = constructorDescriptor.constructedClass.original.declaredTypeParameters.size val totalTypeParametersCount = constructorDescriptor.typeParameters.size val valueParametersCount = constructorDescriptor.valueParameters.size - return IrConstructorCallImpl( startOffset, endOffset, type, @@ -56,25 +56,15 @@ class IrConstructorCallImpl( ) } - fun fromSymbolDescriptor( - startOffset: Int, - endOffset: Int, - type: IrType, - constructorSymbol: IrConstructorSymbol, - origin: IrStatementOrigin? = null - ): IrConstructorCallImpl = - fromSubstitutedDescriptor(startOffset, endOffset, type, constructorSymbol, constructorSymbol.descriptor, origin) - fun fromSymbolOwner( startOffset: Int, endOffset: Int, type: IrType, constructorSymbol: IrConstructorSymbol, + classTypeParametersCount: Int, origin: IrStatementOrigin? = null ): IrConstructorCallImpl { val constructor = constructorSymbol.owner - val constructedClass = constructor.parentAsClass - val classTypeParametersCount = constructedClass.typeParameters.size val constructorTypeParametersCount = constructor.typeParameters.size val totalTypeParametersCount = classTypeParametersCount + constructorTypeParametersCount val valueParametersCount = constructor.valueParameters.size @@ -91,11 +81,19 @@ class IrConstructorCallImpl( } fun fromSymbolOwner( + startOffset: Int, + endOffset: Int, type: IrType, constructorSymbol: IrConstructorSymbol, origin: IrStatementOrigin? = null - ) = - fromSymbolOwner(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, constructorSymbol, origin) + ): IrConstructorCallImpl { + val constructedClass = constructorSymbol.owner.parentAsClass + val classTypeParametersCount = constructedClass.typeParameters.size + return fromSymbolOwner(startOffset, endOffset, type, constructorSymbol, classTypeParametersCount, origin) + } + + fun fromSymbolOwner(type: IrType, constructorSymbol: IrConstructorSymbol, origin: IrStatementOrigin? = null) = + fromSymbolOwner(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, constructorSymbol, constructorSymbol.owner.parentAsClass.typeParameters.size, origin) } } diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableCompanionIrGenerator.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableCompanionIrGenerator.kt index 03aa643d468..3d249e26cd6 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableCompanionIrGenerator.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableCompanionIrGenerator.kt @@ -65,7 +65,7 @@ class SerializableCompanionIrGenerator( val annotationType = compilerContext.externalSymbols.referenceClass(annotationMarkerClass).owner.defaultType val irSerializableClass = compilerContext.externalSymbols.referenceClass(serializableDescriptor).owner - val annotationCtorCall = IrConstructorCallImpl.fromSymbolOwner(startOffset, endOffset, annotationType, annotationCtor).apply { + val annotationCtorCall = IrConstructorCallImpl.fromSymbolOwner(startOffset, endOffset, annotationType, annotationCtor, annotationMarkerClass.declaredTypeParameters.size).apply { val serializerType = serializer.toSimpleType(false) putValueArgument( 0,