[JS IR BE] Add generating JS AST for "when"
This commit is contained in:
+6
-4
@@ -9,10 +9,7 @@ import org.jetbrains.kotlin.ir.backend.js.utils.isPrimary
|
||||
import org.jetbrains.kotlin.ir.backend.js.utils.parameterCount
|
||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
||||
import org.jetbrains.kotlin.ir.expressions.IrCall
|
||||
import org.jetbrains.kotlin.ir.expressions.IrConst
|
||||
import org.jetbrains.kotlin.ir.expressions.IrConstKind
|
||||
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
|
||||
import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
|
||||
import org.jetbrains.kotlin.js.backend.ast.*
|
||||
|
||||
@@ -73,4 +70,9 @@ class IrElementToJsExpressionTransformer : BaseIrElementToJsNodeTransformer<JsEx
|
||||
|
||||
return JsInvocation(ref, extensionReceiver?.let { listOf(extensionReceiver) + arguments } ?: arguments)
|
||||
}
|
||||
|
||||
override fun visitWhen(expression: IrWhen, data: Nothing?): JsExpression {
|
||||
// TODO check when w/o else branch and empty when
|
||||
return expression.toJsNode(this, data, ::JsConditional)!!
|
||||
}
|
||||
}
|
||||
+4
@@ -37,4 +37,8 @@ class IrElementToJsStatementTransformer : BaseIrElementToJsNodeTransformer<JsSta
|
||||
override fun visitVariable(declaration: IrVariable, data: Nothing?): JsStatement {
|
||||
return jsVar(declaration.name, declaration.initializer)
|
||||
}
|
||||
|
||||
override fun visitWhen(expression: IrWhen, data: Nothing?): JsStatement {
|
||||
return expression.toJsNode(this, data, ::JsIf) ?: JsEmpty
|
||||
}
|
||||
}
|
||||
|
||||
+16
-1
@@ -5,8 +5,13 @@
|
||||
|
||||
package org.jetbrains.kotlin.ir.backend.js.transformers.irToJs
|
||||
|
||||
import org.jetbrains.kotlin.ir.expressions.IrBranch
|
||||
import org.jetbrains.kotlin.ir.expressions.IrElseBranch
|
||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||
import org.jetbrains.kotlin.ir.expressions.IrWhen
|
||||
import org.jetbrains.kotlin.js.backend.ast.JsDynamicScope
|
||||
import org.jetbrains.kotlin.js.backend.ast.JsExpression
|
||||
import org.jetbrains.kotlin.js.backend.ast.JsNode
|
||||
import org.jetbrains.kotlin.js.backend.ast.JsVars
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
@@ -20,4 +25,14 @@ fun Name.toJsName() =
|
||||
fun jsVar(name: Name, initializer: IrExpression?): JsVars {
|
||||
val jsInitializer = initializer?.accept(IrElementToJsExpressionTransformer(), null)
|
||||
return JsVars(JsVars.JsVar(name.toJsName(), jsInitializer))
|
||||
}
|
||||
}
|
||||
|
||||
fun <T : JsNode, D : Nothing?> IrWhen.toJsNode(tr: BaseIrElementToJsNodeTransformer<T, D>, data: D, node: (JsExpression, T, T?) -> T): T? =
|
||||
branches.foldRight<IrBranch, T?>(null) { br, n ->
|
||||
val body = br.result.accept(tr, data)
|
||||
if (br is IrElseBranch) body
|
||||
else {
|
||||
val condition = br.condition.accept(IrElementToJsExpressionTransformer(), data)
|
||||
node(condition, body, n)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user