[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.backend.js.utils.parameterCount
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrCall
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
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.symbols.IrConstructorSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
|
||||||
import org.jetbrains.kotlin.js.backend.ast.*
|
import org.jetbrains.kotlin.js.backend.ast.*
|
||||||
|
|
||||||
@@ -73,4 +70,9 @@ class IrElementToJsExpressionTransformer : BaseIrElementToJsNodeTransformer<JsEx
|
|||||||
|
|
||||||
return JsInvocation(ref, extensionReceiver?.let { listOf(extensionReceiver) + arguments } ?: arguments)
|
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 {
|
override fun visitVariable(declaration: IrVariable, data: Nothing?): JsStatement {
|
||||||
return jsVar(declaration.name, declaration.initializer)
|
return jsVar(declaration.name, declaration.initializer)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun visitWhen(expression: IrWhen, data: Nothing?): JsStatement {
|
||||||
|
return expression.toJsNode(this, data, ::JsIf) ?: JsEmpty
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+15
@@ -5,8 +5,13 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.ir.backend.js.transformers.irToJs
|
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.IrExpression
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrWhen
|
||||||
import org.jetbrains.kotlin.js.backend.ast.JsDynamicScope
|
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.js.backend.ast.JsVars
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
@@ -21,3 +26,13 @@ fun jsVar(name: Name, initializer: IrExpression?): JsVars {
|
|||||||
val jsInitializer = initializer?.accept(IrElementToJsExpressionTransformer(), null)
|
val jsInitializer = initializer?.accept(IrElementToJsExpressionTransformer(), null)
|
||||||
return JsVars(JsVars.JsVar(name.toJsName(), jsInitializer))
|
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