From b9da331dcda596e6a088c88c006c6b7b7a38ceab Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Tue, 8 May 2018 16:06:50 +0200 Subject: [PATCH] Migrate DescriptorsFactory.getInnerClassConstructorWithOuterThisParameter() API to symbols --- .../common/descriptors/DescriptorsFactory.kt | 4 ++-- .../common/lower/InnerClassesLowering.kt | 20 +++++++++---------- .../ir/backend/js/JsDescriptorsFactory.kt | 14 +++++++------ .../jvm/descriptors/JvmDescriptorsFactory.kt | 13 ++++++------ 4 files changed, 27 insertions(+), 24 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/descriptors/DescriptorsFactory.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/descriptors/DescriptorsFactory.kt index 2c800908b36..0ed28d0af02 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/descriptors/DescriptorsFactory.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/descriptors/DescriptorsFactory.kt @@ -5,8 +5,8 @@ package org.jetbrains.kotlin.backend.common.descriptors -import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor import org.jetbrains.kotlin.ir.declarations.IrClass +import org.jetbrains.kotlin.ir.declarations.IrConstructor import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol import org.jetbrains.kotlin.ir.symbols.IrEnumEntrySymbol @@ -15,6 +15,6 @@ import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol interface DescriptorsFactory { fun getSymbolForEnumEntry(enumEntry: IrEnumEntrySymbol): IrFieldSymbol fun getOuterThisFieldSymbol(innerClass: IrClass): IrFieldSymbol - fun getInnerClassConstructorWithOuterThisParameter(innerClassConstructor: ClassConstructorDescriptor): IrConstructorSymbol + fun getInnerClassConstructorWithOuterThisParameter(innerClassConstructor: IrConstructor): IrConstructorSymbol fun getSymbolForObjectInstance(singleton: IrClassSymbol): IrFieldSymbol } \ No newline at end of file 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 d4a7c582974..aaadc09c65a 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 @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.backend.common.lower import org.jetbrains.kotlin.backend.common.BackendContext import org.jetbrains.kotlin.backend.common.BodyLoweringPass import org.jetbrains.kotlin.backend.common.ClassLoweringPass -import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor import org.jetbrains.kotlin.descriptors.ValueDescriptor @@ -19,6 +18,7 @@ import org.jetbrains.kotlin.ir.declarations.impl.IrConstructorImpl import org.jetbrains.kotlin.ir.declarations.impl.IrFieldImpl import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.* +import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol import org.jetbrains.kotlin.ir.symbols.IrValueSymbol import org.jetbrains.kotlin.ir.util.createParameterDeclarations import org.jetbrains.kotlin.ir.util.dump @@ -90,11 +90,10 @@ class InnerClassesLowering(val context: BackendContext) : ClassLoweringPass { } private fun lowerConstructor(irConstructor: IrConstructor): IrConstructor { - val oldDescriptor = irConstructor.descriptor val startOffset = irConstructor.startOffset val endOffset = irConstructor.endOffset - val newSymbol = context.descriptorsFactory.getInnerClassConstructorWithOuterThisParameter(oldDescriptor) + val newSymbol = context.descriptorsFactory.getInnerClassConstructorWithOuterThisParameter(irConstructor) val loweredConstructor = IrConstructorImpl( startOffset, endOffset, irConstructor.origin, // TODO special origin for lowered inner class constructors? @@ -104,7 +103,7 @@ class InnerClassesLowering(val context: BackendContext) : ClassLoweringPass { loweredConstructor.createParameterDeclarations() val outerThisValueParameter = loweredConstructor.valueParameters[0].symbol - oldDescriptor.valueParameters.forEach { oldValueParameter -> + irConstructor.descriptor.valueParameters.forEach { oldValueParameter -> oldConstructorParameterToNew[oldValueParameter] = loweredConstructor.valueParameters[oldValueParameter.index + 1] } @@ -201,10 +200,11 @@ class InnerClassConstructorCallsLowering(val context: BackendContext) : BodyLowe expression.transformChildrenVoid(this) val dispatchReceiver = expression.dispatchReceiver ?: return expression - val callee = expression.descriptor as? ClassConstructorDescriptor ?: return expression - if (!callee.constructedClass.isInner) return expression + val callee = expression.symbol as? IrConstructorSymbol ?: return expression + val parent = callee.owner.parent as? IrClass ?: return expression + if (!parent.descriptor.isInner) return expression - val newCallee = context.descriptorsFactory.getInnerClassConstructorWithOuterThisParameter(callee) + val newCallee = context.descriptorsFactory.getInnerClassConstructorWithOuterThisParameter(callee.owner) val newCall = IrCallImpl( expression.startOffset, expression.endOffset, newCallee, newCallee.descriptor, null, // TODO type arguments map @@ -223,10 +223,10 @@ class InnerClassConstructorCallsLowering(val context: BackendContext) : BodyLowe expression.transformChildrenVoid(this) val dispatchReceiver = expression.dispatchReceiver ?: return expression - val callee = expression.descriptor - if (!callee.constructedClass.isInner) return expression + val callee = expression.symbol + if (!callee.descriptor.containingDeclaration.isInner) return expression - val newCallee = context.descriptorsFactory.getInnerClassConstructorWithOuterThisParameter(callee) + val newCallee = context.descriptorsFactory.getInnerClassConstructorWithOuterThisParameter(callee.owner) val newCall = IrDelegatingConstructorCallImpl( expression.startOffset, expression.endOffset, newCallee, newCallee.descriptor, null // TODO type arguments map diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsDescriptorsFactory.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsDescriptorsFactory.kt index f637c56adba..9247a3a355b 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsDescriptorsFactory.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsDescriptorsFactory.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.descriptors.impl.ClassConstructorDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl import org.jetbrains.kotlin.ir.declarations.IrClass +import org.jetbrains.kotlin.ir.declarations.IrConstructor import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.symbols.impl.IrConstructorSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl @@ -38,7 +39,7 @@ class JsDescriptorsFactory( ) : DescriptorsFactory { private val singletonFieldDescriptors = HashMap, IrFieldSymbol>() private val outerThisFieldSymbols = HashMap() - private val innerClassConstructors = HashMap() + private val innerClassConstructors = HashMap() override fun getSymbolForEnumEntry(enumEntry: IrEnumEntrySymbol): IrFieldSymbol = TODO() @@ -74,12 +75,13 @@ class JsDescriptorsFactory( }) } - override fun getInnerClassConstructorWithOuterThisParameter(innerClassConstructor: ClassConstructorDescriptor): IrConstructorSymbol { - val innerClass = innerClassConstructor.containingDeclaration - assert(innerClass.isInner) { "Class is not inner: $innerClass" } - return innerClassConstructors.getOrPut(innerClassConstructor) { - createInnerClassConstructorWithOuterThisParameter(innerClassConstructor) + override fun getInnerClassConstructorWithOuterThisParameter(innerClassConstructor: IrConstructor): IrConstructorSymbol { + val innerClass = innerClassConstructor.parent as IrClass + assert(innerClass.descriptor.isInner) { "Class is not inner: $innerClass" } + + return innerClassConstructors.getOrPut(innerClassConstructor.symbol) { + createInnerClassConstructorWithOuterThisParameter(innerClassConstructor.descriptor) } } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDescriptorsFactory.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDescriptorsFactory.kt index b90a233ec2e..ddc9d8f16c5 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDescriptorsFactory.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDescriptorsFactory.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil import org.jetbrains.kotlin.ir.SourceManager import org.jetbrains.kotlin.ir.declarations.IrClass +import org.jetbrains.kotlin.ir.declarations.IrConstructor import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.symbols.impl.IrConstructorSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl @@ -45,7 +46,7 @@ class JvmDescriptorsFactory( ) : DescriptorsFactory { private val singletonFieldDescriptors = HashMap, IrFieldSymbol>() private val outerThisDescriptors = HashMap() - private val innerClassConstructors = HashMap() + private val innerClassConstructors = HashMap() override fun getSymbolForEnumEntry(enumEntry: IrEnumEntrySymbol): IrFieldSymbol = singletonFieldDescriptors.getOrPut(enumEntry) { @@ -79,16 +80,16 @@ class JvmDescriptorsFactory( ) } - override fun getInnerClassConstructorWithOuterThisParameter(innerClassConstructor: ClassConstructorDescriptor): IrConstructorSymbol { - val innerClass = innerClassConstructor.containingDeclaration - assert(innerClass.isInner) { "Class is not inner: $innerClass" } + override fun getInnerClassConstructorWithOuterThisParameter(innerClassConstructor: IrConstructor): IrConstructorSymbol { + assert((innerClassConstructor.parent as IrClass).descriptor.isInner) { "Class is not inner: ${(innerClassConstructor.parent as IrClass).dump()}" } - return innerClassConstructors.getOrPut(innerClassConstructor) { + return innerClassConstructors.getOrPut(innerClassConstructor.symbol) { createInnerClassConstructorWithOuterThisParameter(innerClassConstructor) } } - private fun createInnerClassConstructorWithOuterThisParameter(oldDescriptor: ClassConstructorDescriptor): IrConstructorSymbol { + private fun createInnerClassConstructorWithOuterThisParameter(oldConstructor: IrConstructor): IrConstructorSymbol { + val oldDescriptor = oldConstructor.descriptor val classDescriptor = oldDescriptor.containingDeclaration val outerThisType = (classDescriptor.containingDeclaration as ClassDescriptor).defaultType