From eb6f65276317fdd7c01ffcc0718ca3f07594cd13 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Fri, 25 May 2018 15:04:11 +0300 Subject: [PATCH] IrTypes: IrClass.superTypes can depend on type parameters IrClass.superTypes can depend on type parameters of a class and thus should be initialized after type parameters are in put in scope. --- .../org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt | 4 ++-- .../org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt | 3 ++- .../org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt index df61180021a..02bf781452e 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt @@ -54,6 +54,8 @@ class ClassGenerator( return context.symbolTable.declareClass( startOffset, endOffset, IrDeclarationOrigin.DEFINED, classDescriptor ).buildWithScope { irClass -> + declarationGenerator.generateGlobalTypeParametersDeclarations(irClass, classDescriptor.declaredTypeParameters) + classDescriptor.typeConstructor.supertypes.mapTo(irClass.superTypes) { it.toIrType() } @@ -65,8 +67,6 @@ class ClassGenerator( classDescriptor.thisAsReceiverParameter.type.toIrType() ) - declarationGenerator.generateGlobalTypeParametersDeclarations(irClass, classDescriptor.declaredTypeParameters) - val irPrimaryConstructor = generatePrimaryConstructor(irClass, ktClassOrObject) if (irPrimaryConstructor != null) { generateDeclarationsForPrimaryConstructorParameters(irClass, irPrimaryConstructor, ktClassOrObject) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt index 9e5e2b1a452..146fff21b3f 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt @@ -138,12 +138,13 @@ class DeclarationStubGenerator( private fun generateClassStub(descriptor: ClassDescriptor): IrClass = symbolTable.declareClass(UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, descriptor).also { irClass -> + generateTypeParameterStubs(descriptor.declaredTypeParameters, irClass) + // TODO get rid of code duplication, see ClassGenerator#generateClass descriptor.typeConstructor.supertypes.mapNotNullTo(irClass.superTypes) { it.toIrType() } - generateTypeParameterStubs(descriptor.declaredTypeParameters, irClass) irClass.thisReceiver = descriptor.thisAsReceiverParameter.generateReceiverParameterStub() generateChildStubs(descriptor.constructors, irClass) generateMemberStubs(descriptor.defaultType.memberScope, irClass) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt index 7e6e2c9c658..dd12ad344e6 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt @@ -99,11 +99,11 @@ open class DeepCopyIrTreeWithSymbols( symbolRemapper.getDeclaredClass(declaration.symbol) ).apply { transformAnnotations(declaration) + declaration.typeParameters.transformTo(typeParameters) declaration.superTypes.mapTo(superTypes) { it.remapType() } thisReceiver = declaration.thisReceiver?.transform() - declaration.typeParameters.transformTo(typeParameters) declaration.transformDeclarationsTo(this) }