[K/JS] Remove unused Unit_getInstance import into generated code

This commit is contained in:
Artem Kobzar
2023-03-09 16:51:07 +00:00
committed by Space Team
parent 60787e9fe4
commit 484e5afb59
4 changed files with 42 additions and 21 deletions
@@ -90,50 +90,56 @@ class IrElementToJsStatementTransformer : BaseIrElementToJsNodeTransformer<JsSta
return JsContinue(context.getNameForLoop(jump.loop)?.let { JsNameRef(it) }).withSource(jump, context) return JsContinue(context.getNameForLoop(jump.loop)?.let { JsNameRef(it) }).withSource(jump, context)
} }
private fun IrExpression.maybeOptimizeIntoSwitch(context: JsGenerationContext, transformer: (JsExpression) -> JsStatement): JsStatement { private fun IrExpression.maybeOptimizeIntoSwitch(
context: JsGenerationContext,
transformer: (() -> JsExpression) -> JsStatement
): JsStatement {
if (this is IrWhen) { if (this is IrWhen) {
val stmtTransformer = { stmt: JsStatement -> val stmtTransformer: (() -> JsStatement) -> JsStatement = {
assert(stmt is JsExpressionStatement) { "${render()} is not a statement $stmt" } transformer {
transformer((stmt as JsExpressionStatement).expression) val stmt = it()
assert(stmt is JsExpressionStatement) { "${render()} is not a statement $stmt" }
(stmt as JsExpressionStatement).expression
}
} }
SwitchOptimizer(context, isExpression = true, stmtTransformer).tryOptimize(this)?.let { return it } SwitchOptimizer(context, isExpression = true, stmtTransformer).tryOptimize(this)?.let { return it }
} }
return transformer(accept(IrElementToJsExpressionTransformer(), context)) return transformer { accept(IrElementToJsExpressionTransformer(), context) }
} }
override fun visitSetField(expression: IrSetField, context: JsGenerationContext): JsStatement { override fun visitSetField(expression: IrSetField, context: JsGenerationContext): JsStatement {
val fieldName = context.getNameForField(expression.symbol.owner) val fieldName = context.getNameForField(expression.symbol.owner)
val expressionTransformer = IrElementToJsExpressionTransformer() val expressionTransformer = IrElementToJsExpressionTransformer()
val dest = jsElementAccess(fieldName, expression.receiver?.accept(expressionTransformer, context)) val dest = jsElementAccess(fieldName, expression.receiver?.accept(expressionTransformer, context))
return expression.value.maybeOptimizeIntoSwitch(context) { jsAssignment(dest, it).withSource(expression, context).makeStmt() } return expression.value.maybeOptimizeIntoSwitch(context) { jsAssignment(dest, it()).withSource(expression, context).makeStmt() }
} }
override fun visitSetValue(expression: IrSetValue, context: JsGenerationContext): JsStatement { override fun visitSetValue(expression: IrSetValue, context: JsGenerationContext): JsStatement {
val owner = expression.symbol.owner val owner = expression.symbol.owner
val ref = JsNameRef(context.getNameForValueDeclaration(owner)) val ref = JsNameRef(context.getNameForValueDeclaration(owner))
return expression.value.maybeOptimizeIntoSwitch(context) { jsAssignment(ref, it).withSource(expression, context).makeStmt() } return expression.value.maybeOptimizeIntoSwitch(context) { jsAssignment(ref, it()).withSource(expression, context).makeStmt() }
} }
override fun visitReturn(expression: IrReturn, context: JsGenerationContext): JsStatement { override fun visitReturn(expression: IrReturn, context: JsGenerationContext): JsStatement {
val targetSymbol = expression.returnTargetSymbol val targetSymbol = expression.returnTargetSymbol
val lastStatementTransformer: (JsExpression) -> JsStatement = val lastStatementTransformer: (() -> JsExpression) -> JsStatement =
if (targetSymbol is IrReturnableBlockSymbol) { if (targetSymbol is IrReturnableBlockSymbol) {
// TODO assert that value is Unit? // TODO assert that value is Unit?
{ {
context.getNameForReturnableBlock(targetSymbol.owner) context.getNameForReturnableBlock(targetSymbol.owner)
.takeIf { !expression.isTheLastReturnStatementIn(targetSymbol) } .takeIf { !expression.isTheLastReturnStatementIn(targetSymbol) }
?.run { JsBreak(makeRef()) } ?: JsEmpty ?.run { JsBreak(makeRef()) } ?: JsEmpty
} }
} else { } else {
{ JsReturn(it) } { JsReturn(it()) }
} }
return expression.value.maybeOptimizeIntoSwitch(context, lastStatementTransformer).withSource(expression, context) return expression.value.maybeOptimizeIntoSwitch(context, lastStatementTransformer).withSource(expression, context)
} }
override fun visitThrow(expression: IrThrow, context: JsGenerationContext): JsStatement { override fun visitThrow(expression: IrThrow, context: JsGenerationContext): JsStatement {
return expression.value.maybeOptimizeIntoSwitch(context) { JsThrow(it) }.withSource(expression, context) return expression.value.maybeOptimizeIntoSwitch(context) { JsThrow(it()) }.withSource(expression, context)
} }
override fun visitVariable(declaration: IrVariable, context: JsGenerationContext): JsStatement { override fun visitVariable(declaration: IrVariable, context: JsGenerationContext): JsStatement {
@@ -142,8 +148,8 @@ class IrElementToJsStatementTransformer : BaseIrElementToJsNodeTransformer<JsSta
if (value is IrWhen) { if (value is IrWhen) {
val varRef = varName.makeRef() val varRef = varName.makeRef()
val transformer = { stmt: JsStatement -> val transformer: (() -> JsStatement) -> JsStatement = {
val expr = (stmt as JsExpressionStatement).expression val expr = (it() as JsExpressionStatement).expression
JsBinaryOperation(JsBinaryOperator.ASG, varRef, expr).makeStmt() JsBinaryOperation(JsBinaryOperator.ASG, varRef, expr).makeStmt()
} }
@@ -11,10 +11,14 @@ import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.js.backend.ast.* import org.jetbrains.kotlin.js.backend.ast.*
class SwitchOptimizer(private val context: JsGenerationContext, private val isExpression: Boolean, private val lastStatementTransformer: (JsStatement) -> JsStatement) { class SwitchOptimizer(
private val context: JsGenerationContext,
private val isExpression: Boolean,
private val lastStatementTransformer: (() -> JsStatement) -> JsStatement
) {
// TODO: reimplement optimization on top of IR // TODO: reimplement optimization on top of IR
constructor(context: JsGenerationContext) : this(context, isExpression = false, { it }) constructor(context: JsGenerationContext) : this(context, isExpression = false, { it() })
private val jsEqeqeq = context.staticContext.backendContext.intrinsics.jsEqeqeq private val jsEqeqeq = context.staticContext.backendContext.intrinsics.jsEqeqeq
private val jsEqeq = context.staticContext.backendContext.intrinsics.jsEqeq private val jsEqeq = context.staticContext.backendContext.intrinsics.jsEqeq
@@ -145,8 +149,7 @@ class SwitchOptimizer(private val context: JsGenerationContext, private val isEx
} }
val lastStatement = if (isExpression) { val lastStatement = if (isExpression) {
val expression = case.body.accept(exprTransformer, context).makeStmt() val lastStatement = lastStatementTransformer { case.body.accept(exprTransformer, context).makeStmt() }
val lastStatement = lastStatementTransformer(expression)
jsCase.statements += lastStatement jsCase.statements += lastStatement
lastStatement lastStatement
} else { } else {
@@ -154,7 +157,7 @@ class SwitchOptimizer(private val context: JsGenerationContext, private val isEx
var lastStatement = jsBody.statements.lastOrNull() var lastStatement = jsBody.statements.lastOrNull()
if (lastStatement != null) { if (lastStatement != null) {
lastStatement = lastStatementTransformer(lastStatement) lastStatement = lastStatementTransformer { lastStatement!! }
jsBody.statements[jsBody.statements.lastIndex] = lastStatement jsBody.statements[jsBody.statements.lastIndex] = lastStatement
} }
@@ -12,6 +12,12 @@ STEP 3:
STEP 4: STEP 4:
libs: lib1, main libs: lib1, main
dirty js: main dirty js: main
STEP 5..9: STEP 5..6:
libs: lib1, main
dirty js: lib1, main
STEP 7:
libs: lib1, main
dirty js: main
STEP 8..9:
libs: lib1, main libs: lib1, main
dirty js: lib1, main dirty js: lib1, main
@@ -1,6 +1,12 @@
MODULES: lib1, main MODULES: lib1, main
STEP 0..3: STEP 0..1:
libs: lib1, main
dirty js: lib1, main
STEP 2:
libs: lib1, main
dirty js: lib1
STEP 3:
libs: lib1, main libs: lib1, main
dirty js: lib1, main dirty js: lib1, main
STEP 4: STEP 4: