[JS IR] Add init function call into first step of property accessor
^KT-43222 fixed
This commit is contained in:
+44
-21
@@ -14,10 +14,8 @@ import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
|
|||||||
import org.jetbrains.kotlin.ir.builders.declarations.addFunction
|
import org.jetbrains.kotlin.ir.builders.declarations.addFunction
|
||||||
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.IrExpression
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrGetField
|
import org.jetbrains.kotlin.ir.util.statements
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrSetField
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrWhen
|
|
||||||
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
|
||||||
@@ -57,7 +55,7 @@ class PropertyLazyInitLowering(private val context: JsIrBackendContext) : FileLo
|
|||||||
parent = irFile
|
parent = irFile
|
||||||
}
|
}
|
||||||
|
|
||||||
irFactory.addFunction(irFile) {
|
val initialiseFun = irFactory.addFunction(irFile) {
|
||||||
name = Name.identifier("init properties $fileName")
|
name = Name.identifier("init properties $fileName")
|
||||||
returnType = irBuiltIns.unitType
|
returnType = irBuiltIns.unitType
|
||||||
origin = JsIrBuilder.SYNTHESIZED_DECLARATION
|
origin = JsIrBuilder.SYNTHESIZED_DECLARATION
|
||||||
@@ -67,6 +65,17 @@ class PropertyLazyInitLowering(private val context: JsIrBackendContext) : FileLo
|
|||||||
initialisedField
|
initialisedField
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
properties
|
||||||
|
.asSequence()
|
||||||
|
.flatMap { sequenceOf(it.getter, it.setter) }
|
||||||
|
.filterNotNull()
|
||||||
|
.forEach { function ->
|
||||||
|
val newBody = function.body?.let { body ->
|
||||||
|
irFactory.bodyWithFunctionCall(body, initialiseFun)
|
||||||
|
}
|
||||||
|
function.body = newBody
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun IrFactory.createInitialisationField(fileName: String): IrField =
|
private fun IrFactory.createInitialisationField(fileName: String): IrField =
|
||||||
@@ -113,24 +122,38 @@ class PropertyLazyInitLowering(private val context: JsIrBackendContext) : FileLo
|
|||||||
)
|
)
|
||||||
).let { listOf(it) }
|
).let { listOf(it) }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createIrGetField(field: IrField): IrGetField {
|
|
||||||
return JsIrBuilder.buildGetField(
|
|
||||||
symbol = field.symbol,
|
|
||||||
receiver = null
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createIrSetField(field: IrField, expression: IrExpression): IrSetField {
|
|
||||||
return JsIrBuilder.buildSetField(
|
|
||||||
symbol = field.symbol,
|
|
||||||
receiver = null,
|
|
||||||
value = expression,
|
|
||||||
type = expression.type
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun createIrGetField(field: IrField): IrGetField {
|
||||||
|
return JsIrBuilder.buildGetField(
|
||||||
|
symbol = field.symbol,
|
||||||
|
receiver = null
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createIrSetField(field: IrField, expression: IrExpression): IrSetField {
|
||||||
|
return JsIrBuilder.buildSetField(
|
||||||
|
symbol = field.symbol,
|
||||||
|
receiver = null,
|
||||||
|
value = expression,
|
||||||
|
type = expression.type
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun IrFactory.bodyWithFunctionCall(
|
||||||
|
body: IrBody,
|
||||||
|
functionToCall: IrSimpleFunction
|
||||||
|
): IrBody = createBlockBody(
|
||||||
|
body.startOffset,
|
||||||
|
body.endOffset,
|
||||||
|
mutableListOf<IrStatement>(
|
||||||
|
JsIrBuilder.buildCall(
|
||||||
|
target = functionToCall.symbol,
|
||||||
|
type = functionToCall.returnType
|
||||||
|
)
|
||||||
|
).apply { addAll(body.statements) }
|
||||||
|
)
|
||||||
|
|
||||||
private class PropertySearcher : IrElementTransformerVoid() {
|
private class PropertySearcher : IrElementTransformerVoid() {
|
||||||
|
|
||||||
private val propertyToFunction = mutableSetOf<IrProperty>()
|
private val propertyToFunction = mutableSetOf<IrProperty>()
|
||||||
|
|||||||
Reference in New Issue
Block a user