From a7eb143cff52e4f08df89bdf3a5e4f29bb0ed3f3 Mon Sep 17 00:00:00 2001 From: Erokhin Stanislav Date: Fri, 31 Jan 2014 19:02:19 +0400 Subject: [PATCH] JS backend: Fix aliasing in CallTranslator for cases noReceiver & receiverObject & add hack for thisObject --- .../callTranslator/CallInfoExtensions.kt | 14 +++++++++-- .../callTranslator/CallTranslator.kt | 8 ++++-- .../callTranslator/FunctionCallCases.kt | 25 +++++++++++++------ .../callTranslator/VarialbeCallCases.kt | 13 +++++++--- .../translate/context/TranslationContext.java | 2 -- 5 files changed, 44 insertions(+), 18 deletions(-) diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/callTranslator/CallInfoExtensions.kt b/js/js.translator/src/org/jetbrains/k2js/translate/callTranslator/CallInfoExtensions.kt index 3dd6437b381..3af5ffd2977 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/callTranslator/CallInfoExtensions.kt +++ b/js/js.translator/src/org/jetbrains/k2js/translate/callTranslator/CallInfoExtensions.kt @@ -28,6 +28,7 @@ import org.jetbrains.k2js.translate.utils.JsAstUtils import org.jetbrains.jet.lang.resolve.calls.tasks.ExplicitReceiverKind.* import com.google.dart.compiler.backend.js.ast.JsLiteral import org.jetbrains.k2js.translate.utils.TranslationUtils +import org.jetbrains.k2js.translate.context.TranslationContext val CallInfo.callableDescriptor: CallableDescriptor @@ -54,7 +55,7 @@ fun VariableAccessInfo.isGetAccess(): Boolean = value == null fun VariableAccessInfo.getAccessFunctionName(): String = Namer.getNameForAccessor(variableName.getIdent()!!, isGetAccess(), false) -fun VariableAccessInfo.constructAccessExpression(ref: JsNameRef): JsExpression { +fun VariableAccessInfo.constructAccessExpression(ref: JsExpression): JsExpression { if (isGetAccess()) { return ref } else { @@ -65,4 +66,13 @@ fun VariableAccessInfo.constructAccessExpression(ref: JsNameRef): JsExpression { val FunctionCallInfo.functionName: JsName get() = context.getNameForDescriptor(callableDescriptor) -fun FunctionCallInfo.hasSpreadOperator(): Boolean = argumentsInfo.isHasSpreadOperator() \ No newline at end of file +fun FunctionCallInfo.hasSpreadOperator(): Boolean = argumentsInfo.isHasSpreadOperator() + +fun TranslationContext.aliasOrValue(callableDescriptor: CallableDescriptor, value: (CallableDescriptor) -> JsExpression): JsExpression { + val alias = getAliasForDescriptor(callableDescriptor) + if (alias != null) { + return alias + } else { + return value(callableDescriptor) + } +} \ No newline at end of file diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/callTranslator/CallTranslator.kt b/js/js.translator/src/org/jetbrains/k2js/translate/callTranslator/CallTranslator.kt index 4f72e979ad1..f1289074e03 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/callTranslator/CallTranslator.kt +++ b/js/js.translator/src/org/jetbrains/k2js/translate/callTranslator/CallTranslator.kt @@ -123,9 +123,13 @@ trait CallCase { else callInfo.receiverArgument() } else { - if (callInfo.receiverObject == null) + if (callInfo.receiverObject == null) { + // TODO remake UsageTracker and drop this hack + // this call need for usage tracker -- without it, capture this not worked + val alias = callInfo.context.getAliasForDescriptor(callInfo.callableDescriptor) + assert(alias == null, "Failed hack for usageTracker") callInfo.thisObject() - else + } else callInfo.bothReceivers() } 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 f2d1d15b227..842aa6ec02d 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 @@ -82,9 +82,12 @@ object DefaultFunctionCallCase : FunctionCallCase { if (isNative) { return JsInvocation(JsNameRef(functionName), argumentsInfo.getTranslateArguments()) } - val qualifierForFunction = context.getQualifierForDescriptor(callableDescriptor) - val functionCall = JsNameRef(functionName, qualifierForFunction) - return JsInvocation(functionCall, argumentsInfo.getTranslateArguments()) + + val functionRef = context.aliasOrValue(callableDescriptor) { + val qualifierForFunction = context.getQualifierForDescriptor(it) + JsNameRef(functionName, qualifierForFunction) + } + return JsInvocation(functionRef, argumentsInfo.getTranslateArguments()) } override fun FunctionCallInfo.noReceivers(): JsExpression { @@ -102,9 +105,12 @@ object DefaultFunctionCallCase : FunctionCallCase { if (isNative()) { return JsInvocation(JsNameRef(functionName, receiverObject), argumentsInfo.getTranslateArguments()) } - val qualifierForFunction = context.getQualifierForDescriptor(callableDescriptor) - val functionCall = JsNameRef(functionName, qualifierForFunction) // TODO: remake to call - return JsInvocation(functionCall, addReceiverToArgs(receiverObject!!, argumentsInfo.getTranslateArguments())) + + val functionRef = context.aliasOrValue(callableDescriptor) { + val qualifierForFunction = context.getQualifierForDescriptor(it) + JsNameRef(functionName, qualifierForFunction) // TODO: remake to call + } + return JsInvocation(functionRef, addReceiverToArgs(receiverObject!!, argumentsInfo.getTranslateArguments())) } override fun FunctionCallInfo.bothReceivers(): JsExpression { // TODO: think about crazy case: spreadOperator + native @@ -152,7 +158,11 @@ object ConstructorCallCase : FunctionCallCase { if (isNative()) { return JsNew(JsNameRef(functionName), argumentsInfo.getTranslateArguments()) } - return JsNew(context.getQualifiedReference(callableDescriptor), argumentsInfo.getTranslateArguments()) + + val functionRef = context.aliasOrValue(callableDescriptor) { + context.getQualifiedReference(it) + } + return JsNew(functionRef, argumentsInfo.getTranslateArguments()) } } @@ -167,7 +177,6 @@ object ExpressionAsFunctionDescriptorIntrinsic : FunctionCallCase { } val funRef = Translation.translateAsExpression((callableDescriptor as ExpressionAsFunctionDescriptor).getExpression()!!, context) return JsInvocation(funRef, argumentsInfo.getTranslateArguments()) - } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/callTranslator/VarialbeCallCases.kt b/js/js.translator/src/org/jetbrains/k2js/translate/callTranslator/VarialbeCallCases.kt index a9c5924c706..45723565b74 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/callTranslator/VarialbeCallCases.kt +++ b/js/js.translator/src/org/jetbrains/k2js/translate/callTranslator/VarialbeCallCases.kt @@ -45,7 +45,10 @@ object NativeVariableAccessCase : VariableAccessCase { object DefaultVariableAccessCase : VariableAccessCase { override fun VariableAccessInfo.noReceivers(): JsExpression { - return constructAccessExpression(context.getQualifiedReference(variableDescriptor)) + val functionRef = context.aliasOrValue(callableDescriptor) { + context.getQualifiedReference(variableDescriptor) + } + return constructAccessExpression(functionRef) } override fun VariableAccessInfo.thisObject(): JsExpression { @@ -53,11 +56,13 @@ object DefaultVariableAccessCase : VariableAccessCase { } override fun VariableAccessInfo.receiverArgument(): JsExpression { - val funRef = JsNameRef(getAccessFunctionName(), context.getQualifierForDescriptor(variableDescriptor)) + val functionRef = context.aliasOrValue(callableDescriptor) { + JsNameRef(getAccessFunctionName(), context.getQualifierForDescriptor(variableDescriptor)) + } return if (isGetAccess()) { - JsInvocation(funRef, receiverObject!!) + JsInvocation(functionRef, receiverObject!!) } else { - JsInvocation(funRef, receiverObject!!, value!!) + JsInvocation(functionRef, receiverObject!!, value!!) } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java b/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java index 309e1a04f66..5774683c278 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java @@ -171,7 +171,6 @@ public class TranslationContext { @NotNull public JsName getNameForDescriptor(@NotNull DeclarationDescriptor descriptor) { - descriptorUsedInThisContext(descriptor); // TODO drop this return staticContext.getNameForDescriptor(descriptor); } @@ -187,7 +186,6 @@ public class TranslationContext { @NotNull public JsNameRef getQualifiedReference(@NotNull DeclarationDescriptor descriptor) { - descriptorUsedInThisContext(descriptor); // TODO drop this return staticContext.getQualifiedReference(descriptor); }