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 6e91ee1063a..298e0fc58d5 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 @@ -154,7 +154,7 @@ class BodyGenerator(val scopeOwner: DeclarationDescriptor, override val context: generateEnumSuperConstructorCall(irBlockBody, ktConstructor) } else { - generateAnySuperConstructorCAll(irBlockBody, ktConstructor) + generateAnySuperConstructorCall(irBlockBody, ktConstructor) } return } @@ -230,12 +230,12 @@ class BodyGenerator(val scopeOwner: DeclarationDescriptor, override val context: // Thus, super class should be Any. val superClass = classDescriptor.getSuperClassOrAny() assert(KotlinBuiltIns.isAny(superClass)) { "$classDescriptor: Super class should be any: $superClass" } - generateAnySuperConstructorCAll(irBlockBody, ktClassOrObject) + generateAnySuperConstructorCall(irBlockBody, ktClassOrObject) } } } - private fun generateAnySuperConstructorCAll(irBlockBody: IrBlockBodyImpl, ktElement: KtElement) { + private fun generateAnySuperConstructorCall(irBlockBody: IrBlockBodyImpl, ktElement: KtElement) { val anyConstructor = context.builtIns.any.constructors.single() irBlockBody.statements.add(IrDelegatingConstructorCallImpl(ktElement.startOffset, ktElement.endOffset, anyConstructor, null)) } 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 c32f9605fa3..05aaa8cb8d6 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 @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.psi2ir.generators import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor import org.jetbrains.kotlin.descriptors.impl.SyntheticFieldDescriptor +import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin @@ -105,8 +106,13 @@ class CallGenerator(statementGenerator: StatementGenerator): StatementGeneratorE IrGetValueImpl(startOffset, endOffset, descriptor, origin) fun generateDelegatingConstructorCall(startOffset: Int, endOffset: Int, call: CallBuilder) : IrExpression { - val descriptor = call.descriptor - if (descriptor !is ClassConstructorDescriptor) throw AssertionError("Class constructor expected: $descriptor") + val descriptor = call.descriptor.let { callDescriptor -> + when (callDescriptor) { + is ClassConstructorDescriptor -> callDescriptor + is TypeAliasConstructorDescriptor -> callDescriptor.underlyingConstructorDescriptor + else -> throw AssertionError("Unexpected constructor descriptor: $callDescriptor") + } + } return call.callReceiver.call { dispatchReceiver, extensionReceiver -> val irCall = IrDelegatingConstructorCallImpl(startOffset, endOffset, descriptor, getTypeArguments(call.original)) diff --git a/compiler/testData/ir/irText/classes/delegatingConstructorCallToTypeAliasConstructor.kt b/compiler/testData/ir/irText/classes/delegatingConstructorCallToTypeAliasConstructor.kt new file mode 100644 index 00000000000..c5be7be7977 --- /dev/null +++ b/compiler/testData/ir/irText/classes/delegatingConstructorCallToTypeAliasConstructor.kt @@ -0,0 +1,7 @@ +open class Cell(val value: T) + +typealias CT = Cell +typealias CStr = Cell + +class C1 : CT("O") +class C2 : CStr("K") diff --git a/compiler/testData/ir/irText/classes/delegatingConstructorCallToTypeAliasConstructor.txt b/compiler/testData/ir/irText/classes/delegatingConstructorCallToTypeAliasConstructor.txt new file mode 100644 index 00000000000..f1f680a6732 --- /dev/null +++ b/compiler/testData/ir/irText/classes/delegatingConstructorCallToTypeAliasConstructor.txt @@ -0,0 +1,31 @@ +FILE /delegatingConstructorCallToTypeAliasConstructor.kt + CLASS CLASS Cell + CONSTRUCTOR public constructor Cell(value: T) + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'constructor Any()' + INSTANCE_INITIALIZER_CALL classDescriptor='Cell' + PROPERTY public final val value: T + FIELD PROPERTY_BACKING_FIELD public final val value: T + EXPRESSION_BODY + GET_VAR 'value-parameter value: T' type=T origin=INITIALIZE_PROPERTY_FROM_PARAMETER + FUN DEFAULT_PROPERTY_ACCESSOR public final fun (): T + BLOCK_BODY + RETURN type=kotlin.Nothing from='(): T' + GET_FIELD 'value: T' type=T origin=null + receiver: GET_VAR '' type=Cell origin=null + TYPEALIAS typealias CT = Cell type=Cell + TYPEALIAS typealias CStr = Cell type=Cell + CLASS CLASS C1 + CONSTRUCTOR public constructor C1() + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'constructor Cell(T)' + value: TYPE_OP type=T origin=IMPLICIT_CAST typeOperand=T + CONST String type=kotlin.String value='O' + INSTANCE_INITIALIZER_CALL classDescriptor='C1' + CLASS CLASS C2 + CONSTRUCTOR public constructor C2() + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'constructor Cell(T)' + value: TYPE_OP type=T origin=IMPLICIT_CAST typeOperand=T + CONST String type=kotlin.String value='K' + INSTANCE_INITIALIZER_CALL classDescriptor='C2' diff --git a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java index b2a10f2a504..eae7454e619 100644 --- a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java @@ -86,6 +86,12 @@ public class IrTextTestCaseGenerated extends AbstractIrTextTestCase { doTest(fileName); } + @TestMetadata("delegatingConstructorCallToTypeAliasConstructor.kt") + public void testDelegatingConstructorCallToTypeAliasConstructor() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/classes/delegatingConstructorCallToTypeAliasConstructor.kt"); + doTest(fileName); + } + @TestMetadata("delegatingConstructorCallsInSecondaryConstructors.kt") public void testDelegatingConstructorCallsInSecondaryConstructors() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/classes/delegatingConstructorCallsInSecondaryConstructors.kt");