[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
|
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.isPrimary
|
||||||
|
import org.jetbrains.kotlin.ir.backend.js.utils.name
|
||||||
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
|
||||||
@@ -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 {
|
override fun visitCall(expression: IrCall, data: Nothing?): JsExpression {
|
||||||
// TODO rewrite more accurately, right now it just copy-pasted and adopted from old version
|
// TODO rewrite more accurately, right now it just copy-pasted and adopted from old version
|
||||||
// TODO support:
|
// TODO support:
|
||||||
|
|||||||
+9
@@ -14,6 +14,15 @@ class IrElementToJsStatementTransformer : BaseIrElementToJsNodeTransformer<JsSta
|
|||||||
return JsBlock(body.statements.map { it.accept(this, data) })
|
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 {
|
override fun visitExpression(expression: IrExpression, data: Nothing?): JsStatement {
|
||||||
return JsExpressionStatement(expression.accept(IrElementToJsExpressionTransformer(), data))
|
return JsExpressionStatement(expression.accept(IrElementToJsExpressionTransformer(), data))
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -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.IrConstructorSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
|
||||||
|
|
||||||
val IrFunctionSymbol.parameterCount get() = descriptor.valueParameters.size
|
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