[JS IR BE] Add generating JS AST for more IR elements:

* string concat
* get local value
* set local variable

* block
* composite block
This commit is contained in:
Zalim Bashorov
2018-03-21 23:33:21 +03:00
parent 7ae28a806b
commit 0aa0ffc6fd
3 changed files with 35 additions and 1 deletions
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.ir.backend.js.transformers.irToJs
import org.jetbrains.kotlin.ir.backend.js.utils.isPrimary
import org.jetbrains.kotlin.ir.backend.js.utils.name
import org.jetbrains.kotlin.ir.backend.js.utils.parameterCount
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
@@ -34,6 +35,27 @@ class IrElementToJsExpressionTransformer : BaseIrElementToJsNodeTransformer<JsEx
}
}
override fun visitStringConcatenation(expression: IrStringConcatenation, data: Nothing?): JsExpression {
// TODO revisit
return expression.arguments.fold<IrExpression, JsExpression>(JsStringLiteral("")) { jsExpr, irExpr ->
JsBinaryOperation(
JsBinaryOperator.ADD,
jsExpr,
irExpr.accept(this, data)
)
}
}
override fun visitGetValue(expression: IrGetValue, data: Nothing?): JsExpression {
return JsNameRef(expression.symbol.name.toJsName())
}
override fun visitSetVariable(expression: IrSetVariable, data: Nothing?): JsExpression {
val ref = JsNameRef(expression.symbol.name.toJsName())
val value = expression.value.accept(this, data)
return JsBinaryOperation(JsBinaryOperator.ASG, ref, value)
}
override fun visitCall(expression: IrCall, data: Nothing?): JsExpression {
// TODO rewrite more accurately, right now it just copy-pasted and adopted from old version
// TODO support:
@@ -14,6 +14,15 @@ class IrElementToJsStatementTransformer : BaseIrElementToJsNodeTransformer<JsSta
return JsBlock(body.statements.map { it.accept(this, data) })
}
override fun visitBlock(expression: IrBlock, data: Nothing?): JsBlock {
return JsBlock(expression.statements.map { it.accept(this, data) })
}
override fun visitComposite(expression: IrComposite, data: Nothing?): JsStatement {
// TODO introduce JsCompositeBlock?
return JsBlock(expression.statements.map { it.accept(this, data) })
}
override fun visitExpression(expression: IrExpression, data: Nothing?): JsStatement {
return JsExpressionStatement(expression.accept(IrElementToJsExpressionTransformer(), data))
}
@@ -7,7 +7,10 @@ package org.jetbrains.kotlin.ir.backend.js.utils
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
val IrFunctionSymbol.parameterCount get() = descriptor.valueParameters.size
val IrConstructorSymbol.isPrimary get() = descriptor.isPrimary
val IrConstructorSymbol.isPrimary get() = descriptor.isPrimary
val IrValueSymbol.name get() = descriptor.name