IR BE common: fix InnerClassesLowering
(cherry picked from commit 4239a5f)
This commit is contained in:
committed by
Dmitry Petrov
parent
072804af52
commit
d5906dd584
+19
-18
@@ -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?
|
||||
})
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user