[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
|
val enum = entryClass.parentAsClass
|
||||||
if (enum.goodEnum) {
|
if (enum.goodEnum) {
|
||||||
val entry = enum.declarations.filterIsInstance<IrEnumEntry>().find { it.correspondingClass === entryClass }!!
|
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!!))
|
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.*
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.buildField
|
import org.jetbrains.kotlin.ir.builders.declarations.buildField
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrBlockBody
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
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.impl.IrBlockBodyImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl
|
||||||
import org.jetbrains.kotlin.ir.types.makeNullable
|
import org.jetbrains.kotlin.ir.types.makeNullable
|
||||||
import org.jetbrains.kotlin.ir.util.defaultType
|
import org.jetbrains.kotlin.ir.util.*
|
||||||
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.visitors.IrElementTransformerVoid
|
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
@@ -87,7 +81,18 @@ class ObjectUsageLowering(
|
|||||||
val initInstanceField = context.createIrBuilder(container.symbol).buildStatement(UNDEFINED_OFFSET, UNDEFINED_OFFSET) {
|
val initInstanceField = context.createIrBuilder(container.symbol).buildStatement(UNDEFINED_OFFSET, UNDEFINED_OFFSET) {
|
||||||
irSetField(null, instanceField, irGet(irClass.thisReceiver!!))
|
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