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