diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrFunctionToJsTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrFunctionToJsTransformer.kt index 2940f4d0cb4..37456d0fc3f 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrFunctionToJsTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrFunctionToJsTransformer.kt @@ -6,19 +6,22 @@ package org.jetbrains.kotlin.ir.backend.js.transformers.irToJs import org.jetbrains.kotlin.ir.backend.js.utils.JsGenerationContext +import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrConstructor import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction +import org.jetbrains.kotlin.ir.util.isObject import org.jetbrains.kotlin.js.backend.ast.JsFunction open class IrFunctionToJsTransformer : BaseIrElementToJsNodeTransformer { override fun visitSimpleFunction(declaration: IrSimpleFunction, context: JsGenerationContext): JsFunction { val funcName = context.getNameForSymbol(declaration.symbol) - return translateFunction(declaration, funcName, context) + return translateFunction(declaration, funcName, false, context) } override fun visitConstructor(declaration: IrConstructor, context: JsGenerationContext): JsFunction { assert(declaration.isPrimary) val funcName = context.getNameForSymbol(declaration.symbol) - return translateFunction(declaration, funcName, context) + val constructedClass = declaration.parent as IrClass + return translateFunction(declaration, funcName, constructedClass.isObject, context) } } \ No newline at end of file diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsClassGenerator.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsClassGenerator.kt index 4ffaade83f5..15f00569c03 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsClassGenerator.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsClassGenerator.kt @@ -100,7 +100,7 @@ class JsClassGenerator(private val irClass: IrClass, val context: JsGenerationCo } private fun maybeGenerateObjectInstance(): List { - val instanceVarName = "${className.ident}_instance" + val instanceVarName = className.objectInstanceName() val getInstanceFunName = "${className.ident}_getInstance" val jsVarNode = context.currentScope.declareName(instanceVarName) val varStmt = JsVars(JsVars.JsVar(jsVarNode)) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/jsAstUtils.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/jsAstUtils.kt index be1a63e28ed..7b6f3897d70 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/jsAstUtils.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/jsAstUtils.kt @@ -35,12 +35,19 @@ fun jsAssignment(left: JsExpression, right: JsExpression) = JsBinaryOperation(Js fun prototypeOf(classNameRef: JsExpression) = JsNameRef(Namer.PROTOTYPE_NAME, classNameRef) -fun translateFunction(declaration: IrFunction, name: JsName?, context: JsGenerationContext): JsFunction { +fun translateFunction(declaration: IrFunction, name: JsName?, isObjectConstructor: Boolean, context: JsGenerationContext): JsFunction { val functionScope = JsFunctionScope(context.currentScope, "scope for ${name ?: "annon"}") val functionContext = context.newDeclaration(functionScope, declaration) val functionParams = declaration.valueParameters.map { functionContext.getNameForSymbol(it.symbol) } val body = declaration.body?.accept(IrElementToJsStatementTransformer(), functionContext) as? JsBlock ?: JsBlock() - val function = JsFunction(functionScope, body, "member function ${name ?: "annon"}") + + val functionBody = if (isObjectConstructor) { + val instanceName = context.currentScope.declareName(name!!.objectInstanceName()) + val assignObject = jsAssignment(JsNameRef(instanceName), JsThisRef()) + JsBlock(assignObject.makeStmt(), body) + } else body + + val function = JsFunction(functionScope, functionBody, "member function ${name ?: "annon"}") function.name = name @@ -74,4 +81,6 @@ fun translateCallArguments(expression: IrMemberAccessExpression, context: JsGene val IrFunction.isStatic: Boolean get() = this.dispatchReceiverParameter == null -fun JsStatement.asBlock() = this as? JsBlock ?: JsBlock(this) \ No newline at end of file +fun JsStatement.asBlock() = this as? JsBlock ?: JsBlock(this) + +fun JsName.objectInstanceName() = "${ident}_instance" \ No newline at end of file