[JS IR] make InnerClassesLowering.kt work with abscent bodies
This commit is contained in:
committed by
teamcityserver
parent
546ce501cb
commit
1d42b6cb3f
+19
-17
@@ -64,25 +64,27 @@ class InnerClassesLowering(val context: BackendContext, private val innerClasses
|
|||||||
val irClass = irConstructor.parentAsClass
|
val irClass = irConstructor.parentAsClass
|
||||||
val parentThisField = innerClassesSupport.getOuterThisField(irClass)
|
val parentThisField = innerClassesSupport.getOuterThisField(irClass)
|
||||||
|
|
||||||
val blockBody = irConstructor.body as? IrBlockBody ?: throw AssertionError("Unexpected constructor body: ${irConstructor.body}")
|
irConstructor.body?.let { blockBody ->
|
||||||
|
if (blockBody !is IrBlockBody) throw AssertionError("Unexpected constructor body: ${irConstructor.body}")
|
||||||
|
|
||||||
loweredConstructor.body = context.irFactory.createBlockBody(blockBody.startOffset, blockBody.endOffset) {
|
loweredConstructor.body = context.irFactory.createBlockBody(blockBody.startOffset, blockBody.endOffset) {
|
||||||
context.createIrBuilder(irConstructor.symbol, irConstructor.startOffset, irConstructor.endOffset).apply {
|
context.createIrBuilder(irConstructor.symbol, irConstructor.startOffset, irConstructor.endOffset).apply {
|
||||||
statements.add(0, irSetField(irGet(irClass.thisReceiver!!), parentThisField, irGet(outerThisParameter)))
|
statements.add(0, irSetField(irGet(irClass.thisReceiver!!), parentThisField, irGet(outerThisParameter)))
|
||||||
|
}
|
||||||
|
|
||||||
|
statements.addAll(blockBody.statements)
|
||||||
|
|
||||||
|
if (statements.find { it is IrInstanceInitializerCall } == null) {
|
||||||
|
val delegatingConstructorCall =
|
||||||
|
statements.find { it is IrDelegatingConstructorCall } as IrDelegatingConstructorCall?
|
||||||
|
?: throw AssertionError("Delegating constructor call expected: ${irConstructor.dump()}")
|
||||||
|
delegatingConstructorCall.apply { dispatchReceiver = IrGetValueImpl(startOffset, endOffset, outerThisParameter.symbol) }
|
||||||
|
}
|
||||||
|
patchDeclarationParents(loweredConstructor)
|
||||||
|
|
||||||
|
val oldConstructorParameterToNew = innerClassesSupport.primaryConstructorParameterMap(irConstructor)
|
||||||
|
transformChildrenVoid(VariableRemapper(oldConstructorParameterToNew))
|
||||||
}
|
}
|
||||||
|
|
||||||
statements.addAll(blockBody.statements)
|
|
||||||
|
|
||||||
if (statements.find { it is IrInstanceInitializerCall } == null) {
|
|
||||||
val delegatingConstructorCall =
|
|
||||||
statements.find { it is IrDelegatingConstructorCall } as IrDelegatingConstructorCall?
|
|
||||||
?: throw AssertionError("Delegating constructor call expected: ${irConstructor.dump()}")
|
|
||||||
delegatingConstructorCall.apply { dispatchReceiver = IrGetValueImpl(startOffset, endOffset, outerThisParameter.symbol) }
|
|
||||||
}
|
|
||||||
patchDeclarationParents(loweredConstructor)
|
|
||||||
|
|
||||||
val oldConstructorParameterToNew = innerClassesSupport.primaryConstructorParameterMap(irConstructor)
|
|
||||||
transformChildrenVoid(VariableRemapper(oldConstructorParameterToNew))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return loweredConstructor
|
return loweredConstructor
|
||||||
|
|||||||
Reference in New Issue
Block a user