[JS BE] es6: save instance after superCall

This commit is contained in:
Vitaly
2020-05-09 14:14:15 +03:00
committed by romanart
parent 8c412adfaa
commit fd25a5b3c8
2 changed files with 21 additions and 10 deletions
@@ -362,7 +362,13 @@ class EnumEntryInstancesBodyLowering(val context: JsIrBackendContext) : BodyLowe
val enum = entryClass.parentAsClass
if (enum.goodEnum) {
val entry = enum.declarations.filterIsInstance<IrEnumEntry>().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!!))
})
}
@@ -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)
}
}
}