diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index da115c70986..5ef0054af61 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -13,9 +13,14 @@
+
-
+
+
+
+
+
@@ -59,6 +64,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -115,24 +135,13 @@
-
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -140,24 +149,20 @@
-
-
+
+
-
-
-
-
+
+
-
-
+
+
-
-
-
-
+
+
@@ -165,27 +170,16 @@
-
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -196,25 +190,47 @@
-
+
-
-
+
+
-
+
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -339,21 +355,21 @@
@@ -719,6 +735,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -762,68 +824,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -912,6 +912,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1098,11 +1164,11 @@
-
-
-
-
-
+
+
+
+
+
localhost
@@ -1191,9 +1257,9 @@
+
-
@@ -1238,7 +1304,7 @@
-
+
@@ -1251,7 +1317,6 @@
-
@@ -1276,6 +1341,7 @@
+
@@ -1285,124 +1351,122 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
+
+
-
+
-
-
-
-
-
-
-
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
-
+
-
+
-
+
-
+
diff --git a/jslib/src/jquery/common.kt b/jslib/src/jquery/common.kt
index b6df65d752a..07913e69e55 100644
--- a/jslib/src/jquery/common.kt
+++ b/jslib/src/jquery/common.kt
@@ -4,8 +4,10 @@ import js.annotations.*;
fun JQuery.toString() = ""
-JavascriptNativeClass class JQuery() {
+NativeClass
+class JQuery() {
fun addClass(className : String) : JQuery = this;
+ fun addClass(f : DomElement.(Int, String)->String) = this;
fun attr(attrName : String) = ""
fun attr(attrName : String, value : String) = this
fun hasClass(className : String) = true
@@ -29,9 +31,15 @@ open class DomElement() {
//val document = object : DomElement() {}
-JavascriptNativeFunction("$") fun jq(selector : String) = JQuery();
-JavascriptNativeFunction("$") fun jq(selector : String, context : DomElement) = JQuery();
-JavascriptNativeFunction("$") fun jq(callback : () -> Unit) = JQuery();
-JavascriptNativeFunction("$") fun jq(obj : JQuery) = JQuery();
-JavascriptNativeFunction("$") fun jq(el : DomElement) = JQuery();
-JavascriptNativeFunction("$") fun jq() = JQuery();
+NativeFun("$")
+fun jq(selector : String) = JQuery();
+NativeFun("$")
+fun jq(selector : String, context : DomElement) = JQuery();
+NativeFun("$")
+fun jq(callback : () -> Unit) = JQuery();
+NativeFun("$")
+fun jq(obj : JQuery) = JQuery();
+NativeFun("$")
+fun jq(el : DomElement) = JQuery();
+NativeFun("$")
+fun jq() = JQuery();
diff --git a/translator/src/org/jetbrains/k2js/translate/context/declaration/AbstractDeclarationVisitor.java b/translator/src/org/jetbrains/k2js/translate/context/declaration/AbstractDeclarationVisitor.java
index 7730ef3ab91..536594ac789 100644
--- a/translator/src/org/jetbrains/k2js/translate/context/declaration/AbstractDeclarationVisitor.java
+++ b/translator/src/org/jetbrains/k2js/translate/context/declaration/AbstractDeclarationVisitor.java
@@ -161,7 +161,7 @@ public abstract class AbstractDeclarationVisitor extends DeclarationDescriptorVi
return null;
}
- public void traverseNamespace(NamespaceDescriptor descriptor, DeclarationContext context) {
+ public void traverseNamespace(@NotNull NamespaceDescriptor descriptor, @NotNull DeclarationContext context) {
if (!accept(descriptor)) {
return;
}
@@ -178,7 +178,7 @@ public abstract class AbstractDeclarationVisitor extends DeclarationDescriptorVi
return context.innerDeclaration(namespaceScope, namespaceName);
}
- private void declareMembers(@NotNull NamespaceDescriptor descriptor, @NotNull DeclarationContext context) {
+ protected void declareMembers(@NotNull NamespaceDescriptor descriptor, @NotNull DeclarationContext context) {
for (DeclarationDescriptor memberDescriptor :
descriptor.getMemberScope().getAllDescriptors()) {
memberDescriptor.accept(this, context);
diff --git a/translator/src/org/jetbrains/k2js/translate/context/declaration/JsAnnotationsUtils.java b/translator/src/org/jetbrains/k2js/translate/context/declaration/AnnotationsUtils.java
similarity index 59%
rename from translator/src/org/jetbrains/k2js/translate/context/declaration/JsAnnotationsUtils.java
rename to translator/src/org/jetbrains/k2js/translate/context/declaration/AnnotationsUtils.java
index 8e5f8dbf6f4..3db71a0252c 100644
--- a/translator/src/org/jetbrains/k2js/translate/context/declaration/JsAnnotationsUtils.java
+++ b/translator/src/org/jetbrains/k2js/translate/context/declaration/AnnotationsUtils.java
@@ -11,13 +11,29 @@ import org.jetbrains.jet.lang.resolve.DescriptorUtils;
/**
* @author Pavel Talanov
*/
-public final class JsAnnotationsUtils {
+public final class AnnotationsUtils {
- private JsAnnotationsUtils() {
+ @NotNull
+ private static final String NATIVE_FUNCTION_ANNOTATION_FQNAME = "js.annotations.NativeFun";
+ @NotNull
+ private static final String NATIVE_CLASS_ANNOTATION_FQNAME = "js.annotations.NativeClass";
+
+ private AnnotationsUtils() {
}
@NotNull
- public static String getNativeName(@NotNull FunctionDescriptor descriptor) {
+ public static String getNativeName(@NotNull DeclarationDescriptor descriptor) {
+ if (descriptor instanceof FunctionDescriptor) {
+ return getNativeNameForFunction((FunctionDescriptor) descriptor);
+ }
+ if (descriptor instanceof ClassDescriptor) {
+ return getNativeNameForClass((ClassDescriptor) descriptor);
+ }
+ throw new AssertionError("Use isNativeDeclaration to check");
+ }
+
+ @NotNull
+ private static String getNativeNameForFunction(@NotNull FunctionDescriptor descriptor) {
if (hasNativeFunctionAnnotation(descriptor)) {
return getNativeFunctionName(descriptor);
}
@@ -27,6 +43,19 @@ public final class JsAnnotationsUtils {
throw new AssertionError("Use isNativeFunction to check");
}
+ @NotNull
+ private static String getNativeNameForClass(@NotNull ClassDescriptor descriptor) {
+ if (hasNativeClassAnnotation(descriptor)) {
+ return descriptor.getName();
+ }
+ throw new AssertionError("Use isNativeClass to check");
+ }
+
+ public static boolean isNativeDeclaration(@NotNull DeclarationDescriptor descriptor) {
+ return hasNativeClassAnnotation(descriptor) || hasNativeFunctionAnnotation(descriptor)
+ || declaredInNativeClass(descriptor);
+ }
+
public static boolean isNativeFunction(@NotNull FunctionDescriptor functionDescriptor) {
return hasNativeFunctionAnnotation(functionDescriptor) || declaredInNativeClass(functionDescriptor);
}
@@ -38,21 +67,22 @@ public final class JsAnnotationsUtils {
private static boolean declaredInNativeClass(@NotNull DeclarationDescriptor descriptor) {
DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration();
if (!(containingDeclaration instanceof ClassDescriptor)) return false;
- return hasNativeClassAnnotation((ClassDescriptor) containingDeclaration);
+ return hasNativeClassAnnotation(containingDeclaration);
}
- private static boolean hasNativeFunctionAnnotation(@NotNull FunctionDescriptor annotationDescriptor) {
- return (getAnnotationByName(annotationDescriptor, "js.annotations.JavascriptNativeFunction") != null);
+ //TODO: constants
+ private static boolean hasNativeFunctionAnnotation(@NotNull DeclarationDescriptor descriptor) {
+ return (getAnnotationByName(descriptor, NATIVE_FUNCTION_ANNOTATION_FQNAME) != null);
}
- private static boolean hasNativeClassAnnotation(@NotNull ClassDescriptor descriptor) {
- return (getAnnotationByName(descriptor, "JavascriptNativeClass") != null);
+ private static boolean hasNativeClassAnnotation(@NotNull DeclarationDescriptor descriptor) {
+ return (getAnnotationByName(descriptor, NATIVE_CLASS_ANNOTATION_FQNAME) != null);
}
@NotNull
- private static String getNativeFunctionName(@NotNull DeclarationDescriptor declarationDescriptor) {
+ private static String getNativeFunctionName(@NotNull FunctionDescriptor declarationDescriptor) {
AnnotationDescriptor annotationDescriptor =
- getAnnotationByName(declarationDescriptor, "js.annotations.JavascriptNativeFunction");
+ getAnnotationByName(declarationDescriptor, NATIVE_FUNCTION_ANNOTATION_FQNAME);
assert annotationDescriptor != null;
Object value = annotationDescriptor.getValueArguments().iterator().next().getValue();
assert value instanceof String : "Native function annotation should have one String parameter";
diff --git a/translator/src/org/jetbrains/k2js/translate/context/declaration/DeclarationFacade.java b/translator/src/org/jetbrains/k2js/translate/context/declaration/DeclarationFacade.java
index d14ba95af89..5aeb7a1b8df 100644
--- a/translator/src/org/jetbrains/k2js/translate/context/declaration/DeclarationFacade.java
+++ b/translator/src/org/jetbrains/k2js/translate/context/declaration/DeclarationFacade.java
@@ -78,8 +78,12 @@ public final class DeclarationFacade {
//TODO: decide if is public
public void extractDeclarationsFromNamespace(@NotNull NamespaceDescriptor descriptor,
@Nullable JsNameRef namespaceQualifier) {
- KotlinDeclarationVisitor visitor = new KotlinDeclarationVisitor(kotlinDeclarations, true);
- visitor.traverseNamespace(descriptor, DeclarationContext.rootContext(rootScope, namespaceQualifier));
+ KotlinDeclarationVisitor kotlinDeclarationVisitor = new KotlinDeclarationVisitor(kotlinDeclarations, true);
+ kotlinDeclarationVisitor.traverseNamespace
+ (descriptor, DeclarationContext.rootContext(rootScope, namespaceQualifier));
+ NativeDeclarationVisitor nativeDeclarationVisitor = new NativeDeclarationVisitor(nativeDeclarations);
+ nativeDeclarationVisitor.traverseNamespace
+ (descriptor, DeclarationContext.rootContext(rootScope, null));
}
public void extractDeclarationsFromFiles(@NotNull List files, @NotNull BindingContext context) {
diff --git a/translator/src/org/jetbrains/k2js/translate/context/declaration/KotlinDeclarationVisitor.java b/translator/src/org/jetbrains/k2js/translate/context/declaration/KotlinDeclarationVisitor.java
index 3999bb45158..1aa74e0e79c 100644
--- a/translator/src/org/jetbrains/k2js/translate/context/declaration/KotlinDeclarationVisitor.java
+++ b/translator/src/org/jetbrains/k2js/translate/context/declaration/KotlinDeclarationVisitor.java
@@ -5,6 +5,8 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.k2js.translate.context.NamingScope;
+import static org.jetbrains.k2js.translate.context.declaration.AnnotationsUtils.isNativeDeclaration;
+
/**
* @author Pavel Talanov
*/
@@ -39,6 +41,6 @@ public final class KotlinDeclarationVisitor extends AbstractDeclarationVisitor {
@Override
protected boolean accept(@NotNull DeclarationDescriptor descriptor) {
- return true;
+ return (!isNativeDeclaration(descriptor));
}
}
diff --git a/translator/src/org/jetbrains/k2js/translate/context/declaration/NativeDeclarationVisitor.java b/translator/src/org/jetbrains/k2js/translate/context/declaration/NativeDeclarationVisitor.java
index b9d9d003491..4302260c8e4 100644
--- a/translator/src/org/jetbrains/k2js/translate/context/declaration/NativeDeclarationVisitor.java
+++ b/translator/src/org/jetbrains/k2js/translate/context/declaration/NativeDeclarationVisitor.java
@@ -8,6 +8,9 @@ import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.k2js.translate.context.NamingScope;
+import static org.jetbrains.k2js.translate.context.declaration.AnnotationsUtils.isNativeClass;
+import static org.jetbrains.k2js.translate.context.declaration.AnnotationsUtils.isNativeFunction;
+
/**
* @author Pavel Talanov
*/
@@ -21,16 +24,20 @@ public final class NativeDeclarationVisitor extends AbstractDeclarationVisitor {
@Override
protected NamingScope doDeclareScope(@NotNull DeclarationDescriptor descriptor, @NotNull DeclarationContext context,
@NotNull String recommendedName) {
- //TODO: probably we do
- /*we dont need to declare any scopes for native declarations*/
- return context.getScope();
+ //TODO: probably need to keep track
+ if (!(descriptor instanceof ClassDescriptor)) {
+ return context.getScope();
+ }
+ NamingScope innerScope = context.getScope().innerScope(recommendedName);
+ declarations().putScope(descriptor, innerScope);
+ return innerScope;
}
@NotNull
@Override
protected JsName doDeclareName(@NotNull DeclarationDescriptor descriptor, @NotNull DeclarationContext context,
@NotNull String recommendedName) {
- String nativeName = JsAnnotationsUtils.getNativeName((FunctionDescriptor) descriptor);
+ String nativeName = AnnotationsUtils.getNativeName(descriptor);
JsName jsName = context.getScope().
declareVariable(descriptor, nativeName, false);
jsName.setObfuscatable(false);
@@ -45,12 +52,17 @@ public final class NativeDeclarationVisitor extends AbstractDeclarationVisitor {
return true;
}
if (descriptor instanceof FunctionDescriptor) {
- return JsAnnotationsUtils.isNativeFunction((FunctionDescriptor) descriptor);
+ return isNativeFunction((FunctionDescriptor) descriptor);
}
if (descriptor instanceof ClassDescriptor) {
- return JsAnnotationsUtils.isNativeClass((ClassDescriptor) descriptor);
+ return isNativeClass((ClassDescriptor) descriptor);
}
- throw new AssertionError();
+ return false;
+ }
+
+ @Override
+ public void traverseNamespace(@NotNull NamespaceDescriptor namespace, @NotNull DeclarationContext context) {
+ declareMembers(namespace, context);
}
diff --git a/translator/src/org/jetbrains/k2js/translate/general/Translation.java b/translator/src/org/jetbrains/k2js/translate/general/Translation.java
index 9f354f7ada7..bfafa6ebccd 100644
--- a/translator/src/org/jetbrains/k2js/translate/general/Translation.java
+++ b/translator/src/org/jetbrains/k2js/translate/general/Translation.java
@@ -107,7 +107,6 @@ public final class Translation {
JsNamer namer = new JsPrettyNamer();
namer.exec(context.program());
-
return context.program();
}