From 1d42b6cb3fc2e0d2c4055bd21a17c082a572c8f0 Mon Sep 17 00:00:00 2001 From: Anton Bannykh Date: Tue, 12 Oct 2021 09:13:40 +0300 Subject: [PATCH] [JS IR] make InnerClassesLowering.kt work with abscent bodies --- .../common/lower/InnerClassesLowering.kt | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) 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 89ff11a3b70..be52e39a710 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 @@ -64,25 +64,27 @@ class InnerClassesLowering(val context: BackendContext, private val innerClasses val irClass = irConstructor.parentAsClass 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) { - context.createIrBuilder(irConstructor.symbol, irConstructor.startOffset, irConstructor.endOffset).apply { - statements.add(0, irSetField(irGet(irClass.thisReceiver!!), parentThisField, irGet(outerThisParameter))) + loweredConstructor.body = context.irFactory.createBlockBody(blockBody.startOffset, blockBody.endOffset) { + context.createIrBuilder(irConstructor.symbol, irConstructor.startOffset, irConstructor.endOffset).apply { + 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