From 8408bada763dbd6a1f6b402d86e5d9190511a61d Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Thu, 12 Apr 2018 18:01:34 +0300 Subject: [PATCH] [JS IR BE] basic support for the case when IrBlock is used as expression In this case compiler generates comma separated expressions. --- .../irToJs/IrElementToJsExpressionTransformer.kt | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsExpressionTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsExpressionTransformer.kt index e89b1c52d60..d542d20e8b1 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsExpressionTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsExpressionTransformer.kt @@ -16,6 +16,19 @@ import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol import org.jetbrains.kotlin.js.backend.ast.* class IrElementToJsExpressionTransformer : BaseIrElementToJsNodeTransformer { + + // TODO: should we prohibit using blocks as expression in the future? + override fun visitBlock(expression: IrBlock, context: JsGenerationContext): JsExpression { + if (expression.statements.isEmpty()) { + // TODO: what should we do here? Crash? Generate throw? Should it be treated as unreachable code? + return super.visitBlock(expression, context) + } + + return expression.statements + .map { it.accept(this, context) } + .reduce { left, right -> JsBinaryOperation(JsBinaryOperator.COMMA, left, right) } + } + override fun visitExpressionBody(body: IrExpressionBody, context: JsGenerationContext): JsExpression { return body.expression.accept(this, context) }