diff --git a/jslib/src/core/math.kt b/jslib/src/core/math.kt index b3ad3e1c167..3566b782aa6 100644 --- a/jslib/src/core/math.kt +++ b/jslib/src/core/math.kt @@ -15,6 +15,8 @@ class MathClass() { fun sin(value : Double) = 0.0 fun exp(value : Double) = 0.0 fun max(vararg values : Double) = 0.0 + fun max(vararg values : Int) : Int = js.noImpl + fun min(vararg values : Int) : Int = js.noImpl fun min(vararg values : Double) = 0.0 fun sqrt(value : Double) = 0.0 fun tan(value : Double) = 0.0 diff --git a/jslib/src/jquery/common.kt b/jslib/src/jquery/common.kt index 856bf3e49fe..54ad3feb9dd 100644 --- a/jslib/src/jquery/common.kt +++ b/jslib/src/jquery/common.kt @@ -5,8 +5,8 @@ import js.DomElement native class JQuery() { - fun addClass(className : String) : JQuery = this; - fun addClass(f : DomElement.(Int, String)->String) = this; + fun addClass(className : String) : JQuery = js.noImpl; + fun addClass(f : DomElement.(Int, String)->String) = js.noImpl; fun attr(attrName : String) = ""; fun attr(attrName : String, value : String) = this; @@ -39,6 +39,8 @@ class JQuery() { fun slideUp() = this; fun hover(handlerInOut : DomElement.() -> Unit) = this; fun hover(handlerIn : DomElement.() -> Unit, handlerOut : DomElement.() -> Unit) = this; + fun next() : JQuery = js.noImpl + fun parent() : JQuery = js.noImpl } native diff --git a/jslib/src/jquery/ui.kt b/jslib/src/jquery/ui.kt new file mode 100644 index 00000000000..e9ca87be43a --- /dev/null +++ b/jslib/src/jquery/ui.kt @@ -0,0 +1,15 @@ +package jquery.ui + + +//jquery UI +import jquery.JQuery +import js.native + +native +fun JQuery.buttonset() : JQuery = js.noImpl; +native +fun JQuery.dialog() : JQuery = js.noImpl; +native +fun JQuery.button() : JQuery = js.noImpl; +native +fun JQuery.accordion() : JQuery = js.noImpl diff --git a/jslib/src/pixastic/pixastic.kt b/jslib/src/pixastic/pixastic.kt new file mode 100644 index 00000000000..b5b4d6d8a19 --- /dev/null +++ b/jslib/src/pixastic/pixastic.kt @@ -0,0 +1,16 @@ +package jquery.pixastic + +import jquery.JQuery +import js.native + +native +fun JQuery.pixastic(actionName : String) = js.noImpl + + +native +object Pixastic { +} + +native +fun addAction(actionName : String, + process : (oldData : Array, newData : Array, width : Int, height : Int)->Unit) = js.noImpl \ No newline at end of file diff --git a/translator/src/org/jetbrains/k2js/config/Config.java b/translator/src/org/jetbrains/k2js/config/Config.java index ecee2a73aca..00cd8a790e9 100644 --- a/translator/src/org/jetbrains/k2js/config/Config.java +++ b/translator/src/org/jetbrains/k2js/config/Config.java @@ -28,6 +28,7 @@ public abstract class Config { private static final List LIB_FILE_NAMES = Arrays.asList( "/core/annotations.kt", "/jquery/common.kt", + "/jquery/ui.kt", "/core/javautil.kt", "/core/javalang.kt", "/core/core.kt", @@ -37,7 +38,8 @@ public abstract class Config { "/html5/canvas.kt", "/html5/files.kt", "/html5/image.kt", - "/helper/ip.kt" + "/helper/ip.kt", + "/pixastic/pixastic.kt" ); diff --git a/translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java b/translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java index eff36cabf93..48ef6267a3b 100644 --- a/translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java @@ -6,7 +6,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.psi.JetClass; -import org.jetbrains.jet.lang.psi.JetDeclaration; import org.jetbrains.k2js.translate.context.Namer; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.general.AbstractTranslator; @@ -27,7 +26,7 @@ import java.util.Map; public final class ClassDeclarationTranslator extends AbstractTranslator { @NotNull - private final List namespaceDeclarations; + private final List descriptors; @NotNull private final Map localToGlobalClassName; @NotNull @@ -37,9 +36,10 @@ public final class ClassDeclarationTranslator extends AbstractTranslator { @Nullable private JsStatement declarationsStatement = null; - public ClassDeclarationTranslator(@NotNull TranslationContext context, @NotNull List declarationList) { + public ClassDeclarationTranslator(@NotNull TranslationContext context, + @NotNull List descriptors) { super(context); - this.namespaceDeclarations = declarationList; + this.descriptors = descriptors; this.localToGlobalClassName = new HashMap(); this.dummyFunctionScope = new JsScope(context().jsScope(), "class declaration function"); } @@ -106,10 +106,8 @@ public final class ClassDeclarationTranslator extends AbstractTranslator { @NotNull private List getClassDeclarations() { List classes = new ArrayList(); - for (JetDeclaration declaration : namespaceDeclarations) { - if (declaration instanceof JetClass) { - classes.add((JetClass) declaration); - } + for (ClassDescriptor classDescriptor : descriptors) { + classes.add(BindingUtils.getClassForDescriptor(context().bindingContext(), classDescriptor)); } return ClassSorter.sortUsingInheritanceOrder(classes, context().bindingContext()); } @@ -125,7 +123,7 @@ public final class ClassDeclarationTranslator extends AbstractTranslator { @NotNull private JsName generateLocalAlias(@NotNull JetClass declaration) { JsName globalClassName = context().getNameForElement(declaration); - JsName localAlias = dummyFunctionScope.declareName(globalClassName.getIdent()); + JsName localAlias = dummyFunctionScope.declareTemporary(); localToGlobalClassName.put(localAlias, globalClassName); ClassDescriptor descriptor = BindingUtils.getClassDescriptor(context().bindingContext(), declaration); context().aliaser().setAliasForDescriptor(descriptor, localAlias); diff --git a/translator/src/org/jetbrains/k2js/translate/declaration/NamespaceTranslator.java b/translator/src/org/jetbrains/k2js/translate/declaration/NamespaceTranslator.java index f1133ea17b7..9ae582da959 100644 --- a/translator/src/org/jetbrains/k2js/translate/declaration/NamespaceTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/declaration/NamespaceTranslator.java @@ -4,7 +4,6 @@ import com.google.dart.compiler.backend.js.ast.*; import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; -import org.jetbrains.jet.lang.psi.JetDeclaration; import org.jetbrains.k2js.translate.context.Namer; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.general.AbstractTranslator; @@ -13,12 +12,12 @@ import org.jetbrains.k2js.translate.general.Translation; import java.util.ArrayList; import java.util.List; -import static org.jetbrains.k2js.translate.utils.BindingUtils.getDeclarationsForNamespace; +import static org.jetbrains.k2js.translate.utils.DescriptorUtils.getAllClassesDefinedInNamespace; /** * @author Pavel.Talanov *

- * Translates single namespace. + * Genereate code for a single namespace. */ public final class NamespaceTranslator extends AbstractTranslator { @@ -38,8 +37,8 @@ public final class NamespaceTranslator extends AbstractTranslator { super(context.newDeclaration(namespace)); this.namespace = namespace; this.namespaceName = context.getNameForDescriptor(namespace); - List namespaceDeclarations = getDeclarationsForNamespace(context.bindingContext(), namespace); - this.classDeclarationTranslator = new ClassDeclarationTranslator(context(), namespaceDeclarations); + this.classDeclarationTranslator = new ClassDeclarationTranslator(context(), + getAllClassesDefinedInNamespace(namespace)); } @NotNull diff --git a/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java index df28e271329..90f24426281 100644 --- a/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java @@ -14,6 +14,7 @@ import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.general.AbstractTranslator; import org.jetbrains.k2js.translate.intrinsic.FunctionIntrinsic; +import org.jetbrains.k2js.translate.utils.AnnotationsUtils; import org.jetbrains.k2js.translate.utils.TranslationUtils; import java.util.ArrayList; @@ -77,12 +78,16 @@ public final class CallTranslator extends AbstractTranslator { @NotNull /*package*/ JsExpression translate() { + //NOTE: treat native extension function calls as usual calls if (isIntrinsic()) { return intrinsicInvocation(); } if (isConstructor()) { return constructorCall(); } + if (isNative()) { + return methodCall(); + } if (isExtensionFunctionLiteral()) { return extensionFunctionLiteralCall(); } @@ -92,7 +97,6 @@ public final class CallTranslator extends AbstractTranslator { return methodCall(); } - private boolean isIntrinsic() { return context().intrinsics().isIntrinsic(descriptor); } @@ -123,6 +127,10 @@ public final class CallTranslator extends AbstractTranslator { return ReferenceTranslator.translateAsFQReference(descriptor, context()); } + private boolean isNative() { + return AnnotationsUtils.isNativeObject(descriptor); + } + private boolean isExtensionFunctionLiteral() { boolean isLiteral = descriptor instanceof VariableAsFunctionDescriptor || descriptor instanceof ExpressionAsFunctionDescriptor; diff --git a/translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java b/translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java index 96eac0c255f..21e57fa974c 100644 --- a/translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java +++ b/translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java @@ -59,6 +59,7 @@ public final class BindingUtils { return getDescriptorForExpression(context, declaration, FunctionDescriptor.class); } + //TODO: @NotNull public static PropertyAccessorDescriptor getPropertyAccessorDescriptor(@NotNull BindingContext context, @NotNull JetPropertyAccessor declaration) { diff --git a/translator/src/org/jetbrains/k2js/translate/utils/ClassSorter.java b/translator/src/org/jetbrains/k2js/translate/utils/ClassSorter.java index 9bd80bf97c0..11f51db1b62 100644 --- a/translator/src/org/jetbrains/k2js/translate/utils/ClassSorter.java +++ b/translator/src/org/jetbrains/k2js/translate/utils/ClassSorter.java @@ -14,6 +14,7 @@ import static org.jetbrains.k2js.translate.utils.DescriptorUtils.getSuperclassDe //TODO: can optimise using less dumb implementation +//TODO: pass list of descriptors here, not the list of jet classes /** * @author Pavel Talanov diff --git a/translator/src/org/jetbrains/k2js/translate/utils/DescriptorUtils.java b/translator/src/org/jetbrains/k2js/translate/utils/DescriptorUtils.java index a055c6a38c1..2e2d2184cd8 100644 --- a/translator/src/org/jetbrains/k2js/translate/utils/DescriptorUtils.java +++ b/translator/src/org/jetbrains/k2js/translate/utils/DescriptorUtils.java @@ -1,5 +1,6 @@ package org.jetbrains.k2js.translate.utils; +import com.google.common.collect.Lists; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; @@ -187,4 +188,16 @@ public final class DescriptorUtils { return null; } + @NotNull + public static List getAllClassesDefinedInNamespace(@NotNull NamespaceDescriptor namespaceDescriptor) { + List classDescriptors = Lists.newArrayList(); + for (DeclarationDescriptor descriptor : namespaceDescriptor.getMemberScope().getAllDescriptors()) { + if (descriptor instanceof ClassDescriptor) { + classDescriptors.add((ClassDescriptor) descriptor); + } + } + return classDescriptors; + } + + } diff --git a/translator/testFiles/multiNamespace/cases/classesInheritedFromOtherNamespace/a.kt b/translator/testFiles/multiNamespace/cases/classesInheritedFromOtherNamespace/a.kt new file mode 100644 index 00000000000..d75b0fc650c --- /dev/null +++ b/translator/testFiles/multiNamespace/cases/classesInheritedFromOtherNamespace/a.kt @@ -0,0 +1,13 @@ +package foo + +import bar.* + +open class A() { + open fun f() = 3; +} + +open class C() : B() { + override fun f() = 5 +} + +fun box() = (A().f() == 3) && (B().f() == 4) && (C().f() == 5) \ No newline at end of file diff --git a/translator/testFiles/multiNamespace/cases/classesInheritedFromOtherNamespace/b.kt b/translator/testFiles/multiNamespace/cases/classesInheritedFromOtherNamespace/b.kt new file mode 100644 index 00000000000..17df2512c83 --- /dev/null +++ b/translator/testFiles/multiNamespace/cases/classesInheritedFromOtherNamespace/b.kt @@ -0,0 +1,7 @@ +package bar + +import foo.A + +open class B() : A() { + override fun f() = 4 +} \ No newline at end of file diff --git a/translator/testFiles/multiNamespace/cases/functionsVisibleFromOtherNamespace/a.kt b/translator/testFiles/multiNamespace/cases/functionsVisibleFromOtherNamespace/a.kt new file mode 100644 index 00000000000..bc9c42639ca --- /dev/null +++ b/translator/testFiles/multiNamespace/cases/functionsVisibleFromOtherNamespace/a.kt @@ -0,0 +1,3 @@ +package bar + +fun f() = 3; \ No newline at end of file diff --git a/translator/testFiles/multiNamespace/cases/functionsVisibleFromOtherNamespace/b.kt b/translator/testFiles/multiNamespace/cases/functionsVisibleFromOtherNamespace/b.kt new file mode 100644 index 00000000000..53743f9f3c7 --- /dev/null +++ b/translator/testFiles/multiNamespace/cases/functionsVisibleFromOtherNamespace/b.kt @@ -0,0 +1,5 @@ +package foo + +import bar.* + +fun box() = (f() == 3) \ No newline at end of file diff --git a/translatorTests/test/org/jetbrains/k2js/test/MultiNamespaceTest.java b/translatorTests/test/org/jetbrains/k2js/test/MultiNamespaceTest.java new file mode 100644 index 00000000000..3b2ff745fce --- /dev/null +++ b/translatorTests/test/org/jetbrains/k2js/test/MultiNamespaceTest.java @@ -0,0 +1,27 @@ +package org.jetbrains.k2js.test; + +/** + * @author Pavel Talanov + */ +public class MultiNamespaceTest extends TranslationTest { + final private static String MAIN = "multiNamespace/"; + + @Override + protected String mainDirectory() { + return MAIN; + } + + public void testFunctionsVisibleFromOtherNamespace() throws Exception { + testFooBoxIsTrue("functionsVisibleFromOtherNamespace"); + } + + public void testClassesInheritedFromOtherNamespace() throws Exception { + testFooBoxIsTrue("classesInheritedFromOtherNamespace"); + } + + @Override + public void testFooBoxIsTrue(String dirName) throws Exception { + testMultiFile(dirName, "foo", "box", true); + } +} +