[JS BE] es6: save instance after superCall
This commit is contained in:
+7
-1
@@ -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!!))
|
||||
})
|
||||
}
|
||||
|
||||
+14
-9
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user