From 6f2c8140cff36fcd16c86cfd8b9d882458aea62d Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Fri, 21 Apr 2017 12:10:38 +0300 Subject: [PATCH] IrDelegatingConstructorCall should have substituted descriptor --- .../jetbrains/kotlin/psi2ir/generators/BodyGenerator.kt | 1 + .../jetbrains/kotlin/psi2ir/generators/CallGenerator.kt | 2 +- .../expressions/impl/IrDelegatingConstructorCallImpl.kt | 4 ++-- .../src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt | 1 + .../irText/regressions/typeAliasCtorForGenericClass.txt | 9 ++++++++- 5 files changed, 13 insertions(+), 4 deletions(-) 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 1eb5920776a..952e4af34f7 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 @@ -239,6 +239,7 @@ class BodyGenerator( IrDelegatingConstructorCallImpl( ktElement.startOffset, ktElement.endOffset, context.symbolTable.referenceConstructor(anyConstructor), + 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 1939d18ea85..29df2e09f7b 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 @@ -103,7 +103,7 @@ class CallGenerator(statementGenerator: StatementGenerator): StatementGeneratorE val descriptor = call.descriptor as? ClassConstructorDescriptor ?: throw AssertionError("Class constructor expected: ${call.descriptor}") val constructorSymbol = context.symbolTable.referenceConstructor(descriptor.original) - val irCall = IrDelegatingConstructorCallImpl(startOffset, endOffset, constructorSymbol, getTypeArguments(call.original)) + val irCall = IrDelegatingConstructorCallImpl(startOffset, endOffset, constructorSymbol, descriptor, getTypeArguments(call.original)) irCall.dispatchReceiver = dispatchReceiver?.load() irCall.extensionReceiver = extensionReceiver?.load() addParametersToCall(startOffset, endOffset, call, irCall, descriptor.builtIns.unitType) 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 50ad044255c..11f119f6c4c 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 @@ -29,6 +29,7 @@ class IrDelegatingConstructorCallImpl( startOffset: Int, endOffset: Int, override val symbol: IrConstructorSymbol, + override val descriptor: ClassConstructorDescriptor, typeArguments: Map? = null ) : IrDelegatingConstructorCall, IrCallWithIndexedArgumentsBase( @@ -46,10 +47,9 @@ class IrDelegatingConstructorCallImpl( typeArguments: Map? = null ) : this(startOffset, endOffset, IrConstructorSymbolImpl(constructorDescriptor), + constructorDescriptor, typeArguments) - override val descriptor: ClassConstructorDescriptor get() = symbol.descriptor - override fun accept(visitor: IrElementVisitor, data: D): R { return visitor.visitDelegatingConstructorCall(this, data) } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt index cde4191d643..a276cb296d7 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt @@ -356,6 +356,7 @@ class DeepCopyIrTree(private val symbolsRemapper: DeepCopySymbolsRemapper) : IrE IrDelegatingConstructorCallImpl( expression.startOffset, expression.endOffset, symbolsRemapper.getReferencedConstructor(expression.symbol), + expression.descriptor, expression.getTypeArgumentsMap() ).transformValueArguments(expression) diff --git a/compiler/testData/ir/irText/regressions/typeAliasCtorForGenericClass.txt b/compiler/testData/ir/irText/regressions/typeAliasCtorForGenericClass.txt index 9c89b02cf6e..a7e26678bfa 100644 --- a/compiler/testData/ir/irText/regressions/typeAliasCtorForGenericClass.txt +++ b/compiler/testData/ir/irText/regressions/typeAliasCtorForGenericClass.txt @@ -1,6 +1,9 @@ FILE /typeAliasCtorForGenericClass.kt CLASS CLASS A + $new: VALUE_PARAMETER this@A: A + TYPE_PARAMETER CONSTRUCTOR public constructor A(q: Q) + VALUE_PARAMETER value-parameter q: Q BLOCK_BODY DELEGATING_CONSTRUCTOR_CALL 'constructor Any()' INSTANCE_INITIALIZER_CALL classDescriptor='A' @@ -9,10 +12,14 @@ FILE /typeAliasCtorForGenericClass.kt EXPRESSION_BODY GET_VAR 'value-parameter q: Q' type=Q origin=INITIALIZE_PROPERTY_FROM_PARAMETER FUN DEFAULT_PROPERTY_ACCESSOR public final fun (): Q + $this: VALUE_PARAMETER this@A: A BLOCK_BODY RETURN type=kotlin.Nothing from='(): Q' GET_FIELD 'q: Q' type=Q origin=null - receiver: GET_VAR '' type=A origin=null + receiver: GET_VAR 'this@A: A' type=A origin=null + FUN FAKE_OVERRIDE public open override fun equals(other: kotlin.Any?): kotlin.Boolean + FUN FAKE_OVERRIDE public open override fun hashCode(): kotlin.Int + FUN FAKE_OVERRIDE public open override fun toString(): kotlin.String TYPEALIAS typealias B = A type=A TYPEALIAS typealias B2 = A> type=A> FUN public fun bar(): kotlin.Unit