JS_IR: support dynamic expressions in JS tree generation
This commit is contained in:
+73
@@ -198,6 +198,79 @@ class IrElementToJsExpressionTransformer : BaseIrElementToJsNodeTransformer<JsEx
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun visitDynamicMemberExpression(expression: IrDynamicMemberExpression, data: JsGenerationContext): JsExpression =
|
||||||
|
JsNameRef(expression.memberName, expression.receiver.accept(this, data))
|
||||||
|
|
||||||
|
override fun visitDynamicOperatorExpression(expression: IrDynamicOperatorExpression, data: JsGenerationContext): JsExpression =
|
||||||
|
when (expression.operator) {
|
||||||
|
IrDynamicOperator.UNARY_PLUS -> prefixOperation(JsUnaryOperator.POS, expression, data)
|
||||||
|
IrDynamicOperator.UNARY_MINUS -> prefixOperation(JsUnaryOperator.NEG, expression, data)
|
||||||
|
|
||||||
|
IrDynamicOperator.EXCL -> prefixOperation(JsUnaryOperator.NOT, expression, data)
|
||||||
|
|
||||||
|
IrDynamicOperator.PREFIX_INCREMENT -> prefixOperation(JsUnaryOperator.INC, expression, data)
|
||||||
|
IrDynamicOperator.PREFIX_DECREMENT -> prefixOperation(JsUnaryOperator.DEC, expression, data)
|
||||||
|
|
||||||
|
IrDynamicOperator.POSTFIX_INCREMENT -> postfixOperation(JsUnaryOperator.INC, expression, data)
|
||||||
|
IrDynamicOperator.POSTFIX_DECREMENT -> postfixOperation(JsUnaryOperator.DEC, expression, data)
|
||||||
|
|
||||||
|
IrDynamicOperator.BINARY_PLUS -> binaryOperation(JsBinaryOperator.ADD, expression, data)
|
||||||
|
IrDynamicOperator.BINARY_MINUS -> binaryOperation(JsBinaryOperator.SUB, expression, data)
|
||||||
|
IrDynamicOperator.MUL -> binaryOperation(JsBinaryOperator.MUL, expression, data)
|
||||||
|
IrDynamicOperator.DIV -> binaryOperation(JsBinaryOperator.DIV, expression, data)
|
||||||
|
IrDynamicOperator.MOD -> binaryOperation(JsBinaryOperator.MOD, expression, data)
|
||||||
|
|
||||||
|
IrDynamicOperator.GT -> binaryOperation(JsBinaryOperator.GT, expression, data)
|
||||||
|
IrDynamicOperator.LT -> binaryOperation(JsBinaryOperator.LT, expression, data)
|
||||||
|
IrDynamicOperator.GE -> binaryOperation(JsBinaryOperator.GTE, expression, data)
|
||||||
|
IrDynamicOperator.LE -> binaryOperation(JsBinaryOperator.LTE, expression, data)
|
||||||
|
|
||||||
|
IrDynamicOperator.EQEQ -> binaryOperation(JsBinaryOperator.EQ, expression, data)
|
||||||
|
IrDynamicOperator.EXCLEQ -> binaryOperation(JsBinaryOperator.NEQ, expression, data)
|
||||||
|
|
||||||
|
IrDynamicOperator.EQEQEQ -> binaryOperation(JsBinaryOperator.REF_EQ, expression, data)
|
||||||
|
IrDynamicOperator.EXCLEQEQ -> binaryOperation(JsBinaryOperator.REF_NEQ, expression, data)
|
||||||
|
|
||||||
|
IrDynamicOperator.ANDAND -> binaryOperation(JsBinaryOperator.AND, expression, data)
|
||||||
|
IrDynamicOperator.OROR -> binaryOperation(JsBinaryOperator.OR, expression, data)
|
||||||
|
|
||||||
|
IrDynamicOperator.EQ -> binaryOperation(JsBinaryOperator.ASG, expression, data)
|
||||||
|
IrDynamicOperator.PLUSEQ -> binaryOperation(JsBinaryOperator.ASG_ADD, expression, data)
|
||||||
|
IrDynamicOperator.MINUSEQ -> binaryOperation(JsBinaryOperator.ASG_SUB, expression, data)
|
||||||
|
IrDynamicOperator.MULEQ -> binaryOperation(JsBinaryOperator.ASG_MUL, expression, data)
|
||||||
|
IrDynamicOperator.DIVEQ -> binaryOperation(JsBinaryOperator.ASG_DIV, expression, data)
|
||||||
|
IrDynamicOperator.MODEQ -> binaryOperation(JsBinaryOperator.ASG_MOD, expression, data)
|
||||||
|
|
||||||
|
IrDynamicOperator.ARRAY_ACCESS -> JsArrayAccess(expression.left.accept(this, data), expression.right.accept(this, data))
|
||||||
|
|
||||||
|
IrDynamicOperator.INVOKE ->
|
||||||
|
JsInvocation(
|
||||||
|
expression.receiver.accept(this, data),
|
||||||
|
expression.arguments.map { it.accept(this, data) }
|
||||||
|
)
|
||||||
|
|
||||||
|
else -> error("Unexpected operator ${expression.operator}: ${expression.render()}")
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun prefixOperation(operator: JsUnaryOperator, expression: IrDynamicOperatorExpression, data: JsGenerationContext) =
|
||||||
|
JsPrefixOperation(
|
||||||
|
operator,
|
||||||
|
expression.receiver.accept(this, data)
|
||||||
|
)
|
||||||
|
|
||||||
|
private fun postfixOperation(operator: JsUnaryOperator, expression: IrDynamicOperatorExpression, data: JsGenerationContext) =
|
||||||
|
JsPostfixOperation(
|
||||||
|
operator,
|
||||||
|
expression.receiver.accept(this, data)
|
||||||
|
)
|
||||||
|
|
||||||
|
private fun binaryOperation(operator: JsBinaryOperator, expression: IrDynamicOperatorExpression, data: JsGenerationContext) =
|
||||||
|
JsBinaryOperation(
|
||||||
|
operator,
|
||||||
|
expression.left.accept(this, data),
|
||||||
|
expression.right.accept(this, data)
|
||||||
|
)
|
||||||
|
|
||||||
private fun isNativeInvoke(call: IrCall): Boolean {
|
private fun isNativeInvoke(call: IrCall): Boolean {
|
||||||
val simpleFunction = call.symbol.owner as? IrSimpleFunction ?: return false
|
val simpleFunction = call.symbol.owner as? IrSimpleFunction ?: return false
|
||||||
val receiverType = simpleFunction.dispatchReceiverParameter?.type ?: return false
|
val receiverType = simpleFunction.dispatchReceiverParameter?.type ?: return false
|
||||||
|
|||||||
Reference in New Issue
Block a user