From a5e74d7db379b2c50f37505d4bf5313292f988f7 Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Wed, 12 Mar 2014 20:57:13 +0400 Subject: [PATCH] JS backend: switch to use `Function.call` for calling extension lambdas and local extension functions. Main reason for this change is (simple) interop with native code when pass extension lambda to or from native code. (#KT-4238, #KT-4345) Fixed --- .../callTranslator/FunctionCallCases.kt | 17 ++++++++++++++--- .../expression/LiteralFunctionTranslator.kt | 7 ------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/callTranslator/FunctionCallCases.kt b/js/js.translator/src/org/jetbrains/k2js/translate/callTranslator/FunctionCallCases.kt index d1461c19d82..08fa2a41546 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/callTranslator/FunctionCallCases.kt +++ b/js/js.translator/src/org/jetbrains/k2js/translate/callTranslator/FunctionCallCases.kt @@ -32,6 +32,8 @@ import com.google.dart.compiler.backend.js.ast.JsLiteral import com.google.dart.compiler.backend.js.ast.JsName import org.jetbrains.k2js.translate.context.TranslationContext import org.jetbrains.k2js.translate.reference.CallArgumentTranslator +import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor +import org.jetbrains.jet.lang.descriptors.Visibilities public fun addReceiverToArgs(receiver: JsExpression, arguments: List): List { if (arguments.isEmpty()) @@ -106,7 +108,16 @@ object DefaultFunctionCallCase : FunctionCallCase { val qualifierForFunction = context.getQualifierForDescriptor(it) JsNameRef(functionName, qualifierForFunction) // TODO: remake to call } - return JsInvocation(functionRef, addReceiverToArgs(receiverObject!!, argumentsInfo.getTranslateArguments())) + + val referenceToCall = + if (callableDescriptor.getVisibility() == Visibilities.LOCAL) { + Namer.getFunctionCallRef(functionRef) + } + else { + functionRef + } + + return JsInvocation(referenceToCall, addReceiverToArgs(receiverObject!!, argumentsInfo.getTranslateArguments())) } override fun FunctionCallInfo.bothReceivers(): JsExpression { @@ -142,7 +153,7 @@ object InvokeIntrinsic : FunctionCallCase { return JsInvocation(thisObject, argumentsInfo.getTranslateArguments()) } override fun FunctionCallInfo.bothReceivers(): JsExpression { - return JsInvocation(thisObject, addReceiverToArgs(receiverObject!!, argumentsInfo.getTranslateArguments())) + return JsInvocation(Namer.getFunctionCallRef(thisObject!!), addReceiverToArgs(receiverObject!!, argumentsInfo.getTranslateArguments())) } } @@ -182,7 +193,7 @@ object ExpressionAsFunctionDescriptorIntrinsic : FunctionCallCase { } val funRef = Translation.translateAsExpression((callableDescriptor as ExpressionAsFunctionDescriptor).getExpression()!!, context) - return JsInvocation(funRef, addReceiverToArgs(receiverObject!!, argumentsInfo.getTranslateArguments())) + return JsInvocation(Namer.getFunctionCallRef(funRef), addReceiverToArgs(receiverObject!!, argumentsInfo.getTranslateArguments())) } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/LiteralFunctionTranslator.kt b/js/js.translator/src/org/jetbrains/k2js/translate/expression/LiteralFunctionTranslator.kt index d0edf253c90..97d9d184f7f 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/LiteralFunctionTranslator.kt +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/LiteralFunctionTranslator.kt @@ -36,13 +36,6 @@ class LiteralFunctionTranslator(context: TranslationContext) : AbstractTranslato val lambda = invokingContext.getFunctionObject(descriptor) val functionContext = invokingContext.newFunctionBodyWithUsageTracker(lambda, descriptor) - val receiverDescriptor = descriptor.getReceiverParameter() - if (receiverDescriptor != null) { - val receiverName = lambda.getScope()?.declareName(Namer.getReceiverParameterName()) - lambda.getParameters()?.add(JsParameter(receiverName)) - functionContext.aliasingContext().registerAlias(receiverDescriptor, receiverName!!.makeRef()) - } - FunctionTranslator.addParameters(lambda.getParameters(), descriptor, functionContext) val functionBody = translateFunctionBody(descriptor, declaration, functionContext) lambda.getBody()?.getStatements()?.addAll(functionBody.getStatements()!!)