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 b6204271665..daf55fae955 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 @@ -20,7 +20,10 @@ 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.* +import org.jetbrains.kotlin.ir.util.createParameterDeclarations +import org.jetbrains.kotlin.ir.util.defaultType +import org.jetbrains.kotlin.ir.util.dump +import org.jetbrains.kotlin.ir.util.transformFlat import org.jetbrains.kotlin.ir.visitors.* import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitClassReceiver import java.util.* @@ -29,12 +32,9 @@ class InnerClassesLowering(val context: BackendContext) : ClassLoweringPass { object FIELD_FOR_OUTER_THIS : IrDeclarationOriginImpl("FIELD_FOR_OUTER_THIS") override fun lower(irClass: IrClass) { - TODO() -// InnerClassTransformer(irClass).lowerInnerClass() + InnerClassTransformer(irClass).lowerInnerClass() } - /* - private inner class InnerClassTransformer(val irClass: IrClass) { lateinit var outerThisField: IrField @@ -70,12 +70,14 @@ class InnerClassesLowering(val context: BackendContext) : ClassLoweringPass { } private fun createOuterThisField() { + val fieldSymbol = context.descriptorsFactory.getOuterThisFieldSymbol(irClass) irClass.declarations.add( IrFieldImpl( irClass.startOffset, irClass.endOffset, FIELD_FOR_OUTER_THIS, - context.descriptorsFactory.getOuterThisFieldSymbol(irClass) - ).also { + fieldSymbol, + irClass.defaultType + ).also { outerThisField = it } ) @@ -100,7 +102,10 @@ class InnerClassesLowering(val context: BackendContext) : ClassLoweringPass { irConstructor.origin, // TODO special origin for lowered inner class constructors? newSymbol, null - ) + ).apply { + returnType = irConstructor.returnType + } + loweredConstructor.createParameterDeclarations() val outerThisValueParameter = loweredConstructor.valueParameters[0].symbol @@ -118,7 +123,8 @@ class InnerClassesLowering(val context: BackendContext) : ClassLoweringPass { IrSetFieldImpl( startOffset, endOffset, outerThisField.symbol, IrGetValueImpl(startOffset, endOffset, irClass.thisReceiver!!.symbol), - IrGetValueImpl(startOffset, endOffset, outerThisValueParameter) + IrGetValueImpl(startOffset, endOffset, outerThisValueParameter), + context.irBuiltIns.unitType ) ) } else { @@ -169,7 +175,7 @@ class InnerClassesLowering(val context: BackendContext) : ClassLoweringPass { } val outerThisField = context.descriptorsFactory.getOuterThisFieldSymbol(innerClass) - irThis = IrGetFieldImpl(startOffset, endOffset, outerThisField, irThis, origin) + irThis = IrGetFieldImpl(startOffset, endOffset, outerThisField, innerClass.defaultType, irThis, origin) val outer = innerClass.parent innerClass = outer as? IrClass ?: @@ -192,14 +198,10 @@ class InnerClassesLowering(val context: BackendContext) : ClassLoweringPass { return null } } - - */ } class InnerClassConstructorCallsLowering(val context: BackendContext) : BodyLoweringPass { override fun lower(irBody: IrBody) { - TODO() - /* irBody.transformChildrenVoid(object : IrElementTransformerVoid() { override fun visitCall(expression: IrCall): IrExpression { expression.transformChildrenVoid(this) @@ -211,8 +213,8 @@ class InnerClassConstructorCallsLowering(val context: BackendContext) : BodyLowe val newCallee = context.descriptorsFactory.getInnerClassConstructorWithOuterThisParameter(callee.owner) val newCall = IrCallImpl( - expression.startOffset, expression.endOffset, newCallee, newCallee.descriptor, - null, // TODO type arguments map + expression.startOffset, expression.endOffset, expression.type, newCallee, newCallee.descriptor, + 0, // TODO type arguments map expression.origin ) @@ -233,7 +235,7 @@ class InnerClassConstructorCallsLowering(val context: BackendContext) : BodyLowe val newCallee = context.descriptorsFactory.getInnerClassConstructorWithOuterThisParameter(classConstructor) val newCall = IrDelegatingConstructorCallImpl( - expression.startOffset, expression.endOffset, newCallee, newCallee.descriptor, + expression.startOffset, expression.endOffset, expression.type, newCallee, newCallee.descriptor, classConstructor.typeParameters.size ).apply { copyTypeArgumentsFrom(expression) } @@ -247,7 +249,6 @@ class InnerClassConstructorCallsLowering(val context: BackendContext) : BodyLowe // TODO callable references? }) - */ } }