[K/JS] Add VOID optimization on object properties + align with the optimization the JS Plain Object plugin
This commit is contained in:
+49
-2
@@ -10,10 +10,13 @@ import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
|
||||
import org.jetbrains.kotlin.backend.common.lower
|
||||
import org.jetbrains.kotlin.builtins.StandardNames
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.declarations.impl.IrVariableImpl
|
||||
import org.jetbrains.kotlin.ir.expressions.IrBlockBody
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.*
|
||||
import org.jetbrains.kotlin.ir.symbols.UnsafeDuringIrConstructionAPI
|
||||
import org.jetbrains.kotlin.ir.symbols.impl.IrVariableSymbolImpl
|
||||
import org.jetbrains.kotlin.ir.util.*
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
import org.jetbrains.kotlinx.jspo.compiler.resolve.JsPlainObjectsPluginKey
|
||||
import org.jetbrains.kotlinx.jspo.compiler.resolve.StandardIds
|
||||
@@ -32,7 +35,8 @@ private class MoveExternalInlineFunctionsWithBodiesOutsideLowering(private val c
|
||||
file.declarations.add(declaration)
|
||||
|
||||
declaration.body = when (declaration.name) {
|
||||
StandardNames.DATA_CLASS_COPY, OperatorNameConventions.INVOKE -> declaration.generateBodyForFactoryAndCopyFunction()
|
||||
StandardNames.DATA_CLASS_COPY -> declaration.generateBodyForCopyFunction()
|
||||
OperatorNameConventions.INVOKE -> declaration.generateBodyForFactoryFunction()
|
||||
else -> error("Unexpected function with name `${declaration.name.identifier}`")
|
||||
}
|
||||
|
||||
@@ -42,7 +46,7 @@ private class MoveExternalInlineFunctionsWithBodiesOutsideLowering(private val c
|
||||
return emptyList()
|
||||
}
|
||||
|
||||
private fun IrSimpleFunction.generateBodyForFactoryAndCopyFunction(): IrBlockBody {
|
||||
private fun IrSimpleFunction.generateBodyForFactoryFunction(): IrBlockBody {
|
||||
val declaration = this
|
||||
return context.irFactory.createBlockBody(startOffset, declaration.endOffset).apply {
|
||||
statements += IrReturnImpl(
|
||||
@@ -64,6 +68,49 @@ private class MoveExternalInlineFunctionsWithBodiesOutsideLowering(private val c
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun IrSimpleFunction.generateBodyForCopyFunction(): IrBlockBody {
|
||||
val declaration = this
|
||||
return context.irFactory.createBlockBody(startOffset, declaration.endOffset).apply {
|
||||
val selfName = Name.identifier("${"$$"}tmp_self${"$$"}")
|
||||
statements += IrVariableImpl(
|
||||
declaration.startOffset,
|
||||
declaration.endOffset,
|
||||
IrDeclarationOrigin.IR_TEMPORARY_VARIABLE,
|
||||
IrVariableSymbolImpl(),
|
||||
selfName,
|
||||
context.irBuiltIns.nothingType,
|
||||
isVar = false,
|
||||
isConst = false,
|
||||
isLateinit = false
|
||||
).apply {
|
||||
parent = declaration
|
||||
initializer = IrGetValueImpl(
|
||||
declaration.startOffset,
|
||||
declaration.endOffset,
|
||||
declaration.dispatchReceiverParameter!!.symbol
|
||||
)
|
||||
}
|
||||
statements += IrReturnImpl(
|
||||
declaration.startOffset,
|
||||
declaration.endOffset,
|
||||
declaration.returnType,
|
||||
declaration.symbol,
|
||||
IrCallImpl(
|
||||
declaration.startOffset,
|
||||
declaration.endOffset,
|
||||
declaration.returnType,
|
||||
jsFunction,
|
||||
0,
|
||||
1,
|
||||
).apply {
|
||||
val jsObject = "{ ${declaration.valueParameters.joinToString(", ") { "${it.name.identifier}:${it.name.identifier}" }} }"
|
||||
val objectAssignCall = "Object.assign({}, ${selfName.identifier}, $jsObject)"
|
||||
putValueArgument(0, objectAssignCall.toIrConst(context.irBuiltIns.stringType))
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
open class JsPlainObjectsLoweringExtension : IrGenerationExtension {
|
||||
|
||||
Reference in New Issue
Block a user