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