From 33e795ee69602707aa9cfb4a2861ddca7cd3c52d Mon Sep 17 00:00:00 2001 From: Pavel Talanov Date: Fri, 9 Dec 2011 13:24:07 +0400 Subject: [PATCH] extension literal support and tests. --- .../k2js/translate/expression/ExpressionVisitor.java | 2 +- .../k2js/translate/expression/FunctionTranslator.java | 8 ++++---- .../k2js/translate/reference/CallTranslator.java | 11 +++++++++-- .../k2js/translate/utils/TranslationUtils.java | 6 ++---- .../jetbrains/k2js/test/ExtensionFunctionTest.java | 5 +++++ .../cases/extensionLiteralPassedToFunction.kt | 7 +++++++ 6 files changed, 28 insertions(+), 11 deletions(-) create mode 100644 translator/testFiles/extensionFunction/cases/extensionLiteralPassedToFunction.kt diff --git a/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java b/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java index 4ffc2d9a81f..1f54448796f 100644 --- a/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java +++ b/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java @@ -362,7 +362,7 @@ public final class ExpressionVisitor extends TranslatorVisitor { @NotNull public JsNode visitFunctionLiteralExpression(@NotNull JetFunctionLiteralExpression expression, @NotNull TranslationContext context) { - return Translation.functionTranslator(expression.getFunctionLiteral(), context).translateAsLiteral(); + return Translation.functionTranslator(expression, context).translateAsLiteral(); } @Override diff --git a/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java b/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java index 5e518fae8ed..22997d2e730 100644 --- a/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java @@ -89,7 +89,7 @@ public final class FunctionTranslator extends AbstractTranslator { } private boolean isLiteral() { - return functionDeclaration instanceof JetFunctionLiteral; + return functionDeclaration instanceof JetFunctionLiteralExpression; } private boolean isDeclaration() { @@ -174,9 +174,9 @@ public final class FunctionTranslator extends AbstractTranslator { } private boolean isExtensionFunction() { - if (!(functionDeclaration instanceof JetNamedFunction)) { - return false; - } +// if (!(functionDeclaration instanceof JetNamedFunction)) { +// return false; +// } FunctionDescriptor functionDescriptor = getFunctionDescriptor(context().bindingContext(), functionDeclaration); return DescriptorUtils.isExtensionFunction(functionDescriptor); diff --git a/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java index f5ec8a66f57..284fff93a98 100644 --- a/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java @@ -161,14 +161,21 @@ public final class CallTranslator extends AbstractTranslator { private JsExpression qualifiedMethodReference(@NotNull DeclarationDescriptor descriptor) { JsExpression methodReference = ReferenceTranslator.translateReference(descriptor, context()); if (isExtensionFunction()) { - AstUtil.setQualifier(methodReference, - TranslationUtils.getExtensionFunctionImplicitReceiver(context(), functionDescriptor)); + return extensionFunctionReference(methodReference); } else if (receiver != null) { AstUtil.setQualifier(methodReference, receiver); } return methodReference; } + private JsExpression extensionFunctionReference(@NotNull JsExpression methodReference) { + JsExpression qualifier = TranslationUtils.getExtensionFunctionImplicitReceiver(context(), functionDescriptor); + if (qualifier != null) { + AstUtil.setQualifier(methodReference, qualifier); + } + return methodReference; + } + @NotNull private JsExpression constructorCall() { JsNew constructorCall = new JsNew(qualifiedMethodReference(functionDescriptor)); diff --git a/translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java b/translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java index 5929f631485..190e9a6d120 100644 --- a/translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java +++ b/translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java @@ -208,12 +208,10 @@ public final class TranslationUtils { return getImplicitReceiverBasedOnOwner(context, referencedDescriptor); } - @NotNull + @Nullable public static JsExpression getExtensionFunctionImplicitReceiver(@NotNull TranslationContext context, @NotNull FunctionDescriptor descriptor) { - JsExpression receiverBasedOnOwner = getImplicitReceiverBasedOnOwner(context, descriptor); - assert receiverBasedOnOwner != null : "Extension function must have receiver based on owner."; - return receiverBasedOnOwner; + return getImplicitReceiverBasedOnOwner(context, descriptor); } @Nullable diff --git a/translator/test/org/jetbrains/k2js/test/ExtensionFunctionTest.java b/translator/test/org/jetbrains/k2js/test/ExtensionFunctionTest.java index 680ec0ee425..040555e9de7 100644 --- a/translator/test/org/jetbrains/k2js/test/ExtensionFunctionTest.java +++ b/translator/test/org/jetbrains/k2js/test/ExtensionFunctionTest.java @@ -42,4 +42,9 @@ public final class ExtensionFunctionTest extends TranslationTest { public void virtualExtensionOverride() throws Exception { testFooBoxIsTrue("virtualExtensionOverride.kt"); } + + @Test + public void extensionLiteralPassedToFunction() throws Exception { + testFooBoxIsTrue("extensionLiteralPassedToFunction.kt"); + } } diff --git a/translator/testFiles/extensionFunction/cases/extensionLiteralPassedToFunction.kt b/translator/testFiles/extensionFunction/cases/extensionLiteralPassedToFunction.kt new file mode 100644 index 00000000000..28b8196b4a1 --- /dev/null +++ b/translator/testFiles/extensionFunction/cases/extensionLiteralPassedToFunction.kt @@ -0,0 +1,7 @@ +namespace foo + +fun apply(i : Int, f : fun Int.(Int) : Int) = i.f(1); + +fun box() : Boolean { + return (apply(1, {i => i + this})) == 2 +} \ No newline at end of file