diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/BaseIrElementToJsNodeTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/BaseIrElementToJsNodeTransformer.kt index 0a22e7a74fe..e057e2660e0 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/BaseIrElementToJsNodeTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/BaseIrElementToJsNodeTransformer.kt @@ -6,7 +6,7 @@ package org.jetbrains.kotlin.ir.backend.js.transformers.irToJs import org.jetbrains.kotlin.ir.IrElement -import org.jetbrains.kotlin.ir.backend.js.TODO +import org.jetbrains.kotlin.ir.backend.js.utils.TODO import org.jetbrains.kotlin.ir.declarations.IrTypeAlias import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.js.backend.ast.JsEmpty diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrDeclarationToJsTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrDeclarationToJsTransformer.kt index 40946d1abd8..7e1ebadb524 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrDeclarationToJsTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrDeclarationToJsTransformer.kt @@ -5,10 +5,15 @@ package org.jetbrains.kotlin.ir.backend.js.transformers.irToJs +import org.jetbrains.kotlin.ir.declarations.IrProperty import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.js.backend.ast.* class IrDeclarationToJsTransformer : BaseIrElementToJsNodeTransformer { + override fun visitProperty(declaration: IrProperty, data: Nothing?): JsStatement { + return jsVar(declaration.name, declaration.backingField?.initializer?.expression) + } + override fun visitSimpleFunction(declaration: IrSimpleFunction, data: Nothing?): JsStatement { return JsExpressionStatement(transformIrFunctionToJsFunction(declaration)) } @@ -16,9 +21,9 @@ class IrDeclarationToJsTransformer : BaseIrElementToJsNodeTransformer { + override fun visitExpressionBody(body: IrExpressionBody, data: Nothing?): JsExpression { + return body.expression.accept(this, data) + } + override fun visitConst(expression: IrConst, data: Nothing?): JsExpression { + // TODO: support all cases return JsStringLiteral(expression.value.toString()) } + + 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: + // * ir intrinsics + // * js be intrinsics + // * js function + // * getters and setters + // * binary and unary operations + + val symbol = expression.symbol + + val dispatchReceiver = expression.dispatchReceiver?.accept(this, data) + val extensionReceiver = expression.extensionReceiver?.accept(this, data) + + // TODO sanitize name + val symbolName = (symbol.owner as IrSimpleFunction).name.asString() + val ref = if (dispatchReceiver != null) JsNameRef(symbolName, dispatchReceiver) else JsNameRef(symbolName) + + val arguments = + // TODO mapTo? + (0 until expression.symbol.parameterCount).map { + val argument = expression.getValueArgument(it) + if (argument != null) { + argument.accept(this, data) + } else { + JsPrefixOperation(JsUnaryOperator.VOID, JsIntLiteral(1)) + } + } + + + if (symbol is IrConstructorSymbol && symbol.isPrimary) { + return JsNew(JsNameRef((symbol.owner.parent as IrClass).name.asString()), arguments) + } + + return JsInvocation(ref, extensionReceiver?.let { listOf(extensionReceiver) + arguments } ?: arguments) + } } \ No newline at end of file diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsStatementTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsStatementTransformer.kt index 715748b6fea..15e65e6dd96 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsStatementTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsStatementTransformer.kt @@ -5,13 +5,9 @@ package org.jetbrains.kotlin.ir.backend.js.transformers.irToJs -import org.jetbrains.kotlin.ir.expressions.IrBlockBody -import org.jetbrains.kotlin.ir.expressions.IrExpression -import org.jetbrains.kotlin.ir.expressions.IrReturn -import org.jetbrains.kotlin.js.backend.ast.JsBlock -import org.jetbrains.kotlin.js.backend.ast.JsExpressionStatement -import org.jetbrains.kotlin.js.backend.ast.JsReturn -import org.jetbrains.kotlin.js.backend.ast.JsStatement +import org.jetbrains.kotlin.ir.declarations.IrVariable +import org.jetbrains.kotlin.ir.expressions.* +import org.jetbrains.kotlin.js.backend.ast.* class IrElementToJsStatementTransformer : BaseIrElementToJsNodeTransformer { override fun visitBlockBody(body: IrBlockBody, data: Nothing?): JsStatement { @@ -22,7 +18,23 @@ class IrElementToJsStatementTransformer : BaseIrElementToJsNodeTransformer