implement multinamespace translation:

add tests
switch to using class descriptors in class declaration translator
This commit is contained in:
Pavel Talanov
2012-02-21 15:22:38 +04:00
parent a6879c0c76
commit 0b1287c103
16 changed files with 130 additions and 18 deletions
+2
View File
@@ -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
+4 -2
View File
@@ -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
+15
View File
@@ -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
+16
View File
@@ -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<Int>, newData : Array<Int>, width : Int, height : Int)->Unit) = js.noImpl
@@ -28,6 +28,7 @@ public abstract class Config {
private static final List<String> 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"
);
@@ -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<JetDeclaration> namespaceDeclarations;
private final List<ClassDescriptor> descriptors;
@NotNull
private final Map<JsName, JsName> localToGlobalClassName;
@NotNull
@@ -37,9 +36,10 @@ public final class ClassDeclarationTranslator extends AbstractTranslator {
@Nullable
private JsStatement declarationsStatement = null;
public ClassDeclarationTranslator(@NotNull TranslationContext context, @NotNull List<JetDeclaration> declarationList) {
public ClassDeclarationTranslator(@NotNull TranslationContext context,
@NotNull List<ClassDescriptor> descriptors) {
super(context);
this.namespaceDeclarations = declarationList;
this.descriptors = descriptors;
this.localToGlobalClassName = new HashMap<JsName, JsName>();
this.dummyFunctionScope = new JsScope(context().jsScope(), "class declaration function");
}
@@ -106,10 +106,8 @@ public final class ClassDeclarationTranslator extends AbstractTranslator {
@NotNull
private List<JetClass> getClassDeclarations() {
List<JetClass> classes = new ArrayList<JetClass>();
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);
@@ -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
* <p/>
* 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<JetDeclaration> namespaceDeclarations = getDeclarationsForNamespace(context.bindingContext(), namespace);
this.classDeclarationTranslator = new ClassDeclarationTranslator(context(), namespaceDeclarations);
this.classDeclarationTranslator = new ClassDeclarationTranslator(context(),
getAllClassesDefinedInNamespace(namespace));
}
@NotNull
@@ -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;
@@ -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) {
@@ -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
@@ -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<ClassDescriptor> getAllClassesDefinedInNamespace(@NotNull NamespaceDescriptor namespaceDescriptor) {
List<ClassDescriptor> classDescriptors = Lists.newArrayList();
for (DeclarationDescriptor descriptor : namespaceDescriptor.getMemberScope().getAllDescriptors()) {
if (descriptor instanceof ClassDescriptor) {
classDescriptors.add((ClassDescriptor) descriptor);
}
}
return classDescriptors;
}
}
@@ -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)
@@ -0,0 +1,7 @@
package bar
import foo.A
open class B() : A() {
override fun f() = 4
}
@@ -0,0 +1,3 @@
package bar
fun f() = 3;
@@ -0,0 +1,5 @@
package foo
import bar.*
fun box() = (f() == 3)
@@ -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);
}
}