IrConstructorCall support in JVM_IR, JS_IR, and FIR2IR
This commit is contained in:
+5
@@ -184,6 +184,11 @@ class ClosureAnnotator(declaration: IrDeclaration) {
|
||||
processMemberAccess(expression.symbol.owner)
|
||||
}
|
||||
|
||||
override fun visitConstructorCall(expression: IrConstructorCall) {
|
||||
expression.acceptChildrenVoid(this)
|
||||
processMemberAccess(expression.symbol.owner)
|
||||
}
|
||||
|
||||
override fun visitEnumConstructorCall(expression: IrEnumConstructorCall) {
|
||||
expression.acceptChildrenVoid(this)
|
||||
processMemberAccess(expression.symbol.owner)
|
||||
|
||||
+6
-8
@@ -135,19 +135,17 @@ val innerClassConstructorCallsPhase = makeIrFilePhase(
|
||||
class InnerClassConstructorCallsLowering(val context: BackendContext) : BodyLoweringPass {
|
||||
override fun lower(irBody: IrBody) {
|
||||
irBody.transformChildrenVoid(object : IrElementTransformerVoid() {
|
||||
override fun visitCall(expression: IrCall): IrExpression {
|
||||
override fun visitConstructorCall(expression: IrConstructorCall): IrExpression {
|
||||
expression.transformChildrenVoid(this)
|
||||
|
||||
val dispatchReceiver = expression.dispatchReceiver ?: return expression
|
||||
val callee = expression.symbol as? IrConstructorSymbol ?: return expression
|
||||
val parent = callee.owner.parent as? IrClass ?: return expression
|
||||
val callee = expression.symbol
|
||||
val parent = callee.owner.parentAsClass
|
||||
if (!parent.isInner) return expression
|
||||
|
||||
val newCallee = context.declarationFactory.getInnerClassConstructorWithOuterThisParameter(callee.owner)
|
||||
val newCall = IrCallImpl(
|
||||
expression.startOffset, expression.endOffset, expression.type, newCallee.symbol, newCallee.descriptor,
|
||||
0, // TODO type arguments map
|
||||
expression.origin
|
||||
val newCall = IrConstructorCallImpl.fromSymbolOwner(
|
||||
expression.startOffset, expression.endOffset, expression.type, newCallee.symbol, expression.origin
|
||||
)
|
||||
|
||||
newCall.putValueArgument(0, dispatchReceiver)
|
||||
@@ -163,7 +161,7 @@ class InnerClassConstructorCallsLowering(val context: BackendContext) : BodyLowe
|
||||
|
||||
val dispatchReceiver = expression.dispatchReceiver ?: return expression
|
||||
val classConstructor = expression.symbol.owner
|
||||
if (!(classConstructor.parent as IrClass).isInner) return expression
|
||||
if (!classConstructor.parentAsClass.isInner) return expression
|
||||
|
||||
val newCallee = context.declarationFactory.getInnerClassConstructorWithOuterThisParameter(classConstructor)
|
||||
val newCall = IrDelegatingConstructorCallImpl(
|
||||
|
||||
+20
-1
@@ -289,7 +289,16 @@ class LocalDeclarationsLowering(
|
||||
expression.transformChildrenVoid(this)
|
||||
|
||||
val oldCallee = expression.symbol.owner
|
||||
val newCallee = oldCallee.transformed ?: return expression
|
||||
val newCallee = (oldCallee.transformed ?: return expression) as IrSimpleFunction
|
||||
|
||||
return createNewCall(expression, newCallee).fillArguments2(expression, newCallee)
|
||||
}
|
||||
|
||||
override fun visitConstructorCall(expression: IrConstructorCall): IrExpression {
|
||||
expression.transformChildrenVoid(this)
|
||||
|
||||
val oldCallee = expression.symbol.owner
|
||||
val newCallee = (oldCallee.transformed ?: return expression) as IrConstructor
|
||||
|
||||
return createNewCall(expression, newCallee).fillArguments2(expression, newCallee)
|
||||
}
|
||||
@@ -470,6 +479,16 @@ class LocalDeclarationsLowering(
|
||||
it.copyTypeArgumentsFrom(oldCall)
|
||||
}
|
||||
|
||||
private fun createNewCall(oldCall: IrConstructorCall, newCallee: IrConstructor) =
|
||||
IrConstructorCallImpl.fromSymbolOwner(
|
||||
oldCall.startOffset, oldCall.endOffset,
|
||||
newCallee.returnType,
|
||||
newCallee.symbol,
|
||||
oldCall.origin
|
||||
).also {
|
||||
it.copyTypeArgumentsFrom(oldCall)
|
||||
}
|
||||
|
||||
private fun transformDeclarations() {
|
||||
localFunctions.values.forEach {
|
||||
createLiftedDeclaration(it)
|
||||
|
||||
Reference in New Issue
Block a user