From b377e74a238dc41cf130b56f3d1690d80fb6a632 Mon Sep 17 00:00:00 2001 From: Pavel Talanov Date: Mon, 30 Jan 2012 17:45:01 +0400 Subject: [PATCH] supported NativeClass() and NativeFun(String) annotations --- .idea/workspace.xml | 428 ++++++++++-------- jslib/src/jquery/common.kt | 22 +- .../AbstractDeclarationVisitor.java | 4 +- ...ationsUtils.java => AnnotationsUtils.java} | 50 +- .../declaration/DeclarationFacade.java | 8 +- .../declaration/KotlinDeclarationVisitor.java | 4 +- .../declaration/NativeDeclarationVisitor.java | 26 +- .../k2js/translate/general/Translation.java | 1 - 8 files changed, 331 insertions(+), 212 deletions(-) rename translator/src/org/jetbrains/k2js/translate/context/declaration/{JsAnnotationsUtils.java => AnnotationsUtils.java} (59%) 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 @@ + + + + - + - - + + - - - - - - - - - - - - + @@ -140,24 +149,20 @@ - - + + - - - - + + - - + + - - - - + + @@ -165,27 +170,16 @@ - + - - + + - - - - - - - - - - - - + @@ -196,25 +190,47 @@ - + - - + + - + - - + + - + + + + + + + + + + + + + + + + + + + + + + + @@ -339,21 +355,21 @@ @@ -719,6 +735,52 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -912,6 +912,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -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(); }