JS backend: extract generateDelegateCall from DelegationTranslator into utils

This commit is contained in:
Michael Nedzelsky
2014-10-06 01:20:11 +04:00
parent df15e4767b
commit 541786a4db
2 changed files with 46 additions and 25 deletions
@@ -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<JsPropertyInitializer>
) {
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<JsParameter>()
val args = SmartList<JsExpression>()
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()));
}
}
@@ -16,4 +16,47 @@
package org.jetbrains.k2js.translate.utils
public val <T> ID: (T) -> T = { it }
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 <T> 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<JsParameter>()
val args = SmartList<JsExpression>()
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)
}