diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt index 314e5de8e4e..af8456175ae 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt @@ -362,7 +362,13 @@ class EnumEntryInstancesBodyLowering(val context: JsIrBackendContext) : BodyLowe val enum = entryClass.parentAsClass if (enum.goodEnum) { val entry = enum.declarations.filterIsInstance().find { it.correspondingClass === entryClass }!! - (irBody as IrBlockBody).statements.add(0, context.createIrBuilder(container.symbol).run { + + //In ES6 using `this` before superCall is unavailable, so + //need to find superCall and put `instance = this` after it + val index = (irBody as IrBlockBody).statements + .indexOfFirst { it is IrTypeOperatorCall && it.argument is IrDelegatingConstructorCall } + 1 + + (irBody as IrBlockBody).statements.add(index, context.createIrBuilder(container.symbol).run { irSetField(null, entry.correspondingField!!, irGet(entryClass.thisReceiver!!)) }) } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ObjectLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ObjectLowering.kt index 4515d693bc8..b9bf21f9cc5 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ObjectLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ObjectLowering.kt @@ -18,16 +18,10 @@ import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.builders.declarations.buildField import org.jetbrains.kotlin.ir.declarations.* -import org.jetbrains.kotlin.ir.expressions.IrBlockBody -import org.jetbrains.kotlin.ir.expressions.IrBody -import org.jetbrains.kotlin.ir.expressions.IrExpression -import org.jetbrains.kotlin.ir.expressions.IrGetObjectValue +import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl import org.jetbrains.kotlin.ir.types.makeNullable -import org.jetbrains.kotlin.ir.util.defaultType -import org.jetbrains.kotlin.ir.util.isEffectivelyExternal -import org.jetbrains.kotlin.ir.util.parentAsClass -import org.jetbrains.kotlin.ir.util.primaryConstructor +import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.name.Name @@ -87,7 +81,18 @@ class ObjectUsageLowering( val initInstanceField = context.createIrBuilder(container.symbol).buildStatement(UNDEFINED_OFFSET, UNDEFINED_OFFSET) { irSetField(null, instanceField, irGet(irClass.thisReceiver!!)) } - (irBody as IrBlockBody).statements.add(0, initInstanceField) + if (context.es6mode) { + //find `superCall` and put after + (irBody as IrBlockBody).statements.transformFlat { + if (it is IrDelegatingConstructorCall) listOf(it, initInstanceField) + else if (it is IrVariable && it.origin === ES6_THIS_VARIABLE_ORIGIN) { + initInstanceField.value = JsIrBuilder.buildGetValue(it.symbol) + listOf(it, initInstanceField) + } else null + } + } else { + (irBody as IrBlockBody).statements.add(0, initInstanceField) + } } }