[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:
+22
@@ -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:
|
||||
|
||||
+9
@@ -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))
|
||||
}
|
||||
|
||||
+4
-1
@@ -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
|
||||
Reference in New Issue
Block a user