From 626a84a93585cdde6719875ffd0fdc6d3e02af6f Mon Sep 17 00:00:00 2001 From: Pavel Talanov Date: Fri, 27 Jan 2012 19:43:41 +0400 Subject: [PATCH] reimplemented extension literal definition and calls to comply with jquery conventions --- .../translate/context/StandardClasses.java | 5 ++- .../expression/FunctionTranslator.java | 3 +- .../translate/reference/CallTranslator.java | 31 +++++++++++++++++-- .../jetbrains/k2js/utils/JetFileUtils.java | 19 +++++++----- translator/testFiles/kotlin_lib.js | 3 ++ 5 files changed, 49 insertions(+), 12 deletions(-) diff --git a/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java b/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java index 2f831318824..fe520679c42 100644 --- a/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java +++ b/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java @@ -103,8 +103,9 @@ public final class StandardClasses { private static void declareJQuery(@NotNull StandardClasses standardClasses) { standardClasses.declare().forFQ("jquery.JQuery").externalClass("jQuery") - .methods("addClass", "attr", "hasClass", "append"); + .methods("addClass", "attr", "hasClass", "append", "text", "ready"); standardClasses.declare().forFQ("jquery.jq").externalFunction("jQuery"); + standardClasses.declare().forFQ("jquery.get-document").externalObject("document"); } //TODO: test all the methods @@ -142,6 +143,8 @@ public final class StandardClasses { standardClasses.declare().forFQ("jet.String").kotlinClass("String"). properties("length"); + + standardClasses.declare().forFQ("jet.Any.toString").kotlinFunction("toString"); } private static void declareTopLevelFunctions(@NotNull StandardClasses standardClasses) { diff --git a/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java b/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java index 1760c73ffaf..77a370b169f 100644 --- a/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java @@ -1,5 +1,6 @@ package org.jetbrains.k2js.translate.expression; + import com.google.dart.compiler.backend.js.ast.*; import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; @@ -195,7 +196,7 @@ public final class FunctionTranslator extends AbstractTranslator { } private boolean isExtensionFunction() { - return DescriptorUtils.isExtensionFunction(descriptor); + return DescriptorUtils.isExtensionFunction(descriptor) && !isLiteral(); } private boolean isLiteral() { diff --git a/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java index c89fe93deca..f0973d2906e 100644 --- a/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java @@ -2,6 +2,7 @@ package org.jetbrains.k2js.translate.reference; 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.JsNew; import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; @@ -129,7 +130,6 @@ public final class CallTranslator extends AbstractTranslator { public static JsExpression translate(@Nullable JsExpression receiver, @NotNull CallableDescriptor descriptor, @NotNull TranslationContext context) { - //TODO: HACK! return translate(receiver, Collections.emptyList(), ResolvedCallImpl.create(descriptor), null, context); } @@ -224,12 +224,37 @@ public final class CallTranslator extends AbstractTranslator { if (isConstructor()) { return constructorCall(); } + if (isExtensionFunctionLiteral()) { + return extensionFunctionLiteralCall(); + } if (isExtensionFunction()) { return extensionFunctionCall(); } return methodCall(); } + @NotNull + private JsExpression extensionFunctionLiteralCall() { + + List callArguments = new ArrayList(); + assert receiver != null; + callArguments.add(thisObject()); + callArguments.addAll(arguments); + receiver = null; + JsNameRef callMethodNameRef = AstUtil.newQualifiedNameRef("call"); + JsInvocation callMethodInvocation = new JsInvocation(); + callMethodInvocation.setQualifier(callMethodNameRef); + AstUtil.setQualifier(callMethodInvocation, calleeReference()); + callMethodInvocation.setArguments(callArguments); + return callMethodInvocation; + } + + private boolean isExtensionFunctionLiteral() { + boolean isLiteral = descriptor instanceof VariableAsFunctionDescriptor + || descriptor instanceof ExpressionAsFunctionDescriptor; + return isExtensionFunction() && isLiteral; + } + @NotNull private JsExpression extensionFunctionCall() { receiver = getExtensionFunctionCallReceiver(); @@ -257,8 +282,10 @@ public final class CallTranslator extends AbstractTranslator { return getThisObject(context(), expectedReceiverDescriptor); } + @SuppressWarnings("UnnecessaryLocalVariable") private boolean isExtensionFunction() { - return resolvedCall.getReceiverArgument().exists(); + boolean hasReceiver = resolvedCall.getReceiverArgument().exists(); + return hasReceiver; } @NotNull diff --git a/translator/src/org/jetbrains/k2js/utils/JetFileUtils.java b/translator/src/org/jetbrains/k2js/utils/JetFileUtils.java index 119592566fb..e06a7e9e177 100644 --- a/translator/src/org/jetbrains/k2js/utils/JetFileUtils.java +++ b/translator/src/org/jetbrains/k2js/utils/JetFileUtils.java @@ -1,5 +1,6 @@ package org.jetbrains.k2js.utils; +import com.intellij.openapi.Disposable; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; @@ -10,6 +11,7 @@ import com.intellij.psi.impl.PsiFileFactoryImpl; import com.intellij.testFramework.LightVirtualFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.compiler.JetCoreEnvironment; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.plugin.JetLanguage; @@ -21,13 +23,13 @@ import java.io.IOException; */ public final class JetFileUtils { -// @NotNull -// private static JetCoreEnvironment testOnlyEnvironment = new JetCoreEnvironment(new Disposable() { -// -// @Override -// public void dispose() { -// } -// }); + @NotNull + private static JetCoreEnvironment testOnlyEnvironment = new JetCoreEnvironment(new Disposable() { + + @Override + public void dispose() { + } + }); @NotNull public static String loadFile(@NotNull String path) throws IOException { @@ -63,7 +65,8 @@ public final class JetFileUtils { virtualFile.setCharset(CharsetToolkit.UTF8_CHARSET); Project realProject = project; if (realProject == null) { - throw new RuntimeException(); + realProject = testOnlyEnvironment.getProject(); + //throw new RuntimeException(); } PsiFile result = ((PsiFileFactoryImpl) PsiFileFactory.getInstance(realProject)) .trySetupPsiForFile(virtualFile, JetLanguage.INSTANCE, true, false); diff --git a/translator/testFiles/kotlin_lib.js b/translator/testFiles/kotlin_lib.js index 2eff88d9e44..242b721c62b 100644 --- a/translator/testFiles/kotlin_lib.js +++ b/translator/testFiles/kotlin_lib.js @@ -902,6 +902,9 @@ Kotlin.StringBuilder = Kotlin.Class.create( } ); +Kotlin.toString = function(obj) { + return obj.toString(); +}; /** * Copyright 2010 Tim Down.