[JS IR BE] Add generating JS AST for "when"

This commit is contained in:
Zalim Bashorov
2018-03-21 22:46:37 +03:00
parent d46bba1521
commit 52e2fb7a4e
3 changed files with 26 additions and 5 deletions
@@ -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)!!
}
}
@@ -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
}
}
@@ -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)
}
}