[K/JS] Add VOID optimization on object properties + align with the optimization the JS Plain Object plugin
This commit is contained in:
@@ -11,6 +11,8 @@ import org.jetbrains.kotlin.backend.common.phaser.invokeToplevel
|
||||
import org.jetbrains.kotlin.ir.backend.js.dce.DceDumpNameCache
|
||||
import org.jetbrains.kotlin.ir.backend.js.dce.eliminateDeadDeclarations
|
||||
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.JsIrProgramFragment
|
||||
import org.jetbrains.kotlin.ir.backend.js.utils.JsStaticContext
|
||||
import org.jetbrains.kotlin.ir.backend.js.utils.getVoid
|
||||
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
||||
import org.jetbrains.kotlin.js.backend.ast.JsClass
|
||||
import org.jetbrains.kotlin.js.backend.ast.JsFunction
|
||||
@@ -35,11 +37,13 @@ fun optimizeProgramByIr(
|
||||
}
|
||||
}
|
||||
|
||||
fun optimizeFragmentByJsAst(fragment: JsIrProgramFragment) {
|
||||
fun optimizeFragmentByJsAst(fragment: JsIrProgramFragment, context: JsStaticContext) {
|
||||
val voidName = context.backendContext.intrinsics.void.owner.backingField?.let(context::getNameForField)
|
||||
|
||||
val optimizer = object : RecursiveJsVisitor() {
|
||||
override fun visitFunction(x: JsFunction) {
|
||||
super.visitFunction(x)
|
||||
FunctionPostProcessor(x).apply()
|
||||
FunctionPostProcessor(x, voidName).apply()
|
||||
}
|
||||
|
||||
override fun visitClass(x: JsClass) {
|
||||
|
||||
+1
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.ir.backend.js.utils.JsGenerationContext
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.util.hasAnnotation
|
||||
import org.jetbrains.kotlin.js.backend.ast.*
|
||||
import org.jetbrains.kotlin.js.backend.ast.metadata.constant
|
||||
|
||||
@Suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE")
|
||||
class IrDeclarationToJsTransformer : BaseIrElementToJsNodeTransformer<JsStatement, JsGenerationContext> {
|
||||
|
||||
+1
-1
@@ -471,7 +471,7 @@ class IrModuleToJsTransformer(
|
||||
result.computeAndSaveDefinitions(definitionSet, fileExports)
|
||||
|
||||
if (optimizeGeneratedJs) {
|
||||
optimizeFragmentByJsAst(result)
|
||||
optimizeFragmentByJsAst(result, staticContext)
|
||||
}
|
||||
|
||||
return JsIrProgramFragments(result, exportFragment)
|
||||
|
||||
+6
-1
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
||||
import org.jetbrains.kotlin.ir.types.IrSimpleType
|
||||
import org.jetbrains.kotlin.ir.util.*
|
||||
import org.jetbrains.kotlin.js.backend.ast.*
|
||||
import org.jetbrains.kotlin.js.backend.ast.metadata.constant
|
||||
import org.jetbrains.kotlin.utils.DFS
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
|
||||
@@ -50,7 +51,11 @@ class JsNameLinkingNamer(
|
||||
}
|
||||
}
|
||||
|
||||
return declaration.getName()
|
||||
return declaration.getName().also {
|
||||
if (declaration == context.intrinsics.void.owner.backingField) {
|
||||
it.constant = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun getNameForMemberFunction(function: IrSimpleFunction): JsName {
|
||||
|
||||
+1
@@ -459,6 +459,7 @@ private class JsIrAstDeserializer(private val source: ByteArray) {
|
||||
} ?: JsDynamicScope.declareName(identifier)
|
||||
ifTrue { name.localAlias = readLocalAlias() }
|
||||
ifTrue { name.imported = true }
|
||||
ifTrue { name.constant = true }
|
||||
ifTrue { name.specialFunction = specialFunctionValues[readInt()] }
|
||||
return name
|
||||
}
|
||||
|
||||
+1
@@ -605,6 +605,7 @@ private class JsIrAstSerializer {
|
||||
writeBoolean(name.isTemporary)
|
||||
ifNotNull(name.localAlias) { writeLocalAlias(it) }
|
||||
writeBoolean(name.imported && name !in importedNames)
|
||||
writeBoolean(name.constant)
|
||||
ifNotNull(name.specialFunction) { writeByte(it.ordinal) }
|
||||
}
|
||||
nameMap.size
|
||||
|
||||
Reference in New Issue
Block a user