Skip to content

Commit fd25a5b

Browse files
tihonovcoreromanart
authored andcommitted
[JS BE] es6: save instance after superCall
1 parent 8c412ad commit fd25a5b

File tree

2 files changed

+21
-10
lines changed

2 files changed

+21
-10
lines changed

compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,13 @@ class EnumEntryInstancesBodyLowering(val context: JsIrBackendContext) : BodyLowe
362362
val enum = entryClass.parentAsClass
363363
if (enum.goodEnum) {
364364
val entry = enum.declarations.filterIsInstance<IrEnumEntry>().find { it.correspondingClass === entryClass }!!
365-
(irBody as IrBlockBody).statements.add(0, context.createIrBuilder(container.symbol).run {
365+
366+
//In ES6 using `this` before superCall is unavailable, so
367+
//need to find superCall and put `instance = this` after it
368+
val index = (irBody as IrBlockBody).statements
369+
.indexOfFirst { it is IrTypeOperatorCall && it.argument is IrDelegatingConstructorCall } + 1
370+
371+
(irBody as IrBlockBody).statements.add(index, context.createIrBuilder(container.symbol).run {
366372
irSetField(null, entry.correspondingField!!, irGet(entryClass.thisReceiver!!))
367373
})
368374
}

compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ObjectLowering.kt

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,10 @@ import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
1818
import org.jetbrains.kotlin.ir.builders.*
1919
import org.jetbrains.kotlin.ir.builders.declarations.buildField
2020
import org.jetbrains.kotlin.ir.declarations.*
21-
import org.jetbrains.kotlin.ir.expressions.IrBlockBody
22-
import org.jetbrains.kotlin.ir.expressions.IrBody
23-
import org.jetbrains.kotlin.ir.expressions.IrExpression
24-
import org.jetbrains.kotlin.ir.expressions.IrGetObjectValue
21+
import org.jetbrains.kotlin.ir.expressions.*
2522
import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl
2623
import org.jetbrains.kotlin.ir.types.makeNullable
27-
import org.jetbrains.kotlin.ir.util.defaultType
28-
import org.jetbrains.kotlin.ir.util.isEffectivelyExternal
29-
import org.jetbrains.kotlin.ir.util.parentAsClass
30-
import org.jetbrains.kotlin.ir.util.primaryConstructor
24+
import org.jetbrains.kotlin.ir.util.*
3125
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
3226
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
3327
import org.jetbrains.kotlin.name.Name
@@ -87,7 +81,18 @@ class ObjectUsageLowering(
8781
val initInstanceField = context.createIrBuilder(container.symbol).buildStatement(UNDEFINED_OFFSET, UNDEFINED_OFFSET) {
8882
irSetField(null, instanceField, irGet(irClass.thisReceiver!!))
8983
}
90-
(irBody as IrBlockBody).statements.add(0, initInstanceField)
84+
if (context.es6mode) {
85+
//find `superCall` and put after
86+
(irBody as IrBlockBody).statements.transformFlat {
87+
if (it is IrDelegatingConstructorCall) listOf(it, initInstanceField)
88+
else if (it is IrVariable && it.origin === ES6_THIS_VARIABLE_ORIGIN) {
89+
initInstanceField.value = JsIrBuilder.buildGetValue(it.symbol)
90+
listOf(it, initInstanceField)
91+
} else null
92+
}
93+
} else {
94+
(irBody as IrBlockBody).statements.add(0, initInstanceField)
95+
}
9196
}
9297
}
9398

0 commit comments

Comments
 (0)