From 541786a4dbf30b9f7445ce5c2553830f21e8f155 Mon Sep 17 00:00:00 2001 From: Michael Nedzelsky Date: Mon, 6 Oct 2014 01:20:11 +0400 Subject: [PATCH] JS backend: extract generateDelegateCall from DelegationTranslator into utils --- .../declaration/DelegationTranslator.kt | 26 +---------- .../jetbrains/k2js/translate/utils/utils.kt | 45 ++++++++++++++++++- 2 files changed, 46 insertions(+), 25 deletions(-) diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/DelegationTranslator.kt b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/DelegationTranslator.kt index 1783d7007dd..d72fac4cf0d 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/DelegationTranslator.kt +++ b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/DelegationTranslator.kt @@ -35,6 +35,7 @@ import org.jetbrains.jet.backend.common.CodegenUtil import java.util.HashMap import org.jetbrains.k2js.translate.declaration.propertyTranslator.addGetterAndSetter import org.jetbrains.k2js.translate.utils.ManglingUtils.getMangledMemberNameForExplicitDelegation +import org.jetbrains.k2js.translate.utils.generateDelegateCall public class DelegationTranslator( private val classDeclaration: JetClassOrObject, @@ -181,31 +182,8 @@ public class DelegationTranslator( delegateName: String, properties: MutableList ) { - val delegateMemberFunctionName = context().getNameForDescriptor(descriptor) - val overriddenMemberFunctionName = context().getNameForDescriptor(overriddenDescriptor) val delegateRefName = context().getScopeForDescriptor(descriptor).declareName(delegateName) val delegateRef = JsNameRef(delegateRefName, JsLiteral.THIS) - val overriddenMemberFunctionRef = JsNameRef(overriddenMemberFunctionName, delegateRef) - - val parameters = SmartList() - val args = SmartList() - val functionScope = context().getScopeForDescriptor(descriptor); - - if (JsDescriptorUtils.isExtension(descriptor)) { - val extensionFunctionReceiverName = functionScope.declareName(Namer.getReceiverParameterName()) - parameters.add(JsParameter(extensionFunctionReceiverName)) - args.add(JsNameRef(extensionFunctionReceiverName)) - } - - for (param in descriptor.getValueParameters()) { - val paramName = param.getName().asString() - val jsParamName = functionScope.declareName(paramName) - parameters.add(JsParameter(jsParamName)) - args.add(JsNameRef(jsParamName)) - } - - val functionObject = simpleReturnFunction(context().getScopeForDescriptor(descriptor), JsInvocation(overriddenMemberFunctionRef, args)) - functionObject.getParameters().addAll(parameters) - properties.add(JsPropertyInitializer(delegateMemberFunctionName.makeRef(), functionObject)) + properties.add(generateDelegateCall(descriptor, overriddenDescriptor, delegateRef, context())); } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/utils.kt b/js/js.translator/src/org/jetbrains/k2js/translate/utils/utils.kt index d793f2b0828..570ad86cfb6 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/utils/utils.kt +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/utils.kt @@ -16,4 +16,47 @@ package org.jetbrains.k2js.translate.utils -public val ID: (T) -> T = { it } \ No newline at end of file +import com.google.dart.compiler.backend.js.ast.JsExpression +import com.google.dart.compiler.backend.js.ast.JsInvocation +import com.google.dart.compiler.backend.js.ast.JsNameRef +import com.google.dart.compiler.backend.js.ast.JsParameter +import com.google.dart.compiler.backend.js.ast.JsPropertyInitializer +import com.intellij.util.SmartList +import org.jetbrains.jet.lang.descriptors.FunctionDescriptor +import org.jetbrains.k2js.translate.context.Namer +import org.jetbrains.k2js.translate.context.TranslationContext +import org.jetbrains.k2js.translate.utils.TranslationUtils.simpleReturnFunction + +public val ID: (T) -> T = { it } + +public fun generateDelegateCall( + fromDescriptor: FunctionDescriptor, + toDescriptor: FunctionDescriptor, + thisObject: JsExpression, + context: TranslationContext +): JsPropertyInitializer { + val delegateMemberFunctionName = context.getNameForDescriptor(fromDescriptor) + val overriddenMemberFunctionName = context.getNameForDescriptor(toDescriptor) + val overriddenMemberFunctionRef = JsNameRef(overriddenMemberFunctionName, thisObject) + + val parameters = SmartList() + val args = SmartList() + val functionScope = context.getScopeForDescriptor(fromDescriptor); + + if (JsDescriptorUtils.isExtension(fromDescriptor)) { + val extensionFunctionReceiverName = functionScope.declareName(Namer.getReceiverParameterName()) + parameters.add(JsParameter(extensionFunctionReceiverName)) + args.add(JsNameRef(extensionFunctionReceiverName)) + } + + for (param in fromDescriptor.getValueParameters()) { + val paramName = param.getName().asString() + val jsParamName = functionScope.declareName(paramName) + parameters.add(JsParameter(jsParamName)) + args.add(JsNameRef(jsParamName)) + } + + val functionObject = simpleReturnFunction(context.getScopeForDescriptor(fromDescriptor), JsInvocation(overriddenMemberFunctionRef, args)) + functionObject.getParameters().addAll(parameters) + return JsPropertyInitializer(delegateMemberFunctionName.makeRef(), functionObject) +}