From 4f9485b40e85472d93ace0c7a4cf1cba069d4a1d Mon Sep 17 00:00:00 2001 From: develar Date: Fri, 23 Aug 2013 14:47:25 +0400 Subject: [PATCH] JS backend: fixed bug when explicitly use invoke method in function literal call. (cherry picked from commit f832cee) --- ...nvokeMethodTest.java => InvokeConventionTest.java} | 7 +++++-- .../intrinsic/functions/factories/TopLevelFIF.java | 9 ++++++--- .../k2js/translate/reference/CallTranslator.java | 11 +++++++++++ .../expression/invoke/cases/explicitInvokeLambda.kt | 6 ++++++ 4 files changed, 28 insertions(+), 5 deletions(-) rename js/js.tests/test/org/jetbrains/k2js/test/semantics/{InvokeMethodTest.java => InvokeConventionTest.java} (80%) create mode 100644 js/js.translator/testFiles/expression/invoke/cases/explicitInvokeLambda.kt diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/InvokeMethodTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/InvokeConventionTest.java similarity index 80% rename from js/js.tests/test/org/jetbrains/k2js/test/semantics/InvokeMethodTest.java rename to js/js.tests/test/org/jetbrains/k2js/test/semantics/InvokeConventionTest.java index e132cb57860..a15222971b0 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/InvokeMethodTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/InvokeConventionTest.java @@ -16,9 +16,9 @@ package org.jetbrains.k2js.test.semantics; -public final class InvokeMethodTest extends AbstractExpressionTest { +public final class InvokeConventionTest extends AbstractExpressionTest { - public InvokeMethodTest() { + public InvokeConventionTest() { super("invoke/"); } @@ -27,4 +27,7 @@ public final class InvokeMethodTest extends AbstractExpressionTest { // fooBoxIsValue("hello world!"); } + public void testExplicitInvokeLambda() throws Exception { + checkFooBoxIsOk(); + } } \ No newline at end of file diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/TopLevelFIF.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/TopLevelFIF.java index d7a8d33ee88..268244c29fb 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/TopLevelFIF.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/TopLevelFIF.java @@ -158,15 +158,18 @@ public final class TopLevelFIF extends CompositeFIF { @NotNull TranslationContext context ) { JsExpression thisExpression = callTranslator.getCallParameters().getThisObject(); + JsExpression functionReference = callTranslator.getCallParameters().getFunctionReference(); if (thisExpression == null) { - return new JsInvocation(callTranslator.getCallParameters().getFunctionReference(), arguments); + return new JsInvocation(functionReference, arguments); } else if (callTranslator.getResolvedCall().getReceiverArgument().exists()) { return callTranslator.extensionFunctionCall(false); } else { - return new JsInvocation(new JsNameRef("call", callTranslator.getCallParameters().getFunctionReference()), - generateInvocationArguments(thisExpression, arguments)); + if (functionReference instanceof JsNameRef && ((JsNameRef) functionReference).getIdent().equals("invoke")) { + return callTranslator.explicitInvokeCall(); + } + return new JsInvocation(new JsNameRef("call", functionReference), generateInvocationArguments(thisExpression, arguments)); } } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java index 9bbd6f29eb1..e5b1d2808bd 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java @@ -149,6 +149,17 @@ public final class CallTranslator extends AbstractTranslator { return methodCall(callParameters.getReceiver()); } + @NotNull + public JsExpression explicitInvokeCall() { + return callType.constructCall(callParameters.getThisObject(), new CallType.CallConstructor() { + @NotNull + @Override + public JsExpression construct(@Nullable JsExpression receiver) { + return new JsInvocation(receiver, arguments); + } + }, context()); + } + @NotNull public JsExpression extensionFunctionCall(final boolean useThis) { return callType.constructCall(callParameters.getReceiver(), new CallType.CallConstructor() { diff --git a/js/js.translator/testFiles/expression/invoke/cases/explicitInvokeLambda.kt b/js/js.translator/testFiles/expression/invoke/cases/explicitInvokeLambda.kt new file mode 100644 index 00000000000..2984cc835da --- /dev/null +++ b/js/js.translator/testFiles/expression/invoke/cases/explicitInvokeLambda.kt @@ -0,0 +1,6 @@ +package foo + +fun box() : String { + var foo = { (x: String) -> x + "K" } + return foo.invoke("O") +} \ No newline at end of file